画像アップロードエラー:バケットがACLを許可していません

ユーザーも管理者も画像をアップロードできなくなりました。
エラーログには「hotlink error」と表示されています。
制限は4MBですが、ユーザーからの苦情を受けてテスト用に800KBのファイルをアップロードしてみました。

数日前に最近のアップデート(2.9.0.beta4)を行いました。
最近S3バケットを設定しました。

15日前のGitHubでhotlinkに関する修正を見つけました。
GitHubでイシューを作成できません。バグ報告はここで行うべきでしょうか?

Message (2 copies reported)

default: Failed to pull hotlinked image (https://jackrail.space/images/discourse-logo-sketch-small.png) post: 586
The bucket does not allow ACLs
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/plugins/dualstack.rb:36:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/plugins/accelerate.rb:50:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/seahorse/client/plugins/request_callback.rb:71:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.121.2/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/client.rb:11274:in `put_object'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.96.1/lib/aws-sdk-s3/object.rb:1329:in `put'
/var/www/discourse/lib/s3_helper.rb:74:in `upload'
/var/www/discourse/lib/file_store/s3_store.rb:116:in `store_file'
/var/www/discourse/lib/file_store/s3_store.rb:30:in `store_upload'
/var/www/discourse/lib/upload_creator.rb:212:in `block (2 levels) in cr...

Backtrace

/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:243:in `public_send'
/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:243:in `log'
/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:58:in `rescue in block in execute'
/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:35:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.4-x86_64-linux/lib/nokogiri/xml/node_set.rb:234:in `block in each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.4-x86_64-linux/lib/nokogiri/xml/node_set.rb:233:in `upto'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.4-x86_64-linux/lib/nokogiri/xml/node_set.rb:233:in `each'
/var/www/discourse/app/jobs/regular/pull_hotlinked_images.rb:34:in `execute'
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'

修正したと思いますが、この機能が何をするのか、S3バックアップが無効になるのかどうかはわかりません。
「S3アップロードを有効にする」
これをバックアップ手順の一部だと思って有効にしました。
これを無効にしたところ、テスト画像をアップロードしてもこのエラーは発生しなくなりました。

その設定では、アップロードはS3バケットに保存され、アップロードとは別になります。そのバケットがアップロード用に正しくコード化されていないようです(情報はアップロードにオブジェクトストレージを使用する(S3およびクローン)を参照してください)。

それでも、バックアップが機能しているか確認する必要があります。

「いいね!」 1

ユーザーが報告した問題は解決したようです。

この画像アップロード機能が何をするのかはよくわかりませんが、複雑なサーバーに必要な追加機能なのでしょう。おそらく、我々の40人のユーザーにはこの複雑な機能を持つディスコースは必要ないでしょう。絵文字リアクションの方が重要です。

しかし、S3の説明に従った際、設定項目に表示された順序通りに行ったため、アップロード用とは別に「バックアップ」用の新しいバケットを作成し直す必要がありました。他の人がより簡単に設定できるよう、S3の説明に追記しようと思います。また、ヘルプのスレッドに記載されていた権限ポリシーが存在せず、別のウェブサイトで見つけた「*」で解決しました。そのスレッドでこの点を明確にしようと思います。説明通りにはいかず、説明の修正が必要でした。

以下の操作ではうまくいきませんでした。「*」を使用しました。

"Action": [
           "s3:ListAllMyBuckets",
           "s3:HeadBucket"
       ],

設定と説明に従うために参照したスレッドはこちらです:https://meta.discourse.org/t/setting-up-file-and-image-uploads-to-s3/7229

そこでもS3アップロードの有効化にチェックが入っています。平均的なユーザーには複雑すぎるようです。
一方で、バックアップがこれなしで正常に機能していることを願っています。

なぜ*を代わりに使ったのですか?

Googleで検索して見つけたものです。コードを受け付けるようにするためです。引用されている私の投稿を見ると、リンクを提供しました。ほとんどの場合、Googleで検索してコピー&ペーストしています。:slight_smile:
しかし、後で画像アップロードがバックアップを機能させるために必要ないことに気づきました。なぜそれを使用するのか、私はまだ知りません。バケットは2つ必要ありません。バックアップだけで十分です。アップロードエラーがまだ発生し、ユーザーが画像を許可していなかったため、設定でその部分のチェックを外しました。その項目をチェックしなかったことで修正されました。私たちは小規模なサーバーグループなので、しばらくは問題ないはずです。