デフォルト暗号化したS3バケットのファイルをコピーできなかった

デフォルト暗号化されたS3バケットに対してEC2インスタンスからファイルをコピーしたり、S3バケットにあるファイルを取得をしようとしたりとするとエラーになったので、対応策を記載します。

# 前提条件
* EC2はAmazon Linux2
* EC2にはS3バケットへのフルアクセス権限を許可するIAMロールをアタッチする
* S3バケットはデフォルト暗号化を有効にする
* デフォルトの暗号化はSSE-KMSを利用する
* KMSキーは新規作成したデフォルト設定のCMKを利用する

# 検証環境で問題を再現させる

### S3バケットを新規作成する
デフォルト設定でS3バケットを新規作成します。

### EC2用IAMロールを作成する
今回マウントするS3バケットに対するS3のフルアクセス権限を持ったIAMポリシーを作成し、IAMロールにアタッチします。
IAMポリシーは以下のようにしました。
~~~
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::[S3バケット名]",
                "arn:aws:s3:::[S3バケット名]/*"
            ]
        }
    ]
}
~~~


### EC2を新規作成する
一般的な手順でEC2を構築します。
構築時に上記で作成したIAMロールを選択します。

### KMSでカスタマー管理型のキーを作成する
全てデフォルトの設定のままカスタマー管理型のキーを作成します。
キーの管理アクセス許可やキーの使用アクセス許可では何も指定せず、キーポリシーはデフォルトの設定となります。

作成したキーの暗号化設定は以下の通りです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/ae7162af-92b7-f79c-4f46-e973148b7479.png)

### S3バケットを暗号化する
上記で作成したカスタマー管理型のキーを用いてデフォルトの暗号化を有効にします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/8de42841-12e3-bb55-8a6c-f03fbdd6f5d2.png)

### EC2からS3バケットへのアクセスを試す
* S3バケットにtest1.txtというファイルを置いてからファイル一覧を取得します。
`aws s3 ls s3://[S3バケット名]`
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/3ae4c24e-b94c-6342-c2af-c16882521f50.png)
**→成功**

* ホームディレクトリにファイルtest2.txtを新規作成し、CLIコマンドでS3バケットにコピーします。
`aws s3 cp test2.txt s3://[S3バケット名]`
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/bfb93694-3ce7-a772-1bf2-3d48f59b7a88.png)
**→失敗**
リソース名を隠しているのでわかりづらいですが、「EC2インスタンスにアタッチされたIAMロールは、カスタマー管理型のキーにおいてkms:GenerateDataKeyが許可されていません」というエラーメッセージが出ています。

* S3バケットにあるファイルtest1.txtをホームディレクトリにコピーします。
`aws s3 cp s3://[S3バケット名]/test1.txt /home/ec2-user/`
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/84466bba-00d3-ed8d-c78f-35cad12c6f5e.png)
**→失敗**


### KMSのキーポリシーを編集する
どうやらEC2にアタッチしたIAMロールが、KMSのキーポリシーでアクションを許可されていないのが原因のようです。
キーポリシーはデフォルトのままになっていますので、KMSのキーポリシーを編集してIAMロールにKMSのフルアクセス権限を付与してみます。
※今回は検証のためにざっくりフルアクセス権限を付与しますが、実際利用する場合は権限を制限します。

~~~
{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[AWSアカウントID]:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[AWSアカウントID]:role/[IAMロール名]"
            },
            "Action": "kms:*",
            "Resource": "*"
        }
    ]
}
~~~

### 動作確認
先ほどのコマンドをもう一度試してみます。
* S3バケットにtest1.txtというファイルを置いてからファイル一覧を取得します。
`aws s3 ls s3://[S3バケット名]`
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/69ae12d8-3ffb-eccf-10ce-fcddd9c68de6.png)
**→成功**

* ファイルtest2.txtをCLIコマンドでS3バケットにコピーします。
`aws s3 cp test2.txt s3://[S3バケット名]`
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/1e21c216-41db-d4ab-109d-5e2cb83bbfea.png)
**→成功**

* S3バケットにあるファイルtest1.txtをホームディレクトリにコピーします。
`aws s3 cp s3://[S3バケット名]/test1.txt /home/ec2-user/`
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/89ab70f1-360b-e232-71d8-725ac323467a.png)
**→成功**

# 結論
S3のデフォルト暗号化に使ったCMKのキーポリシーで、EC2にアタッチしているIAMロールにKMSに対する権限を付与する必要がある。