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オブジェクトストレージ」を選択します。
  2. R2の概要ページの右側にある「manage R2 API tokens」をクリックします。
  3. 「create API token」をクリックします。
  4. 権限を「object read & write」に設定し、「save」をクリックします。
  5. 「access key id」と「secret access key」が出力されます。これらをDiscourseのS3設定に入力する必要があります。

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

ありがとう。それが問題だったことが判明しました…余計に混乱させただけですが、それはCloudflareのせいでしょう

そうだね、Cloudflareのダッシュボードは設定がごちゃごちゃしちゃうよね(笑)。直ってよかったです!