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

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` は任意に指定ください。

```yaml: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マネジメントコンソールだとこんな画面で設定します。
<img width="1331" alt="スクリーンショット 2020-02-05 11.21.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/850f5a4e-0582-a14e-5ac3-e3a5702fb1aa.png">


### AWSユーザーの作成

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

```json:インラインポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "s3:CreateBucket",
                "s3:DeleteBucket"
            ],
            "Resource": "*"
        }
    ]
}
```

### スタック作成

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

```console
> 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` を指定してみると。。。

<img width="1210" alt="スクリーンショット 2020-02-05 11.25.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/42194687-3fbe-01a9-6a5b-9783d3eb72bd.png">

識別されないアクションとなりました(´・ω・｀)
なぜー？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


```json:インラインポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DeleteStack",
                "s3:CreateBucket",
                "s3:DeleteBucket",
                "s3:PutBucketPublicAccessBlock"
            ],
            "Resource": "*"
        }
    ]
}
```

インラインポリシーに`s3:PutBucketPublicAccessBlock` を追加してスタック作成すると無事にS3バケットのブロックパブリックアクセスが設定できました。
<img width="1333" alt="スクリーンショット 2020-02-05 11.28.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/f7affdc8-06f4-4a76-b11d-6895a9d09a68.png">


## 参考

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