Skip to content

AWS クロスリージョンのCloudFrontがAccess Deniedになる

公開日

問題

CDKで作成したCloudFront。
CloudFrontで公開するだけの場合は特に何も問題なかった。
WAFやらなんやら入れようとクロスリージョンで作成した際、Access Deniedになった。

不足していた設定

バケットポリシーがオリジンアクセスに対応したものではなかった

CloudFrontOriginAccessControl

同様にCloudFrond側のオリジンアクセスがPublicになっていた。

CloudFrontOriginAccessControl

改修後のバケットポリシー

bucket-policy.json
{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipal",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::XXXXXXX-XXXXXX/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::XXXXXXXXXXX:distribution/XXXXXXXX"
                }
            }
        }
    ]
}

CDK

  • origin: origins.S3BucketOrigin.withOriginAccessControl(s3) でオリジンアクセスコントロールを設定しているように見える
  • クロスリージョンでやると設定されない?
lib/global-region-stack.ts
 
const s3BucketArn = props.remoteOutput.s3BucketArn;
const s3 = cdk.aws_s3.Bucket.fromBucketArn(this, "S3Bucket", s3BucketArn);
//Webホスティング
//CloudFrontを使ってホスティングする
new cloudfront.Distribution(this, "BootCampDistribution", {
    comment: "Bootcamp Workshop Distribution",
    defaultRootObject: "index.html",
    defaultBehavior: {
        origin: origins.S3BucketOrigin.withOriginAccessControl(s3),
        cachePolicy: cloudfront.CachePolicy.CACHING_OPTIMIZED,
        cachedMethods: cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS,
        allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
    },
    webAclId: props.remoteOutput.webAclArn,
});