継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

CloudFront でのアカウント跨ぎでアクセスログとオリジンアクセスアイデンティティを設定する

タダです。

Amazon CloudFront(以下、CloudFront)から Amazon S3(以下、S3)にアカウント跨ぎでアクセスさせる必要があり、次の2つの設定検証を行いました。

今回は上記の検証結果をまとめていきます。

CloudFront のアクセスログをアカウント跨ぎで S3 に格納

CloudFront のアクセスログは S3 に格納することができます。

同一アカウントであれば S3 バケットの情報がリストされて、アクセスログの出力先を指定できます。 f:id:sadayoshi_tada:20190209140300p:plain

別アカウントの 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 側のアクセスログ設定」を行うと自動的に反映されます。 f:id:sadayoshi_tada:20190209153412p:plain

参考

docs.aws.amazon.com

2. CloudFront 側のアクセスログ設定

CloudFrontの「Distribution Settings」においてまず、「Logging」を有効化します。

次に、「Bucket for Logs」および「Log Prefix」を設定します。

f:id:sadayoshi_tada:20190209152522p:plain

S3 バケットのアクセスコントロール設定が問題なければ、正常に設定完了します。

エラーが表示された場合、S3 バケットのアクセスコントロール設定を再度見直してみると良いと思います。

CloudFront のオリジンアクセスアイデンティティの設定をアカウント跨ぎで設定

CloudFront のオリジンアクセスアイデンティティは、 S3 バケットからのコンテンツ配信する際に設定します。

この設定もアカウントまたぎを行うには、アクセスログ設定同様に個別のバケット情報を入力する必要があります。

1. CloudFront 側のオリジンアクセスアイデンティティ設定

CloudFront 側の設定で、まずはオリジンアクセスアイデンティティを発行します。

発行した後に、設定編集画面から「Amazon S3 Canonical User Id」の情報をコピーしておきます( S3 バケットポリシー設定で使います) f:id:sadayoshi_tada:20190209144209p:plain

次に、オリジンの設定を行なっていきます。

オリジンの設定では、以下の設定を行います。

  • 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」を設定 f:id:sadayoshi_tada:20190209144215p:plain

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バケット名]/*"
        }
    ]
}

参考

docs.aws.amazon.com

3. Route53 に CloudFront のレコードを追加

最後に Route53 に CloudFront のレコード( xxxx.cloudfront.net )を設定します。

A レコードの Alias もしくは CNAME レコードで登録し、各エッジロケーションの情報が伝搬されればコンテンツにアクセス可能です。

まとめ

CloudFrontのアカウントまたぎでのS3バケット周りの設定方法を紹介しました。

最近のAWSの利用形態が、1つのアカウントでの運用から用途に応じてマルチアカウントかつ、マルチリージョンでの利用が増えてきた印象です。

AWSの権限制御の仕組みを理解することが意図した設定を実現するために必要だと改めて感じました。

今後もアカウントまたぎでの設定を行なった場合はブログにアウトプットしていきます。