CORS のトラブルシューティング
次のトピックは S3 に関連する CORS の一般的な問題をトラブルシューティングするのに役立ちます。
トピック
403 Forbidden エラー: このバケットでは CORS が有効になっていません
次の 403 Forbidden エラーは、クロスオリジンリクエストが Amazon S3 に送信されたものの、CORS が S3 バケットに設定されていない場合に発生します。
エラー: HTTP/1.1 403 Forbidden CORS レスポンス: このバケットでは CORS が有効になっていません。
CORS 設定は、バケットへのアクセスを許可するオリジン、各オリジンでサポートされるオペレーション (HTTP メソッド)、その他のオペレーション固有情報を識別するルールを持つ XML ドキュメント、つまりポリシーです。Amazon S3 コンソール、AWS SDK、および REST API を使用して S3 で CORS を設定する方法を参照してください。CORS の詳細と CORS 設定の例については、「CORS 設定のエレメント」を参照してください。
403 Forbidden エラー: この CORS リクエストは許可されていません
次の 403 Forbidden エラーは、CORS 設定の CORS ルールがリクエスト内のデータと一致しない場合に発生します。
エラー: HTTP/1.1 403 Forbidden CORS レスポンス: この CORS リクエストは許可されていません。
この 403 Forbidden エラーは、さまざまな理由で発生する可能性があります。
-
オリジンが許可されない。
-
メソッドが許可されない。
-
リクエストされたヘッダーが許可されない。
Amazon S3 が受信するリクエストごとに、リクエスト内のデータと一致する CORS ルールが CORS 設定に含まれている必要があります。
オリジンが許可されない
バケットへの CORS リクエストの Origin ヘッダーは、CORS 設定の AllowedOrigins エレメントのオリジンと一致している必要があります。AllowedOrigins エレメントで使用されるワイルドカード文字 ("*") は、すべての HTTP メソッドと一致することになります。AllowedOrigins エレメントを更新する方法の詳細については、「Cross−Origin Resource Sharing (CORS) の設定」を参照してください。
例えば、AllowedOrigins エレメントに http://www.example1.com ドメインのみが含まれている場合、http://www.example2.com ドメインから送信された CORS リクエストには 403
Forbidden エラーが返されます。
次の例は、AllowedOrigins エレメントに http://www.example1.com ドメインが含まれる CORS 設定の一部を示しています。
"AllowedOrigins":[ "http://www.example1.com" ]
http://www.example2.com ドメインから送信された CORS リクエストを成功させるには、CORS 設定の AllowedOrigins エレメントに http://www.example2.com ドメインを含める必要があります。
"AllowedOrigins":[ "http://www.example1.com" "http://www.example2.com" ]
メソッドが許可されない
バケットへの CORS リクエストの Access-Control-Request-Method で指定されている HTTP メソッドは、CORS 設定の AllowedMethods エレメントに含まれているメソッドと一致している必要があります。AllowedMethods で使用されるワイルドカード文字 ("*") は、すべての HTTP メソッドと一致することになります。AllowedOrigins エレメントを更新する方法の詳細については、「Cross−Origin Resource Sharing (CORS) の設定」を参照してください。
CORS 設定では、AllowedMethods エレメントに次のメソッドを指定できます。
-
GET -
PUT POST-
DELETE -
HEAD
次の例は、AllowedMethods エレメントに GET メソッドが含まれる CORS 設定の一部を示しています。GET メソッドが含まれるリクエストのみが成功します。
"AllowedMethods":[ "GET" ]
HTTP メソッド (例: PUT) が CORS リクエストで使用されているか、バケットへのプリフライト CORS リクエストに含まれているものの、そのメソッドが CORS 設定に存在しない場合、リクエストは 403 Forbidden エラーとなります。この CORS リクエストまたは CORS プリフライトリクエストを許可するには、CORS 設定に PUT メソッドを追加する必要があります。
"AllowedMethods":[ "GET" "PUT" ]
リクエストされたヘッダーが許可されない
プリフライトリクエストの Access-Control-Request-Headers ヘッダーに含まれているヘッダーは、CORS 設定の AllowedHeaders エレメントのヘッダーと一致している必要があります。Amazon S3 へのリクエストで使用できる一般的なヘッダーのリストについては、一般的なリクエストヘッダーを参照してください。AllowedHeaders エレメントを更新する方法の詳細については、「Cross−Origin Resource Sharing (CORS) の設定」を参照してください。
次の例は、AllowedHeaders エレメントに Authorization ヘッダーが含まれる CORS 設定の一部を示しています。Authorization ヘッダーのリクエストのみが成功します。
"AllowedHeaders": [ "Authorization" ]
ヘッダー (例: Content-MD5) が CORS リクエストに含まれているものの、そのヘッダーが CORS 設定に存在しない場合、リクエストは 403 Forbidden エラーとなります。この CORS リクエストを許可するには、CORS 設定に Content-MD5 ヘッダーを追加する必要があります。CORS リクエストで Authorization と Content-MD5 の両方のヘッダーをバケットに渡す場合は、両方のヘッダーが CORS 設定の AllowedHeadersエレメントに含まれていることを確認します。
"AllowedHeaders": [ "Authorization" "Content-MD5" ]
CORS レスポンスにヘッダーが見つからない
CORS 設定の ExposeHeaders エレメントは、CORS リクエストに応答して、ブラウザで実行されているスクリプトやアプリケーションからのアクセスを可能にするレスポンスヘッダーを特定します。
S3 バケットに保存されているオブジェクトに、レスポンスデータとともにユーザー定義のメタデータ (x-amz-meta-custom-header など) がある場合、このカスタムヘッダーには、クライアント側の JavaScript コードからのアクセスする追加のメタデータや情報が含まれる可能性があります。ただし、デフォルトでは、セキュリティ上の理由からカスタムヘッダーへのアクセスはブラウザによってブロックされます。クライアント側の JavaScript がカスタムヘッダーにアクセスできるようにするには、CORS 設定にヘッダーを含める必要があります。
以下の例では、ExposeHeaders エレメントに x-amz-meta-custom-header1 ヘッダーが含まれています。x-amz-meta-custom-header2 は ExposeHeaders エレメントに含まれておらず、CORS 設定にありません。レスポンスでは、ExposeHeaders エレメントに含まれる値のみが返されます。リクエストの Access-Control-Expose-Headers ヘッダーに x-amz-meta-custom-header2 ヘッダーが含まれていても、レスポンスは 200 OK を返します。ただし、許可されたヘッダー (例: x-amz-meta-custom-header) のみが返されてレスポンスに表示されます。
"ExposeHeaders": [ "x-amz-meta-custom-header1" ]
すべてのヘッダーがレスポンスに表示されるようにするには、以下のように、許可するすべてのヘッダーを CORS 設定の ExposeHeaders エレメントに追加します。
"ExposeHeaders": [ "x-amz-meta-custom-header1", "x-amz-meta-custom-header2" ]
S3 プロキシ統合での CORS に関する考慮事項
エラーの発生時に、S3 バケットの CORS 設定を既にチェックしていて、クロスオリジンリクエストが AWS CloudFront などのプロキシに送信されている場合は、以下を試してください。
-
HTTP リクエストの
OPTIONSメソッドを許可するように設定を行います。 -
Origin、Access-Control-Request-Headers、Access-Control-Request-Methodの各ヘッダーを転送するようにプロキシを設定します。 -
オリジンヘッダーをキャッシュキーに含めるようにプロキシ設定を構成します。キャッシュキーにオリジンヘッダーを含まないキャッシュプロキシは、異なるオリジンに対して適切な CORS ヘッダーを含まないキャッシュレスポンスを提供する可能性があるため、これは重要です。
一部のプロキシでは、CORS リクエスト用の事前定義済みの機能が提供されています。例えば、CloudFront では、ヘッダーを含むポリシーを設定できます。
このポリシーには、オリジンが Amazon S3 バケットである場合に、Cross-Origin Resource Sharing (CORS) リクエストを有効にするヘッダーが含まれます。
このポリシーの設定は以下のとおりです。
-
オリジンリクエストに含まれるヘッダー:
OriginAccess-Control-Request-HeadersAccess-Control-Request-Method -
オリジンリクエストに含まれる Cookie: なし
-
オリジンリクエストに含まれるクエリ文字列: なし
詳細については、「Amazon CloudFront デベロッパーガイド」の「ポリシーを使用してオリジンリクエストを制御する」または「マネージドオリジンリクエストポリシーを使用する」を参照してください。