サイト上で 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 object storage(R2 オブジェクトストレージ)を選択します。
- R2 概要ページの右側にある
manage(管理)(API トークン)をクリックします。
create account API token(アカウント API トークンの作成)をクリックします。
- 適切なトークン名を入力し、権限を
object read & write(オブジェクトの読み取りと書き込み)に設定してから save(保存)をクリックします。
access key id(アクセスキーID)と secret access key(シークレットアクセスキー)が出力されます。これらを Discourse の S3 設定に入力する必要があります。
また、末尾のスラッシュは削除する必要があります。Discourse がそれらを拒否する可能性があるためです。
ありがとう、それが原因だったようだ。余計に混乱を招くだけだったけど、これはCloudflareのせいだね。
Lilly
(Lillian )
9
ああ、Cloudflareのダッシュボードの設定はまるでスズメバチの巣のようですね(笑)。問題が解決してよかったです!