CloudFront ディストリビューションを使用して Amazon S3 バケットへのアクセスを制限する方法を教えてください。

最終更新日: 2020 年 5 月 28 日

オブジェクトが Amazon CloudFront ディストリビューションを介してのみアクセスできるように、Amazon Simple Storage Service (Amazon S3) バケットへのアクセスを制限したいと考えています。どうすればできますか?

解決方法

重要: ここでの作業を開始する前に、CloudFront ディストリビューションの Amazon S3 オリジンが、REST API エンドポイント (AWSDOC-EXAMPLE-BUCKET.s3.amazonaws.com) として設定されていることを確認してください。この解決方法は、ウェブサイトエンドポイント (AWSDOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com) として設定された S3 オリジンには適用されません。

CloudFront のオリジンアクセスアイデンティティ (OAI) を作成する

1.    CloudFront コンソールを開きます。

2.    配信のリストから、アクセス制限の対象である S3 バケットからのコンテンツを提供しているものを選択します。

3.    [オリジンとオリジングループ] タブを開きます。

4.    S3 オリジンを選択して [編集] をクリックします。

5.    [バケットアクセスの制限] で、[はい] を選択します。

6.    [オリジンアクセスアイデンティティ] で、[新しいアイデンティティを作成] または [既存アイデンティティを使用] のどちらかを選択します。

7.    [バケットの読み取りアクセス許可を付与] で、[はい、バケットポリシーを更新します] を選択します。
注: このステップにより、S3 オリジンのバケットポリシーが更新され、s3:GetObject に対し OAI アクセス権限が付与されます。

8.    [はい、編集します] を選択します。

バケットポリシーを確認する

1.    Amazon S3 コンソールを開きます。

2.    バケットのリストから、CloudFront ディストリビューションのオリジンであるバケットを選択します。

3.    [ ] タブを選択します。

4.    バケットポリシー を選択します。

5.    バケットポリシーエディタで、次のようなステートメントが表示されることを確認します。

{
	"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/*"
}

このステートメントは、OAI 設定手順の中で [はい、バケットポリシーを更新します] を選択している場合に、CloudFront によりバケットポリシーに追加されます。

6.    バケットポリシーの中で、"Effect": "Deny" が含まれる (これにより、CloudFront OAI からバケットへのアクセスを禁止しています) ステートメントを探します。CloudFront OAI がバケット内のオブジェクトにアクセスできるように、これらのステートメントを変更します。

7.    バケットポリシーの中で、"Effect": "Allow" が含まれる (これにより、CloudFront OAI 以外のソースからのバケットへのアクセスを許可しています) ステートメントを探します。ユースケースの必要に応じてこれらのステートメントを変更します。

注: オブジェクトのアクセスコントロールリスト (オブジェクト ACL) を使用してアクセス許可を管理する場合は、同時にその ACL により、CloudFront OAI の外部において対象ファイルへのアクセスが禁止されていることを確認する必要があります。

CloudFront OAI を使用してバケットへのアクセスを制限した後は、AWS WAF を統合することで、新たなセキュリティレイヤーをオプションで追加可能になります。