Amazon S3 で CORS を設定し、cURL を使用して CORS ルールを確認する方法を教えてください。
最終更新日: 2021 年 12 月 7 日
Amazon Simple Storage Service (Amazon S3) バケット内のリソースへのクロスオリジンアクセスを許可したいのですが、エラーが発生します。この問題を解決するにはどうすればよいですか?
簡単な説明
Amazon S3 コンソールまたは AWS Command Line Interface (AWS CLI) を使用して、クロスオリジンリソース共有 (CORS) ルールをバケットに適用できます。Amazon S3 バケットで CORS ルールをテストするには、cURL コマンドを使用します。
解決方法
CORS は HTTP の機能で、ヘッダーを使用してウェブサーバーが別のオリジンから要求したコンテンツをブラウザーに表示できるようにします。CORS ルールで定義されていない Amazon S3 バケットに対してクロスオリジンリクエストを行った場合、CORS ヘッダーは返されません。
例:
curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Origin: example.com"
HTTP/1.1 200 OK
x-amz-id-2: Va106gWx1uUDGbouopXfpjvjHW0VXydI8/VGlraf/62f2vvxtI+iAnmu7lF4MK2B6CxuzReyfRI=
x-amz-request-id: QWNNX1Y0MWFM152H
Date: Thu, 04 Nov 2021 18:52:55 GMT
Last-Modified: Thu, 04 Nov 2021 16:03:50 GMT
ETag: "cd4276d2cd5a2dc8ebcc1e04746680f6"
Accept-Ranges: bytes
Content-Type: text/html
Server: AmazonS3
Content-Length: 55
ウェブサーバーがウェブサイトに対して同様のリクエストを行った場合、バケットから取得したコンテンツはブラウザに表示されません。コンテンツを表示できるようにするには、Amazon S3 バケットに CORS ポリシーを設定します。CORS ポリシーを適切に設定すると、適切なヘッダーが返されます。Amazon S3 コンソールまたは AWS CLI を使用して、バケットに CORS ルールを設定できます。
Amazon S3 コンソールを使用した CORS ルールの設定
Amazon S3 コンソールを使用してバケットに CORS ルールを設定するには、次のステップを実行します。
1. AWS マネジメントコンソールにサインインします。
3. バケットを選択します。
4. [Permissions] (アクセス権限) タブを選択します。
5. [Cross-origin resource sharing] (クロスオリジンリソース共有) ペインで、[Edit] (編集) を選択します。
6. テキストボックスに、有効にする JSON CORS ルールを入力します。
Example:
[
{
"AllowedHeaders": [
"Authorization"
],
"AllowedMethods": [
"GET",
"HEAD"
],
"AllowedOrigins": [
"example.com"
],
"ExposeHeaders": [
"Access-Control-Allow-Origin"
]
}
]
各 CORS ルール要素またはサンプルルールの詳細については、「CORS の設定」を参照してください。
7. [Save] (保存) を選択します。
AWS CLI を使用した CORS ルールの設定
AWS CLI を使用してバケットに CORS ルールを設定するには、次のコマンドを実行します。
aws s3api put-bucket-cors --bucket mycorsbucket --cors-configuration '{"CORSRules" : [{"AllowedHeaders":["Authorization"],"AllowedMethods":["GET","HEAD"],"AllowedOrigins":["example.com"],"ExposeHeaders":["Access-Control-Allow-Origin"]}]}'
注: AWS CLI コマンドの実行時にエラーが発生する場合は、AWS CLI の最新バージョンを使用していることを確認してください。
CORS ルールのテスト
CORS ルールをテストするには、次のように cURL コマンドを使用します。
curl -i http://mycorsbucket.s3.amazonaws.com/index.html -H "Origin: example.com"
HTTP/1.1 200 OK
x-amz-id-2: d5Jsw1vCf8tR3cMdXrtcTKYgczU/1pjxahnrw7C6jU1fLo8py2Nv2kpeFs8pYPruVZg6Y3JuRUA=
x-amz-request-id: BMCCY18E58B3GBWV
Date: Thu, 04 Nov 2021 19:12:26 GMT
Access-Control-Allow-Origin: example.com
Access-Control-Allow-Methods: GET, HEAD
Access-Control-Expose-Headers: Access-Control-Allow-Origin
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Last-Modified: Thu, 04 Nov 2021 16:03:50 GMT
ETag: "cd4276d2cd5a2dc8ebcc1e04746680f6"
Accept-Ranges: bytes
Content-Type: text/html
Server: AmazonS3
Content-Length: 55
CORS ルールが正しく設定されていれば、「 200 OK」の応答が返されます。
CORS メソッドのトラブルシューティング
cURL コマンドを使用して、 -H "Access-Control-Request-Method: <Method>" フラグを追加することで特定の CORS メソッドを使用してリクエストを作成することもできます。このフラグは、テストする CORS メソッドを指定します。—request OPTIONS フラグを使用して、リクエストのプレフライトチェックを実行します。
注: Amazon S3 は GET、HEAD、PUT、POST、DELETE の各メソッドをサポートしています。
curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Access-Control-Request-Method: POST" --request OPTIONS -H "Origin: example.com"
HTTP/1.1 403 Forbidden
x-amz-request-id: 190J4Q6222HA2KZ5
x-amz-id-2: 6oEci3qg88OeoLvBGwkN8K9AGdxyVela8ZKxftXMqyWrtZFfiKMrBwpTAeRiOth8amovJMtAAdA=
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Fri, 19 Nov 2021 18:43:38 GMT
Server: AmazonS3
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessForbidden</Code><Message>CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource's CORS spec.</Message><Method>POST</Method><ResourceType>OBJECT</ResourceType><RequestId>190J4Q6222HA2KZ5</RequestId><HostId>6oEci3qg88OeoLvBGwkN8K9AGdxyVela8ZKxftXMqyWrtZFfiKMrBwpTAeRiOth8amovJMtAAdA=</HostId></Error>
リクエストからエラーが返された場合は、必要なメソッドをバケットの CORS ルールに追加します。
aws s3api put-bucket-cors --bucket mycorsbucket --cors-configuration '{"CORSRules" : [{"AllowedHeaders":["Authorization"],"AllowedMethods":["GET","HEAD","POST"],"AllowedOrigins":["example.com"],"ExposeHeaders":["Access-Control-Allow-Origin"]}]}'
更新された CORS ルールをテストします。メソッドが期待どおりに動作すると、次の応答が返されます。
curl -i http://mycorsbucket.s3.amazonaws.com/index.html -H "Access-Control-Request-Method: POST" -X OPTIONS -H "Origin: example.com"
HTTP/1.1 200 OK
x-amz-id-2: Cx4kuM31KPVE19woEPRRYxF+85vEWkLk8+M0p6BIb72T550njMnmLtjqRgYzuxKelR0f+cxhFqI=
x-amz-request-id: QBSHV46QK43HGW15
Date: Fri, 19 Nov 2021 18:48:21 GMT
Access-Control-Allow-Origin: example.com
Access-Control-Allow-Methods: GET, HEAD, POST
Access-Control-Expose-Headers: Access-Control-Allow-Origin
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Server: AmazonS3
Content-Length: 0