Amazon Simple Storage Service (Amazon S3) バケットへのアクセスを制限して、ユーザーが Amazon CloudFront ディストリビューションからのみオブジェクトにアクセスできるようにしたいと考えています。
解決策
**重要:**開始する前に、CloudFront ディストリビューションの Amazon S3 オリジンが、REST API エンドポイント (AWSDoc-Example-bucket.s3.amazonaws.com など) として設定されていることを確認してください。この解決策は、ウェブサイトエンドポイントとして設定されている S3 オリジン (AWSDoc-Example-bucket.s3-website-US-East-1.amazonaws.com など) には適用されません。詳細については、「CloudFront を使用して Amazon S3 でホストされている静的ウェブサイトを提供する方法を教えてください。」を参照してください。
オプション 1 (ベストプラクティス): CloudFront OAC を作成する
CloudFront オリジンアクセスコントロール (OAC) を作成するには、以下の手順を実行します。
- CloudFront コンソールを開きます。
- ディストリビューションのリストから、アクセスを制限したい S3 バケットのコンテンツを提供するディストリビューションを選択します。
- [オリジン] タブを選択します。
- S3 オリジンを選択し、[編集] を選択します。
- [オリジンアクセス] で、**[オリジンアクセスコントロール設定 (推奨)]**を選択します。
- [オリジンアクセスコントロール] では、既存の OAC を選択するか、[コントロールを作成] 設定を選択します。
- ダイアログボックスで、コントロール設定に名前を付けます。デフォルト設定を [リクエストに署名する (推奨)] のままにしておくことをお勧めします。
- [作成] を選択します。
- S3 バケットアクセスの場合、[ポリシーをコピー] を選択し、次に [保存] を選択して、バケットポリシーを S3 バケットに適用します。
- [S3 バケット権限に移動] を選択すると、S3 バケットコンソールに移動します。
- [変更を保存] を選択します。
- Amazon S3 コンソールで、バケットのリストから、CloudFront ディストリビューションのオリジンであるバケットを選択します。
- [権限] タブを選択します。
- [バケットポリシー] に、次のようなステートメントが表示されていることを確認します。
{
"Version": "2012-10-17",
"Statement": {
"Sid": "AllowCloudFrontServicePrincipalReadOnly",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"
}
}
}
}
CloudFront OAC がバケットからオブジェクトを読み取れるようにするには、前述のステートメントを追加する必要があります。
**注:**バケットへのアクセスを制限すると、AWS WAF を統合してセキュリティをさらに強化できます。
オプション 2: レガシークラウドフロント OAI の作成
レガシーの CloudFront オリジンアクセスアイデンティティ (OAI) を作成するには、以下の手順を実行します。
- CloudFront コンソールを開きます。
- ディストリビューションのリストから、アクセスを制限したい S3 バケットのコンテンツを提供するディストリビューションを選択します。
- [オリジン] タブを選択します。
- S3 オリジンを選択し、[編集] を選択します。
- [オリジンアクセス] で、[レガシーアクセスアイデンティティ] を選択します。
- [オリジンアクセスアイデンティティ] ドロップダウンリストで、オリジンアクセスアイデンティティ名を選択します。または、**[新しい OAI を作成]**を選択します。
- ダイアログボックスで、新しいオリジンアクセスアイデンティティに名前を付け、**[作成]**を選択します。
- [バケットポリシー] で [はい、バケットポリシーを自動で更新します] を選択します。
- [変更を保存] を選択します。
- Amazon S3 コンソールで、バケットのリストから、CloudFront ディストリビューションのオリジンであるバケットを選択します。
- [権限] タブを選択します。
- [バケットポリシー] に、次のようなステートメントが表示されていることを確認します。
{{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/*"
}
**注:**バケットポリシーに CloudFront OAI からのバケットへのアクセスを禁止する "Effect": "Deny" を含むステートメントがないか確認してください。CloudFront OAI がバケット内のオブジェクトにアクセスできるように、これらのステートメントを変更します。
また、バケットポリシーに CloudFront OAI 以外の任意のソースからのバケットへのアクセスを許可する "Effect": "Allow" を含むステートメントがないか確認してください。これらのステートメントをユースケースに合わせて変更してください。
関連情報
ディストリビューションの作成
Amazon S3 における ID およびアクセス管理