AWS CloudFormation(CFn)でAmazon S3(S3)のブロックパブリックアクセスを設定するのに必要なアクセス許可をCFnのエラーを信じたら騙されたのでメモ。

S3のブロックパブリックアクセスに関しては下記が参考になります。

Amazon S3 Block Public Access – アカウントとバケットのさらなる保護 | Amazon Web Services ブログ
https://aws.amazon.com/jp/blogs/news/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/

S3パブリックアクセス設定を試してみる – Qiita
https://qiita.com/atsumjp/items/cb6ddf5e3df4bbf5e4a7

手順

テンプレートを用意

こんな感じのテンプレートを用意します。PublicAccessBlockConfiguration でブロックパブリックアクセスの設定をします。
BucketNameは任意に指定ください。

template.yaml

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  PublicAccessBlockTestBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: "kai-public-access-block-test"
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True

AWSマネジメントコンソールだとこんな画面で設定します。

AWSユーザーの作成

CFnでスタック作成、リソース管理するのに利用するAWSユーザーを作成して、インラインポリシーで最低限のアクセス許可をします。

インラインポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "s3:CreateBucket",
                "s3:DeleteBucket"
            ],
            "Resource": "*"
        }
    ]
}

スタック作成

ブロックパブリックアクセスを設定するためのActionは最初わからなかったので指定せずにCFnでスタック作成してみました。

> aws cloudformation create-stack \
  --template-body file://template.yaml \
  --stack-name kai-public-access-block-test \
  --profile public-access-block-test

すると、API: s3:PutPublicAccessBlock Access Deniedってエラーになったので、インラインポリシーのActionにs3:PutPublicAccessBlockを指定してみると。。。

識別されないアクションとなりました(´・ω・`)
なぜー?CFnさんが嘘ついてるの?

正しい指定方法を調べてみた

調べてみると、s3:PutBucketPublicAccessBlockが正しいみたいです。

Amazon S3 ブロックパブリックアクセスの使用 – Amazon Simple Storage Service
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/access-control-block-public-access.html

インラインポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "s3:CreateBucket",
                "s3:DeleteBucket",
                "s3:PutBucketPublicAccessBlock"
            ],
            "Resource": "*"
        }
    ]
}

インラインポリシーにs3:PutBucketPublicAccessBlockを追加してスタック作成すると無事にS3バケットのブロックパブリックアクセスが設定できました。

参考

Amazon S3 Block Public Access – アカウントとバケットのさらなる保護 | Amazon Web Services ブログ
https://aws.amazon.com/jp/blogs/news/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/

S3パブリックアクセス設定を試してみる – Qiita
https://qiita.com/atsumjp/items/cb6ddf5e3df4bbf5e4a7

Amazon S3 ブロックパブリックアクセスの使用 – Amazon Simple Storage Service
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/access-control-block-public-access.html

元記事はこちら

AWS CloudFormationでAmazon S3のブロックパブリックアクセスを設定するのに必要なアクセス許可設定