技術4課の多田です、こんにちは。
Amazon CloudFront(以下、CloudFront)から Amazon S3(以下、S3)にアカウント跨ぎでアクセスさせる必要があり、次の2つの設定検証を行いました。
- CloudFront のアクセスログをアカウント跨ぎで S3 に格納
- CloudFront のオリジンアクセスアイデンティティの設定をアカウント跨ぎで設定
今回は上記の検証結果をまとめていきます。
CloudFront のアクセスログをアカウント跨ぎで S3 に格納
CloudFront のアクセスログは S3 に格納することができます。
同一アカウントであれば S3 バケットの情報がリストされて、アクセスログの出力先を指定できます。
別アカウントの S3 バケットにアクセスログを格納したい場合は、個別にバケット情報を入力し、S3 バケットのアクセスコントロール設定を追加する必要があります。
1. S3 側のアクセスコントロール設定
まずは、S3 のアクセスコントロール設定を行います。
「Access for other AWS accounts」にて「CloudFrontのアカウントのルートユーザーの ID」の情報を追加し、「FULL_CONTROL」を足します。
上記のルートユーザーの ID は、 CloudFront のアカウントで S3 バケットを作成し、アクセスコントロールから「Your AWS account (owner)
Canonical ID」で確認可能です。
2つ目の ID は、後述する「2. CloudFront 側のアクセスログ設定」を行うと自動的に反映されます。
参考
2. CloudFront 側のアクセスログ設定
CloudFrontの「Distribution Settings」においてまず、「Logging」を有効化します。
次に、「Bucket for Logs」および「Log Prefix」を設定します。
- 「Bucket for Logs」に別アカウントの 「S3 バケット名 +.s3.amazonaws.com」を設定
- 「Log Prefix」に別アカウントの S3 バケットのアクセスログを格納するパスを設定
S3 バケットのアクセスコントロール設定が問題なければ、正常に設定完了します。
エラーが表示された場合、S3 バケットのアクセスコントロール設定を再度見直してみると良いと思います。
CloudFront のオリジンアクセスアイデンティティの設定をアカウント跨ぎで設定
CloudFront のオリジンアクセスアイデンティティは、 S3 バケットからのコンテンツ配信する際に設定します。
この設定もアカウントまたぎを行うには、アクセスログ設定同様に個別のバケット情報を入力する必要があります。
1. CloudFront 側のオリジンアクセスアイデンティティ設定
CloudFront 側の設定で、まずはオリジンアクセスアイデンティティを発行します。
発行した後に、設定編集画面から「Amazon S3 Canonical User Id」の情報をコピーしておきます( S3 バケットポリシー設定で使います)
次に、オリジンの設定を行なっていきます。
オリジンの設定では、以下の設定を行います。
- 「Origin Domain Name」に別アカウントの 「S3 バケット名 +.s3.amazonaws.com」を設定
- 「Restrict Backet Access」の設定を「Yes」を設定
- 「Origin Access Identity」の設定を「Use an Existing Identity」を選択し、上記で設定したオリジンアクセスアイデンティティ名を設定
- 「Grant Read Permission on Bucket」の設定を「No, I Will Update Permissions」を設定
2. S3側のバケットポリシー設定
S3のバケットポリシーを以下のように設定します。
「CanonicalUser」の箇所に、「 1. CloudFront 側の設定」でコピーしておいた「Amazon S3 Canonical User Id」を反映します。
{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": " Grant a CloudFront Origin Identity access to support private content", "Effect": "Allow", "Principal": { "CanonicalUser":"CloudFront Origin Identity Canonical User ID" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::[S3バケット名]/*" } ] }
参考
Amazon CloudFront オリジンアイデンティティへのアクセス許可の付与
3. Route53 に CloudFront のレコードを追加
最後に Route53 に CloudFront のレコード( xxxx.cloudfront.net )を設定します。
A レコードの Alias もしくは CNAME レコードで登録し、各エッジロケーションの情報が伝搬されればコンテンツにアクセス可能です。
まとめ
CloudFrontのアカウントまたぎでのS3バケット周りの設定方法を紹介しました。
最近のAWSの利用形態が、1つのアカウントでの運用から用途に応じてマルチアカウントかつ、マルチリージョンでの利用が増えてきた印象です。
AWSの権限制御の仕組みを理解することが意図した設定を実現するために必要だと改めて感じました。
今後もアカウントまたぎでの設定を行なった場合はブログにアウトプットしていきます。