🙌
[小ネタ]AWS CDKでpublicなS3を作るときにBlockPublicAccess設定が必要
2023年4月以降、S3バケット作成時はパブリックアクセスがブロックされる設定になる
すべての新しい S3 バケットに対して自動的に S3 パブリックアクセスブロックが有効になり、S3 アクセスコントロールリスト (ACL) は無効にされます。これらのデフォルト設定は導入されると、AWS CLI、API、SDK、AWS CloudFormation などの作成方法に関係なく、すべての新しいバケットに適用
やりたいこと
- S3の静的ファイルにアクセスできるようにしたい
- CDKでpublicなS3を作って
- バケットポリシーを設定する
今までのコードをコピペするとエラー
今までは問題なかったようですが、s3:PutBucketPolicy Access Denied
というエラーが出るようになっています。しかし分かりにくいエラーですね。。
❌ Deployment failed: Error: Stack Deployments Failed: Error: The stack named CdkApprovalMultiStepsStack failed creation, it may need to be manually deleted from the AWS console: ROLLBACK_COMPLETE: API: s3:PutBucketPolicy Access Denied
(これはエラー)
import * as s3 from 'aws-cdk-lib/aws-s3';
const bucket1 = new s3.Bucket(this, 'bucket1', {
publicReadAccess: true,
websiteIndexDocument: 'index.html',
});
bucket1.addToResourcePolicy(
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
principals: [new iam.ServicePrincipal('lambda.amazonaws.com')],
actions: ['s3:GetObject'],
resources: [`${bucket1.bucketArn}/*`],
}),
);
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ACLS
を追加する
修正方法: import * as s3 from 'aws-cdk-lib/aws-s3';
const bucket1 = new s3.Bucket(this, 'bucket1', {
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ACLS, // <-- Added
publicReadAccess: true,
websiteIndexDocument: 'index.html',
});
bucket1.addToResourcePolicy(
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
principals: [new iam.ServicePrincipal('lambda.amazonaws.com')],
actions: ['s3:GetObject'],
resources: [`${bucket1.bucketArn}/*`],
}),
);
参考
(これはエラー)
(対応仕方の答えあり)
Discussion