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 リクエスト用の事前定義済みの機能が提供されています。例えば CloudFront では、オリジンが S3 バケットのときに、CORS リクエストを有効にするヘッダーを含んだポリシーを設定できます。詳細については、「Amazon CloudFront デベロッパーガイド」の「ポリシーを使用してオリジンリクエストを制御する」または「マネージドオリジンリクエストポリシーを使用する」を参照してください。