

# Amazon S3 オリジンへのアクセスを制限する
<a name="private-content-restricting-access-to-s3"></a>

CloudFront には、認証済みリクエストを Amazon S3 オリジンに送信するために、*オリジンアクセスコントロール* (OAC) と*オリジンアクセスアイデンティティ* (OAI) という 2 つの方法が用意されています。OAC は、Amazon S3 などのオリジンを保護するのに役立ちます。

以下の機能をサポートしているため、代わりに OAC を使用することを*お勧め*します。
+ すべての AWS リージョンのすべての Amazon S3 バケット (2022 年 12 月以降に開始されたオプトインリージョンを含む)
+ [AWS KMS による Amazon S3 サーバー側の暗号化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) (SSE-KMS)
+ Amazon S3 に対する動的なリクエスト (`PUT` と `DELETE`)

OAI はこれらの機能をサポートしていないか、これらのシナリオでは追加の回避策が必要です。既に OAI を使用していて、移行する場合は、「[オリジンアクセスアイデンティティ (OAI) からオリジンアクセスコントロール (OAC) への移行](#migrate-from-oai-to-oac)」を参照してください。

**注意事項**  
Amazon S3 バケットオリジンで CloudFront OAC を使用する場合は、**[Amazon S3 オブジェクト所有権]** を、新しい Amazon S3 バケットのデフォルトである **[バケット所有者の強制]** に設定する必要があります。ACL が必要な場合は、**[希望するバケット所有者]** を使用し、CloudFront 経由でアップロードされたオブジェクトの制御を維持します。
オリジンが、[ウェブサイトエンドポイント](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html)として設定されている Amazon S3 バケットである場合、CloudFront でカスタムオリジンとして設定する必要があります。つまり、OAC (または OAI) を使用することはできません。OAC は、Lambda@Edge を使用したオリジンリダイレクトをサポートしていません。
Amazon S3 マルチリージョンアクセスポイントを Amazon CloudFront のオリジンとして使用する場合は、「[Amazon S3 マルチリージョンアクセスポイントオリジンへのアクセスを制限する](private-content-restricting-access-to-s3-mrap.md)」を参照してください。S3 マルチリージョンアクセスポイントには、別の OAC 設定が必要です。

以下のトピックでは、Amazon S3 オリジンで OAC を使用する方法について説明します。

**トピック**
+ [新しいオリジンアクセスコントロールを作成する](#create-oac-overview-s3)
+ [S3 バケットに OAC がアタッチされたディストリビューションを削除する](#delete-oac-distribution-s3)
+ [オリジンアクセスアイデンティティ (OAI) からオリジンアクセスコントロール (OAC) への移行](#migrate-from-oai-to-oac)
+ [オリジンアクセスコントロールの詳細設定](#oac-advanced-settings-s3)

## 新しいオリジンアクセスコントロールを作成する
<a name="create-oac-overview-s3"></a>

次のトピックで説明されているステップを実行して、CloudFront で新しいオリジンアクセスコントロールを設定します。

**Topics**
+ [前提条件](#oac-prerequisites-s3)
+ [S3 バケットへのアクセス許可を CloudFront に付与する](#oac-permission-to-access-s3)
+ [オリジンアクセスコントロールを作成する](#create-oac-s3)

### 前提条件
<a name="oac-prerequisites-s3"></a>

オリジンアクセスコントロール (OAC) を作成して設定する前に、Amazon S3 バケットオリジンを持つ CloudFront ディストリビューションが必要です。このオリジンは、[ウェブサイトエンドポイント](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html)として設定されたバケットではなく、通常の S3 バケットである必要があります。S3 バケットオリジンを使用した CloudFront ディストリビューションのセットアップの詳細については、「[CloudFront 標準ディストリビューションの開始方法](GettingStarted.SimpleDistribution.md)」を参照してください。

**重要**  
OAC を使用して Amazon S3 オリジンを保護する場合、CloudFront と Amazon S3 間の通信は*常に* HTTPS を介して行われますが、*[常にリクエストに署名]* を選択した場合に限られます。コンソールで **[リクエストに署名 (推奨)]** を選択するか、CloudFront API、AWS CLI、または CloudFormation で [`always`] を指定する必要があります。  
**[リクエストに署名しない]** または **[認証ヘッダーを上書きしない]** オプションを選択した場合、CloudFront は次のポリシーで指定した接続プロトコルを使用します。  
[ビューワープロトコルポリシー](using-https-viewers-to-cloudfront.md) 
[オリジンプロトコルポリシー](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy) (カスタムオリジンのみ)
例えば、**[認証ヘッダーを上書きしない]** を選択し、CloudFront と Amazon S3 オリジンの間で HTTPS を使用する場合は、[ビューワープロトコルポリシー](using-https-viewers-to-cloudfront.md)に **HTTP を HTTPS にリダイレクト**または **HTTPS のみ**を使用します。

### S3 バケットへのアクセス許可を CloudFront に付与する
<a name="oac-permission-to-access-s3"></a>

オリジンアクセスコントロール (OAC) を作成したり、CloudFront ディストリビューションで設定したりする前に、CloudFront に S3 バケットオリジンへのアクセス許可があることを確認してください。これは CloudFront ディストリビューションを作成した後、ディストリビューション設定の S3 オリジンに OAC を追加する前に行います。

S3 [バケットポリシー](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)を使用して、CloudFront サービスプリンシパル (`cloudfront.amazonaws.com`) がバケットにアクセスできるようにします。ポリシーの `Condition` 要素を使用して、S3 オリジンを含む CloudFront ディストリビューションに代わってリクエストが行われた場合にのみ CloudFront がバケットにアクセスできるようにします。これは、OAC を追加する S3 オリジンを持つディストリビューションです。

バケットポリシーの追加または変更の詳細については、*Amazon S3 ユーザーガイド*の「[Amazon S3 コンソールを使用したバケットポリシーの追加](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)」を参照してください。

以下の例は、OAC が有効になっている CloudFront ディストリビューションに S3 オリジンへのアクセスを許可する S3 バケットポリシーを示しています。

**Example OAC が有効になっている CloudFront ディストリビューションへの読み取り専用アクセスを許可する S3 バケットポリシー**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCloudFrontServicePrincipalReadOnly",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/{{<CloudFront distribution ID>}}"
        }
      }
    }
  ]
}
```

**Example OAC が有効になっている CloudFront ディストリビューションへの読み取りおよび書き込みアクセスを許可する S3 バケットポリシー**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCloudFrontServicePrincipalReadWrite",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/{{CloudFront-distribution-ID>}}"
        }
      }
    }
  ]
}
```

#### SSE-KMS
<a name="oac-permissions-sse-kms"></a>

S3 バケットオリジン内のオブジェクトが [AWS Key Management Service (SSE-KMS) でのサーバー側の暗号化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)を使用して暗号化されている場合は、CloudFront ディストリビューションに AWS KMS キーを使用するアクセス許可があることを確認する必要があります。KMS キーを使用するアクセス許可を CloudFront ディストリビューションに付与するには、[KMS キーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)にステートメントを追加します。キーポリシーを変更する方法については、「*AWS Key Management Service デベロッパーガイド*」の「[キーポリシーの変更](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html)」を参照してください。

**Example KMS キーポリシーステートメント**  
次の例は、OAC を使用した CloudFront ディストリビューションが SSE-KMS の KMS キーにアクセスできるようにする AWS KMS ポリシーステートメントを示しています。  

```
{
    "Sid": "AllowCloudFrontServicePrincipalSSE-KMS",
    "Effect": "Allow",
    "Principal": {
        "Service": [
            "cloudfront.amazonaws.com"
        ]
     },
    "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*",
    "Condition": {
            "StringEquals": {
                "AWS:SourceArn": "arn:aws:cloudfront::{{111122223333}}:distribution/{{<CloudFront distribution ID>}}"
            }
        }
}
```

### オリジンアクセスコントロールを作成する
<a name="create-oac-s3"></a>

オリジンアクセスコントロール (OAC) を作成するには、AWS マネジメントコンソール、CloudFormation、AWS CLI、または CloudFront API を使用します。

------
#### [ Console ]

**オリジンアクセスコントロールを作成するには**

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで、[**オリジンアクセス**] を選択します。

1. [**コントロール設定を作成**] を選択します。

1. [**コントロール設定を作成**] フォームで、以下の操作を行います。

   1. [**詳細**] ペインに、[**名前**] と (オプションで) オリジンアクセスコントロールの [**説明**] を入力します。

   1. [**設定**] ペインでは、デフォルト設定である [**Sign requests (recommended)**] (署名リクエスト (推奨)) をそのまま使用することをお勧めします。詳細については、「[オリジンアクセスコントロールの詳細設定](#oac-advanced-settings-s3)」を参照してください。

1. **[Origin type]** (オリジンタイプ) ドロップダウンから [S3] を選択します。

1. **[作成]** を選択します。

   OAC を作成したら、[**名前**] を書き留めておきます。次の手順では、この操作を行う必要があります。

**ディストリビューションの S3 オリジンにオリジンアクセスコントロールを追加するには**

1. [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. OAC を追加する S3 オリジンのあるディストリビューションを選択し、[**オリジン**] タブを選択します。

1. OAC を追加する S3 オリジンを選択し、[**編集**] を選択します。

1. **[オリジンアクセス]** で、**[オリジンアクセスコントロール設定 (推奨)]** を選択します。

1. **[Origin access control]** (オリジンアクセスコントロール) ドロップダウンメニューから、使用する OAC を選択します。

1. **[変更の保存]** をクリックします。

ディストリビューションは、すべての CloudFront エッジロケーションへのデプロイを開始します。エッジロケーションは、新しい設定を受け取ると、S3 バケットオリジンに送信するすべてのリクエストに署名します。

------
#### [ CloudFormation ]

CloudFormation を使用してオリジンアクセスコントロール (OAC) を作成するには、`AWS::CloudFront::OriginAccessControl` リソースタイプを使用します。以下の例は、オリジンアクセスコントロールを作成するための CloudFormation テンプレート構文を YAML 形式で示しています。

```
Type: AWS::CloudFront::OriginAccessControl
Properties: 
  OriginAccessControlConfig: 
      Description: An optional description for the origin access control
      Name: ExampleOAC
      OriginAccessControlOriginType: s3
      SigningBehavior: always
      SigningProtocol: sigv4
```

詳細については、*AWS CloudFormation ユーザーガイド*の「[AWS::CloudFront::OriginAccessControl](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originaccesscontrol.html)」を参照してください。

------
#### [ CLI ]

AWS Command Line Interface (AWS CLI) を使用してオリジンアクセスコントロールを作成するには、**aws cloudfront create-origin-access-control** コマンドを使用します。コマンドの入力パラメータは、コマンドライン入力として個別に指定せずに、入力ファイルを使用して指定できます。

**オリジンアクセスコントロール (入力ファイルを含む CLI) を作成するには**

1. 次のコマンドを使用して、`origin-access-control.yaml` という名前のファイルを作成します。このファイルには、**create-origin-access-control** コマンドのすべての入力パラメータが含まれます。

   ```
   aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml
   ```

1. 先ほど作成した `origin-access-control.yaml` ファイルを開きます。ファイルを編集して OAC の名前、説明 (オプション) を追加し、`SigningBehavior` を `always` に変更します。その後、ファイルを保存します。

   その他の OAC の設定については、「[オリジンアクセスコントロールの詳細設定](#oac-advanced-settings-s3)」を参照してください。

1. 次のコマンドを使用して、`origin-access-control.yaml` ファイルの入力パラメータを使用し、オリジンアクセスコントロールを作成します。

   ```
   aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml
   ```

   コマンド出力の `Id` 値を書き留めます。これは、CloudFront ディストリビューションの S3 バケットオリジンに OAC を追加するために必要です。

**OAC を既存のディストリビューションの S3 バケットオリジンにアタッチするには (入力ファイルを含む CLI)**

1. 以下のコマンドを使用して、OAC を追加する CloudFront ディストリビューションのディストリビューション設定を保存します。ディストリビューションには S3 バケットオリジンが必要です。

   ```
   aws cloudfront get-distribution-config --id {{<CloudFront distribution ID>}} --output yaml > dist-config.yaml
   ```

1. 先ほど作成した `dist-config.yaml` という名前のファイルを開きます。ファイルを編集し、以下の変更を加えます。
   + `Origins` オブジェクトで、`OriginAccessControlId` という名前のフィールドに OAC の ID を追加します。
   + `OriginAccessIdentity` という名前のフィールドから値を削除します (存在する場合)。
   + `ETag` フィールドの名前を `IfMatch` に変更します。ただし、フィールドの値は変更しないでください。

   完了したら、ファイルを保存します。

1. オリジンアクセスコントロールを使用するようにディストリビューションを更新するには、次のコマンドを使用します。

   ```
   aws cloudfront update-distribution --id {{<CloudFront distribution ID>}} --cli-input-yaml file://dist-config.yaml
   ```

ディストリビューションは、すべての CloudFront エッジロケーションへのデプロイを開始します。エッジロケーションは新しい設定を受け取ると、S3 バケットオリジンに送信するすべてのリクエストに署名します。

------
#### [ API ]

CloudFront API でオリジンアクセスコントロールを作成するには、[CreateOriginAccessControl](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateOriginAccessControl.html) を使用します。この API コールで指定するフィールドの詳細については、AWS SDK やその他の API クライアントの API リファレンスドキュメントを参照してください。

オリジンアクセスコントロールを作成したら、次の API コールのいずれかを使用して、それをディストリビューションの S3 バケットオリジンにアタッチできます。
+ 既存のディストリビューションにアタッチするには、[UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html) を使用します。
+ 新しいディストリビューションにアタッチするには、[CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html) を使用します。

これらの API コールの両方について、`OriginAccessControlId` フィールドのオリジン内にオリジンアクセスコントロール ID を指定します。これらの API コールで指定するその他フィールドの詳細については、「[すべてのディストリビューション設定リファレンス](distribution-web-values-specify.md)」と、AWS SDK またはその他 API クライアントの API リファレンスドキュメントを参照してください。

------

## S3 バケットに OAC がアタッチされたディストリビューションを削除する
<a name="delete-oac-distribution-s3"></a>

S3 バケットに OAC がアタッチされたディストリビューションを削除する必要がある場合は、S3 バケットオリジンを削除する前に、ディストリビューションを削除する必要があります。または、オリジンドメイン名にリージョンを含めます。これが不可能な場合は、削除前にパブリックに切り替えることで、OAC をディストリビューションから削除できます。詳細については、「[ディストリビューションを削除する](HowToDeleteDistribution.md)」を参照してください。

## オリジンアクセスアイデンティティ (OAI) からオリジンアクセスコントロール (OAC) への移行
<a name="migrate-from-oai-to-oac"></a>

レガシーのオリジンアクセスアイデンティティ (OAI) からオリジンアクセスコントロール (OAC) に移行するには、まず S3 バケットオリジンを更新して、OAI と OAC が有効になっているディストリビューションの両方がバケットのコンテンツにアクセスできるようにします。これにより、移行中に CloudFront がバケットにアクセスできなくなる状況を回避できます。OAI と OAC が有効になっているディストリビューションの両方が S3 バケットにアクセスできるようにするには、[バケットポリシー](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)を更新し、プリンシパルの種類ごとに 1 つずつ、2 つのステートメントを含めます。

次の S3 バケットポリシー例では、OAI と OAC が有効になっているディストリビューションの両方に S3 オリジンへのアクセスを許可しています。

**Example OAC が有効になっている OAI と CloudFront ディストリビューションの読み取り専用アクセスを許可する S3 バケットポリシー**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipalReadOnly",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{{<S3 bucket name>}}/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::{{111122223333}}:distribution/{{<CloudFront distribution ID>}}"
                }
            }
        },
        {
            "Sid": "AllowLegacyOAIReadOnly",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity {{<origin access identity ID>}}"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{{<S3 bucket name>}}/*"
        }
    ]
}
```

S3 オリジンのバケットポリシーを更新して OAI と OAC の両方へのアクセスを許可したら、OAI の代わりに OAC を使用するようにディストリビューション設定を更新できます。詳細については、「[新しいオリジンアクセスコントロールを作成する](#create-oac-overview-s3)」を参照してください。

ディストリビューションが完全にデプロイされたら、OAI へのアクセスを許可するバケットポリシー内のステートメントを削除できます。詳しくは、「[S3 バケットへのアクセス許可を CloudFront に付与する](#oac-permission-to-access-s3)」を参照してください。

## オリジンアクセスコントロールの詳細設定
<a name="oac-advanced-settings-s3"></a>

CloudFront オリジンアクセスコントロール機能には、特定のユースケースのみを対象とした詳細設定が含まれています。詳細設定が特に必要でない限り、推奨設定を使用してください。

オリジンアクセスコントロールには、[**署名動作**] (コンソール)、または `SigningBehavior` (API、CLI、および CloudFormation) という設定が含まれています この設定では、次のオプションを使用できます。

**オリジンリクエストに常に署名する (推奨設定)**  
コンソールの [**Sign requests (recommended)**] (署名リクエスト (推奨))、または API、CLI、および CloudFormation の `always` という設定を使用することをお勧めします。この設定では、CloudFront は S3 バケットオリジンに送信するすべてのリクエストに常に署名します。

**オリジンリクエストに署名しない**  
この設定は、コンソールでは [**リクエストに署名しない**]、または API、CLI、およびCloudFormation では `never` です。この設定を使用して、このオリジンアクセスコントロールを使用するすべてのディストリビューションのすべてのオリジンに対して、オリジンアクセスコントロールをオフにします。これにより、オリジンアクセスコントロールを使用するすべてのオリジンとディストリビューションからコントロールを 1 つずつ削除する場合に比べて、時間と労力を節約できます。この設定では、CloudFront は S3 バケットオリジンに送信するリクエストには署名しません。  
この設定を使用するには、S3 バケットオリジンがパブリックにアクセス可能である必要があります。パブリックにアクセスできない S3 バケットオリジンでこの設定を使用すると、CloudFront はオリジンにアクセスできません。S3 バケットオリジンは CloudFront にエラーを返し、CloudFront はそれらのエラーをビューワーに渡します。

**ビューワー (クライアント) の `Authorization` ヘッダーを上書きしない**  
この設定は、コンソールでは [**認可ヘッダーを上書きしない**] で、API、CLI、および CloudFormation では `no-override` です。この設定は、対応するビューワーリクエストに `Authorization` ヘッダーに含まれていない場合にのみ、CloudFront がオリジンリクエストに署名するよう指定する場合に使用します。この設定では、ビューワーリクエストが存在するが、ビューワーリクエストに `Authorization` ヘッダーが含まれていないときにオリジンリクエストに署名する (独自の `Authorization` ヘッダーを追加) ときに、CloudFront はビューワーリクエストから `Authorization` ヘッダーを渡します。  
ビューワーリクエストから `Authorization` ヘッダーを渡すには、このオリジンアクセスコントロールに関連付けられた S3 バケットオリジンを使用するすべてのキャッシュ動作に対して、`Authorization` ヘッダーを[キャッシュポリシー](controlling-the-cache-key.md)に*必ず*追加する必要があります。

## オリジンアクセスアイデンティティを使用する (レガシー、非推奨)
<a name="private-content-restricting-access-to-s3-oai"></a>

### オリジンアクセスアイデンティの概要
<a name="private-content-restricting-access-to-s3-overview"></a>

CloudFront の*オリジンアクセスアイデンティティ* (OAI) は*オリジンアクセスコントロール* (OAC) と類似した機能を提供しますが、すべてのシナリオで機能するわけではありません。具体的には、OAI は以下をサポートしていません。
+ オプトインリージョンを含む、すべての AWS リージョンの Amazon S3 バケット
+ [AWS KMS による Amazon S3 サーバー側の暗号化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) (SSE-KMS)
+ Amazon S3 に対する動的なリクエスト (`PUT`、`POST`、または `DELETE`)
+ 2023 年 1 月以降に新しい AWS リージョンをリリース

**ヒント**  
代わりに OAC を使用することをお勧めします。OAC を設定するには、「[新しいオリジンアクセスコントロールを作成する](#create-oac-overview-s3)」を参照してください。OAI から OAC への移行に関する詳細については、「[オリジンアクセスアイデンティティ (OAI) からオリジンアクセスコントロール (OAC) への移行](#migrate-from-oai-to-oac)」を参照してください。

### Amazon S3 バケット内のファイルを読み取るアクセス許可をオリジンアクセスアイデンティティに付与する
<a name="private-content-granting-permissions-to-oai"></a>

CloudFront コンソールを使用して OAI を作成するか、OAI をディストリビューションに追加する場合、バケットにアクセスするための OAI の許可を与えるように Amazon S3 バケットポリシーを自動的に更新できます。あるいは、このバケットポリシーの手動での作成または更新を選択することができます。どちらの方法を使用する場合でも、アクセス許可を確認して次のことを確認する必要があります。
+ CloudFront OAI は、CloudFront 経由でリクエストしているビューワーに代わってバケット内のファイルにアクセスできます。
+ ビューワーは、Amazon S3 URL を使用して CloudFront の外のファイルにアクセスすることができません。

**重要**  
CloudFront でサポートされるすべての HTTP メソッドを受け入れて転送するように CloudFront を設定する場合は、必ず CloudFront OAI に目的のアクセス許可を付与してください。例えば、`DELETE` メソッドを使用するリクエストを受け入れて転送するように CloudFront を設定する場合、適切なファイルのみをビューワーが削除できるように、`DELETE` リクエストを適切に処理するバケットポリシーを設定してください。

#### Amazon S3 バケットポリシーを使用する
<a name="private-content-updating-s3-bucket-policies"></a>

Amazon S3 バケット内のファイルへのアクセス許可を CloudFront OAI に付与するには、次の方法でバケットポリシーを作成または更新します。
+ [Amazon S3 コンソール](https://console.aws.amazon.com/s3/home)で、Amazon S3 バケットの [**アクセス許可**] タブを使用する。
+ Amazon S3 API の [PutBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketPolicy.html) を使用する。
+ [CloudFront コンソール](https://console.aws.amazon.com/cloudfront/v4/home)を使用する。CloudFront コンソールでオリジン設定に OAI を追加するときに、[**Yes, update the bucket policy**] (はい、バケットポリシーを更新します) を選択すると、ユーザーに代わってバケットポリシーを更新するように CloudFront に指示できます。

バケットポリシーを手動で更新する場合は、次の点を確認してください。
+ ポリシーで正しい OAI を `Principal` として指定します。
+ ビューワーに代わってオブジェクトにアクセスするために必要なアクセス許可を OAI に付与します。

詳細については、次のセクションを参照してください。

##### バケットポリシーで OAI を `Principal` として指定
<a name="private-content-updating-s3-bucket-policies-principal"></a>

Amazon S3 バケットポリシーで `Principal` として OAI を指定するには、OAI の ID を含む OAI の Amazon リソースネーム (ARN) を使用します。例えば、次のようになります。

```
"Principal": {
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity {{<origin access identity ID>}}"
}
```

CloudFront コンソールの **[セキュリティ]**、**[オリジンアクセス]**、**[アイデンティティ (レガシー)]** で OAI ID を検索します。または、CloudFront API の [ListCloudFrontOriginAccessIdentities](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListCloudFrontOriginAccessIdentities.html) を使用します。

##### OAI にアクセス許可を付与
<a name="private-content-updating-s3-bucket-policies-permissions"></a>

Amazon S3 バケット内のオブジェクトにアクセスするためのアクセス許可を OAI に付与するには、特定の Amazon S3 API オペレーションに関連するポリシーでアクションを使用します。例えば、`s3:GetObject` アクションは、OAI がバケット内のオブジェクトを読み取ることを許可します。詳細については、次のセクションの例を参照するか、*Amazon Simple Storage Service ユーザーガイド*の「[Amazon S3 のアクション](https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html)」を参照してください。

##### Amazon S3 バケットポリシーの例
<a name="private-content-updating-s3-bucket-policies-examples"></a>

以下の例は、S3 バケットへのアクセスを CloudFront OAI に許可する Amazon S3 バケットポリシーを示しています。

CloudFront コンソールの **[セキュリティ]**、**[オリジンアクセス]**、**[アイデンティティ (レガシー)]** で OAI ID を検索します。または、CloudFront API の [ListCloudFrontOriginAccessIdentities](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListCloudFrontOriginAccessIdentities.html) を使用します。

**Example OAI に読み取りアクセスを許可する Amazon S3 バケットポリシー**  
次の例では、指定されたバケット (`s3:GetObject`) 内のオブジェクトの読み取りを OAI に許可します。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity {{<origin access identity ID>}}"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{{<S3 bucket name>}}/*"
        }
    ]
}
```

**Example OAI に読み取りおよび書き込みアクセスを許可する Amazon S3 バケットポリシー**  
次の例では、指定されたバケット (`s3:GetObject` と `s3:PutObject`) 内のオブジェクトの読み取りおよび書き込みを OAI に許可します。これにより、ビューワーは CloudFront を介して Amazon S3 バケットにファイルをアップロードできます。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity {{<origin access identity ID>}}"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::{{<S3 bucket name>}}/*"
        }
    ]
}
```

#### Amazon S3 オブジェクト ACL を使用する (非推奨)
<a name="private-content-updating-s3-acls"></a>

**重要**  
[Amazon S3 バケットポリシーを使用して](#private-content-updating-s3-bucket-policies) OAI へのアクセスを S3 バケットに与えることを推奨します。このセクションで説明したようにアクセスコントロールリスト (ACL) を使用できますが、お勧めしません。  
Amazon S3 では**所有権が強化されたバケット**に [S3 オブジェクトの所有権](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)を設定することを推奨しており、すなわち、バケットとその中のオブジェクトについて ACL が無効になっているということです。この設定を [オブジェクトの所有権] に適用する場合は、バケットポリシーを使用して OAI へのアクセスを与える必要があります (前のセクションを参照)。  
次のセクションは、ACL を必要とするレガシーユースケースのみを対象としています。

Amazon S3 バケット内のファイルへのアクセス許可を CloudFront OAI に付与するには、次の方法でファイルの ACL を作成または更新します。
+ [Amazon S3 コンソール](https://console.aws.amazon.com/s3/home)で、Amazon S3 オブジェクトの [**アクセス許可**] タブを使用する。
+ Amazon S3 API の [PutObjectAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectAcl.html) を使用する。

ACL を使用して OAI へのアクセスを許可する場合、Amazon S3 の正規ユーザー ID を使用して OAI を指定する必要があります。CloudFront コンソールでは、この ID を **[セキュリティ]**、**[オリジンアクセス]**、**[アイデンティティ (レガシー)]** で検索できます。CloudFront API を使用している場合は、OAI の作成時に返された `S3CanonicalUserId` 要素の値を使用するか、CloudFront API の [ListCloudFrontOriginAccessIdentities](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListCloudFrontOriginAccessIdentities.html) を呼び出します。

### 署名バージョン 4 の認証のみをサポートする Amazon S3 リージョンでオリジンアクセスアイデンティティを使用する
<a name="private-content-origin-access-identity-signature-version-4"></a>

新しい Amazon S3 リージョンでは、リクエストの認証用に署名バージョン 4 を使用する必要があります。(各 Amazon S3 リージョンでサポートされている署名バージョンについては、「*AWS 全般のリファレンス*」の「[Amazon Simple Storage Service エンドポイントおよびクォータ](https://docs.aws.amazon.com/general/latest/gr/s3.html)」を参照してください)。オリジンアクセスアイデンティティを使用しており、バケットが、署名バージョン 4 が必要なリージョンの 1 つにある場合、以下の点に注意してください。
+ `DELETE`、`GET`、`HEAD`、`OPTIONS`、および `PATCH` リクエストは条件なしでサポートされます。
+ `POST` リクエストはサポートされません。