S3(Cloudflare R2)へのアップロードができません

サイト上で R2 のセットアップをいくつかのガイドに従って行っていたのですが、ファイルをアップロードしようとすると、ただ「申し訳ありませんが、アップロードに失敗しました。もう一度お試しください。」という一般的なメッセージが表示されるだけです。ログには以下の内容しか表示されません:

app.yml ファイルに URL を設定しました。なぜなら、ウェブ UI がガイドの投稿に記載されている形式の URL を「無効な形式」として拒否していたからです:

image

CDN_URL は Cloudflare で設定したカスタムドメインであり、S3_ENDPOINT はウェブパネルに表示されている URL です。正しく生成された認証トークンを含め、すべてのオプションを適切に設定しています:

Cloudflare 側ではいくつかのリクエストが検出されているようですが、何も保存されていないようです。

何が問題なのでしょうか?

ねえ、

S3 CDN URL と S3 エンドポイントの末尾のスラッシュ(/)が原因ではないのでしょうか?

これらはあなたが参考にしたガイドですか?アップロード用バケットの名前は「discourse」で間違いないですか?

はい、最初のガイドに従いました。

はい、そうです。

スラッシュを削除して試してみます。その後、結果を報告します。

末尾のスラッシュを削除しましたが、まだ解決しません。同じ Unauthorized エラーが表示されます。

トークンも正しく設定されています。

Cloudflare R2 トークンに読み取り/書き込み権限が確実に付与され、CORS ポリシーが正しく設定されていますか?あなたのサーバー構成は少し独特のようです。Cloudflare のバケット権限と設定は、権限エラーが発生しないよう、正確に設定されている必要があります。

間違ったタイプのトークンを作成してしまいましたね。現在は汎用 API トークンになっています。R2 バケット用のトークンを作成する必要があります。

  1. Cloudflare ダッシュボードにアクセスし、左側のサイドバーにある storage & databases(ストレージ&データベース)セクションから R2 object storage(R2 オブジェクトストレージ)を選択します。
  2. R2 概要ページの右側にある manage(管理)(API トークン)をクリックします。
  3. create account API token(アカウント API トークンの作成)をクリックします。
  4. 適切なトークン名を入力し、権限を object read & write(オブジェクトの読み取りと書き込み)に設定してから save(保存)をクリックします。
  5. access key id(アクセスキーID)と secret access key(シークレットアクセスキー)が出力されます。これらを Discourse の S3 設定に入力する必要があります。

また、末尾のスラッシュは削除する必要があります。Discourse がそれらを拒否する可能性があるためです。

ありがとう、それが原因だったようだ。余計に混乱を招くだけだったけど、これはCloudflareのせいだね。

ああ、Cloudflareのダッシュボードの設定はまるでスズメバチの巣のようですね(笑)。問題が解決してよかったです!