

# CORS のトラブルシューティング
<a name="cors-troubleshooting"></a>

次のトピックは S3 に関連する CORS の一般的な問題をトラブルシューティングするのに役立ちます。

**Topics**
+ [403 Forbidden エラー - このバケットでは CORS が有効になっていません](#cors-not-enabled)
+ [403 Forbidden エラー - この CORS リクエストは許可されていません](#cors-not-enabled)
+ [CORS レスポンスにヘッダーが見つからない](#Headers-not-found)
+ [S3 プロキシ統合での CORS に関する考慮事項](#cors-in-proxy)

## 403 Forbidden エラー: このバケットでは CORS が有効になっていません
<a name="cors-not-enabled"></a>

次の `403 Forbidden` エラーは、クロスオリジンリクエストが Amazon S3 に送信されたものの、CORS が S3 バケットに設定されていない場合に発生します。

 エラー: HTTP/1.1 403 Forbidden CORS レスポンス: このバケットでは CORS が有効になっていません。

CORS 設定は、バケットへのアクセスを許可するオリジン、各オリジンでサポートされるオペレーション (HTTP メソッド)、その他のオペレーション固有情報を識別するルールを持つ XML ドキュメント、つまりポリシーです。Amazon S3 コンソール、AWS SDK、および REST API を使用して S3 で [CORS を設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html)する方法を参照してください。CORS の詳細と CORS 設定の例については、「[CORS 設定のエレメント](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html#cors-example-1)」を参照してください。

## 403 Forbidden エラー: この CORS リクエストは許可されていません
<a name="cors-not-enabled"></a>

次の `403 Forbidden` エラーは、CORS 設定の CORS ルールがリクエスト内のデータと一致しない場合に発生します。

エラー:  HTTP/1.1 403 Forbidden CORS レスポンス: この CORS リクエストは許可されていません。

この `403 Forbidden` エラーは、さまざまな理由で発生する可能性があります。
+ オリジンが許可されない。
+ メソッドが許可されない。
+ リクエストされたヘッダーが許可されない。

Amazon S3 が受信するリクエストごとに、リクエスト内のデータと一致する CORS ルールが CORS 設定に含まれている必要があります。

### オリジンが許可されない
<a name="Origin-not-allowed"></a>

 バケットへの CORS リクエストの `Origin` ヘッダーは、CORS 設定の `AllowedOrigins` エレメントのオリジンと一致している必要があります。`AllowedOrigins` エレメントで使用されるワイルドカード文字 (`"*"`) は、すべての HTTP メソッドと一致することになります。`AllowedOrigins` エレメントを更新する方法の詳細については、「[Cross−Origin Resource Sharing (CORS) の設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html)」を参照してください。

 例えば、`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"
]
```

### メソッドが許可されない
<a name="Methods-not-allowed"></a>

 バケットへの CORS リクエストの `Access-Control-Request-Method` で指定されている HTTP メソッドは、CORS 設定の `AllowedMethods` エレメントに含まれているメソッドと一致している必要があります。`AllowedMethods` で使用されるワイルドカード文字 (`"*"`) は、すべての HTTP メソッドと一致することになります。`AllowedOrigins` エレメントを更新する方法の詳細については、「[Cross−Origin Resource Sharing (CORS) の設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html)」を参照してください。

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"
]
```

### リクエストされたヘッダーが許可されない
<a name="Headers-not-allowed"></a>

 プリフライトリクエストの `Access-Control-Request-Headers` ヘッダーに含まれているヘッダーは、CORS 設定の `AllowedHeaders` エレメントのヘッダーと一致している必要があります。Amazon S3 へのリクエストで使用できる一般的なヘッダーのリストについては、[一般的なリクエストヘッダー](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html)を参照してください。`AllowedHeaders` エレメントを更新する方法の詳細については、「[Cross−Origin Resource Sharing (CORS) の設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html)」を参照してください。

次の例は、`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 レスポンスにヘッダーが見つからない
<a name="Headers-not-found"></a>

 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 に関する考慮事項
<a name="cors-in-proxy"></a>

エラーの発生時に、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) リクエストを有効にするヘッダーが含まれます。

 このポリシーの設定は以下のとおりです。
+ オリジンリクエストに含まれるヘッダー:

   `Origin`

   `Access-Control-Request-Headers`

   `Access-Control-Request-Method`
+ オリジンリクエストに含まれる Cookie: なし
+ オリジンリクエストに含まれるクエリ文字列: なし

詳細については、「Amazon CloudFront デベロッパーガイド」の「[ポリシーを使用してオリジンリクエストを制御する](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.htm)」または「[マネージドオリジンリクエストポリシーを使用する](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html#managed-origin-request-policy-cors-s3)」を参照してください。**