サイト上で R2 のセットアップをいくつかのガイドに従って行っていたのですが、ファイルをアップロードしようとすると、ただ「申し訳ありませんが、アップロードに失敗しました。もう一度お試しください。」という一般的なメッセージが表示されるだけです。ログには以下の内容しか表示されません:
app.yml ファイルに URL を設定しました。なぜなら、ウェブ UI がガイドの投稿に記載されている形式の URL を「無効な形式」として拒否していたからです:

CDN_URL は Cloudflare で設定したカスタムドメインであり、S3_ENDPOINT はウェブパネルに表示されている URL です。正しく生成された認証トークンを含め、すべてのオプションを適切に設定しています:
Cloudflare 側ではいくつかのリクエストが検出されているようですが、何も保存されていないようです。
何が問題なのでしょうか?
ねえ、
S3 CDN URL と S3 エンドポイントの末尾のスラッシュ(/)が原因ではないのでしょうか?
Lilly
(Lillian )
3
はい、最初のガイドに従いました。
はい、そうです。
スラッシュを削除して試してみます。結果をお知らせします。
末尾のスラッシュを削除しましたが、まだうまくいきません。同じ Unauthorized エラーが表示されます。
トークンの設定も正しく行われています
Lilly
(Lillian )
6
Cloudflare R2のトークンに読み書きの権限があることは確実ですか?また、CORSポリシーは正しく設定されていますか?サーバー構成が少し特殊なことは承知していますが、Cloudflareバケットの権限と設定は完全に正確である必要があり、そうでないと権限エラーが発生します。
Lilly
(Lillian )
7
作成したトークンの種類が間違っています — 汎用のAPIトークンになっています。R2バケット用のトークンを作成する必要があります:
- Cloudflareダッシュボードにアクセスし、左側のサイドバーにある「storage & databases」から「R2オブジェクトストレージ」を選択します。
- R2の概要ページの右側にある「manage R2 API tokens」をクリックします。
- 「create API token」をクリックします。
- 権限を「object read & write」に設定し、「save」をクリックします。
- 「access key id」と「secret access key」が出力されます。これらをDiscourseのS3設定に入力する必要があります。
また、末尾のスラッシュは削除する必要があります。Discourseはそれらを拒否する可能性があります。
ありがとう。それが問題だったことが判明しました…余計に混乱させただけですが、それはCloudflareのせいでしょう
Lilly
(Lillian )
9
そうだね、Cloudflareのダッシュボードは設定がごちゃごちゃしちゃうよね(笑)。直ってよかったです!