S3ストレージ有効でアバターアップロード不可(ファイル存在でも失敗)

皆さん、こんにちは。

Discourse と S3 ストレージで奇妙な問題が発生しています。

アバターをアップロードすると、ファイルが S3 バケットに存在し、有効な s3_cdn_url を介してアクセスできるにもかかわらず、以下のようなエラーが発生します。

投稿や添付ファイルのアップロードは問題なく機能します。失敗するのはユーザーアバターのアップロードのみです。


:fire: gig.ovh/logs からのエラーメッセージ

Message (2 copies reported)

Could not find file in the store located at url: //gig.s3.ru-1.storage.selcloud.ru/original/1X/fd42dfa3362b66090450f2ae40f0917193fcd355.jpeg

Backtrace

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active\ _support/broadcast\ _logger.rb:134:in `block in error'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active\ _support/broadcast\ _logger.rb:134:in `error'
/var/www/discourse/app/models/optimized_image.rb:91:in `block in create\ _for'
/var/www/discourse/app/models/optimized\ _image.rb:19:in `block (2 levels) in lock'
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize'
/var/www/discourse/lib/distributed\ _mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed\ _mutex.rb:34:in `synchronize'
/var/www/discourse/app/models/optimized_image.rb:19:in `lock'
/var/www/discourse/lib/distributed\ _mutex.rb:53:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed\ _mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize'
/var/www/discourse/app/models/optimized\ _image.rb:18:in `lock'
/var/www/discourse/app/models/optimized_image.rb:83:in `create\ _for'
/var/www/discourse/app/models/upload.rb:151:in `get_optimized_image'
/var/www/discourse/app/controllers/user_avatars_controller.rb:219:in `get\ _optimized_image'
/var/www/discourse/app/controllers/user\ _avatars_controller.rb:137:in `show_in_site'
/var/www/discourse/app/controllers/user_avatars_controller.rb:90:in `block (2 levels) in show'
/var/www/discourse/lib/hijack.rb:68:in `instance_eval'
/var/www/discourse/lib/hijack.rb:68:in `block (2 levels) in hijack'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/i18n-1.14.7/lib/i18n.rb:353:in `with_locale'
/var/www/discourse/lib/hijack.rb:68:in `block in hijack'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:911:in `callback_on_resolution'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:797:in `call\ _callback'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:803:in `call_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:692:in `resolve\ _with'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1325:in `resolve'
/var/www/discourse/lib/scheduler/defer.rb:125:in `block in do\ _work'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails\ _multisite-6.1.0/lib/rails\ _multisite/connection\ _management/null\ _instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with\ _connection'
/var/www/discourse/lib/scheduler/defer.rb:119:in `do_work'
/var/www/discourse/lib/scheduler/defer.rb:105:in `block (2 levels) in start\ _thread'

コンテナのS3 URLは次のとおりです。

//gig.s3.ru-1.storage.selcloud.ru/original/1X/fd42dfa3362b66090450f2ae40f0917193fcd355.jpeg

画像は次のURLで利用可能です。

https://s3.gig.ovh/original/1X/fd42dfa3362b66090450f2ae40f0917193fcd355.jpeg

:white_check_mark: 追加情報

  • Discourse バージョン: (最新の安定版)
  • 外部S3互換ストレージを使用 (enable_s3_uploads = true)
  • s3_cdn_url は正しく設定され、使用されています
  • CDN URL はファイルを正常に返します
  • ファイルは期待されるS3の場所に存在することが確認されています
  • その他のアップロード(画像、添付ファイルなど)は正常に機能します
  • エラーはユーザーアバターでのみ発生します

:red_question_mark:質問

正確なファイルが存在し、正しいCDN URLからアクセスできるにもかかわらず、Discourse がアバター処理のためにファイルを正常に取得できない原因は何でしょうか?

アバター処理(get_optimized_image など)に固有の設定ミスやキャッシュの問題があるのでしょうか?

何か提案や洞察があれば教えていただけると幸いです!

よろしくお願いします :folded_hands:

「いいね!」 1

こんにちは。この問題は解決しましたか?

Discourse + S3(アバターのみ)で全く同じ症状が発生しています。
Could not find file in the store located at url: //\u003cbucket\u003e.s3.dualstack.\u003cregion\u003e.amazonaws.com/original/1X/\u003chash\u003e.jpeg

私のセットアップに関するいくつかの詳細を以下に示します。あなたのものと一致するかもしれません。

  • enable_s3_uploads = true、オブジェクトは original/* および optimized/* に存在します(uploads/default プレフィックスはありません)。

  • CloudFront(OAC)経由でアクセス、バケット自体はプライベートです。

  • オブジェクトはそのキーに存在します。CDN URLは機能します。

  • エラーはアバター処理でのみ発生します。

  • (可能性のある問題)アップロードは SSE-KMS で暗号化されています。

根本原因または修正(ポリシー変更、KMS権限、バケットパスの整合性など)を見つけた場合は、何が機能したかを共有していただけますか?ありがとうございます!