Amazon Simple Storage Service (Amazon S3) バケットへのアクセスを制限して、ユーザーが Amazon CloudFront ディストリビューションからのみオブジェクトにアクセスできるようにしたいと考えています。
解決策
S3 バケットへのアクセスを制限するには、オリジンアクセスコントロール (OAC) を作成するか、従来の方法であるオリジンアクセスアイデンティティ (OAI) を作成します。従来の OAI ではなく、OAC の作成をおすすめします。
重要: 始める前に、CloudFront ディストリビューションの Amazon S3 オリジンを REST API エンドポイントとして設定したことを確認してください (例: AWSDOC-EXAMPLE-BUCKET.s3.amazonaws.com)。この解決策は、ウェブサイトエンドポイントとして設定した Amazon S3 オリジン (例: AWSDoc-Example-bucket.s3-website-US-East-1.amazonaws.com) には適用されません。詳細については、「CloudFront を使用して Amazon S3 でホストされている静的ウェブサイトを提供する方法を教えてください。」を参照してください。
CloudFront OAC を作成する
次の手順を実行します。
- CloudFront コンソールを開きます。
- ナビゲーションペインで [ディストリビューション] を選択し、アクセス制限を行う S3 バケットのコンテンツを提供するディストリビューションを選択します。
- [オリジン] タブを選択します。
- Amazon S3 オリジンを選択し、[編集] を選択します。
- [オリジンアクセス] で **[オリジンアクセスコントロール設定 (推奨)]**を選択します。
- [オリジンアクセスコントロール] で既存の OAC を選択するか、**[新しい OAC を作成]**を選択します。
- ダイアログボックスにコントロール設定の名前を入力します。デフォルト設定は [リクエストに署名する (推奨)] のままにしておくことをおすすめします。
- [作成] を選択します。
- [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"
}
}
}
}
注: DOC-EXAMPLE-BUCKET をバケット名に、arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE を CloudFront ディストリビューションの Amazon リソースネーム (ARN) に置き換えてください。CloudFront OAC がバケットからオブジェクトを読み取れるようにするには、上記のステートメントをバケットポリシーに追加する必要があります。バケットへのアクセスを制限すると、AWS WAF を統合してセキュリティ層を追加できます。
従来の CloudFront OAI を作成する
次の手順を実行します。
- CloudFront コンソールを開きます。
- ナビゲーションペインで [ディストリビューション] を選択し、アクセス制限を行う S3 バケットのコンテンツを提供するディストリビューションを選択します。
- [オリジン] タブを選択します。
- Amazon S3 オリジンを選択し、[編集] を選択します。
- [オリジンアクセス] で [レガシーアクセスアイデンティティ] を選択します。
- [オリジンアクセスアイデンティティ] ドロップダウンリストで OAI 名を選択します。または、**[新しい OAI を作成]**を選択します。
- ダイアログボックスに新しい 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/*"
}
注: arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX を CloudFront ディストリビューションの ARN に、AWS****DOC-EXAMPLE-BUCKET をバケット名に置き換えます。バケットポリシーには、CloudFront OAI によるバケットへのアクセスをブロックする、"Effect": "Deny" を含むステートメントがないか確認します。CloudFront OAI がバケット内のオブジェクトにアクセスできるようにするために、該当するアクションを Allow に変更します。また、バケットポリシーには、CloudFront OAI 以外の任意のソースによるバケットへのアクセスを許可する **"Effect": **"Allow" を含むステートメントがないかを確認します。これらのステートメントは、ユースケースに合わせて変更してください。
関連情報
ディストリビューションを作成する
Amazon S3 での ID とアクセス管理