問題
CDKで作成したCloudFront。
CloudFrontで公開するだけの場合は特に何も問題なかった。
WAFやらなんやら入れようとクロスリージョンで作成した際、Access Deniedになった。
不足していた設定
バケットポリシーがオリジンアクセスに対応したものではなかった
同様にCloudFrond側のオリジンアクセスがPublicになっていた。
改修後のバケットポリシー
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,
});