設定は正しいはずなのに CORS エラーが出る場合は、このトラブルシューティングガイドを使えます。
ブラウザーのコンソールで CORS エラーの上に 401/403 エラーが見える場合は、別の問題です(CORS とは関係ありません)。
実際に CORS の問題である場合は、CORS 問題の解消 を参照してください。
- ブラウザーで開発者ツールを開きます。
- Network タブを開き、失敗しているリクエストを探します。開発者ツールを開いたあとのリクエストだけが記録されるため、ページの再読み込みが必要なことがあります。
- レスポンスヘッダーで、次の 2 つのヘッダーを確認します。
cf-cache-statuscf-mitigated
リクエストは、いずれかの WAF ルールによってブロックされています。ブロックの原因を特定するには、Security Events を確認します。
リクエストは Hotlink Protection によってブロックされています。
Configuration Rule で Hotlink Protection の設定を編集するか、完全に無効にします。
リクエストの署名が正しくないことがあります。curl でリクエストを試すと、より分かりやすいエラーメッセージを得られることがあります。
Examples ページの、動作する S3 署名の例を参照してください。
CORS 設定でよくある問題は次のとおりです。
ExposeHeadersにETagなどのヘッダーがないAllowedHeadersにAuthorizationやContent-TypeなどのヘッダーがないAllowedMethodsにPOST/PUTなどのメソッドがない
Object Read & Write または Object Read only 権限で作成した R2 API トークンを Cloudflare REST API(api.cloudflare.com)に対して使うと、オブジェクトリクエストの認証に失敗し、次のいずれかが返されます。
- トークンがすべてのバケットに適用される場合:
{"code":10002,"message":"Unauthorized"}(HTTP 401)。 - トークンが特定のバケットにスコープされている場合:
{"code":10000,"message":"Authentication error"}(HTTP 403)。
オブジェクトレベルのトークンは、S3 互換 API だけがサポートします。この API は AWS Signature Version 4(SigV4)で認証します。
解消するには、次のいずれかを行います。
- オブジェクトレベルのトークンを使い続ける場合は、REST API ではなく S3 互換 API でオブジェクトリクエストを行います。オブジェクト操作には S3 互換 API の方が適しています。REST API には レート制限 があります。
- REST API を使う場合は、Admin Read & Write または Admin Read only トークンで認証します。Admin トークンは、バケット単位ではなくアカウント全体のアクセスを付与します。
HTTP 5XX エラーは、多くの場合、同時リクエストが多すぎて Cloudflare R2 バケットが過負荷になっているサインです。これらのエラーは、バケット全体の読み取りと書き込みのロックを引き起こし、進行中のすべての操作のパフォーマンスに影響することがあります。
こうした中断を避けるには、リクエスト量を管理する戦略を実装することが重要です。
使える緩和策は次のとおりです。
バケットへの同時リクエスト数を追跡します。クライアントが 5XX エラーに遭遇したら、操作をリトライし、ほかのクライアントと連携します。連携することで、クライアント全体で速度を落とし、リクエスト率を下げ、成功する操作の流れをより安定させられます。
ユーザーがバケットへ直接アップロードしている場合(S3 または Workers API を使う場合など)、同時実行数の上限を監視したり強制したりできないことがあります。その場合は、バケットのシャーディングをおすすめします。
複雑さは増えますが、より高い容量が必要な場合は、バケットのシャーディングを検討してください。読み取りと書き込みを複数のバケットに分散し、1 つのバケットへの負荷を下げます。シャーディングは、1 つのホットオブジェクトが容量を使い果たすことを防げませんが、全体の影響を和らげ、システムの耐障害性を高められます。
Cloudflare ダッシュボードでは、View prefixes as directories を選ぶと、名前に / を含むオブジェクトをフォルダーとして表示できます。
たとえば、example/object という名前のオブジェクトは、次のように表示されます。
- example
- object
名前が / で終わるオブジェクトは、Cloudflare ダッシュボードがフォルダーとして描画し、その中に名前のないオブジェクトがあるように見えます。
たとえば、example/ という名前のオブジェクトを R2 バケットにアップロードすると、次のように表示されます。
- example
This object is unnamed