🙌

[小ネタ]AWS CDKでpublicなS3を作るときにBlockPublicAccess設定が必要

2023/05/07に公開

2023年4月以降、S3バケット作成時はパブリックアクセスがブロックされる設定になる

https://aws.amazon.com/jp/about-aws/whats-new/2022/12/amazon-s3-automatically-enable-block-public-access-disable-access-control-lists-buckets-april-2023/

すべての新しい 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}/*`],
      }),
    );

参考

(これはエラー)
https://bobbyhadz.com/blog/aws-cdk-s3-bucket-policy

(対応仕方の答えあり)
https://stackoverflow.com/questions/56045776/aws-cdk-s3putbucketpolicy-access-denied-when-deploying-bucket-with-public-read

Discussion