【AWS】AMIのアカウント間共有を検証


# 概要
この記事は [NTTテクノクロス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ntt-tx) 21日目の記事です。

こんにちは。NTTテクノクロスの木村です。
本記事では AMI（Amazon Machine Image）のアカウント間共有 について、共有方法や暗号化時の注意点を共有します。

複数のAWSアカウントを用いて運用する際に、特定のAWSアカウントで作成したAMIを別のアカウントで利用したい、という場面があるかと思います。
そのような時は、AMIの共有機能を用いると、アカウント間で手軽にAMIを共有することが可能です。
今回は以下の内容でのAMIのアカウント共有方法について検証してみます。
- 共有方法の基本操作
- EBS暗号化の検証
    - 非暗号化→暗号化（共有元の非暗号化EBSを、共有先で暗号化EBSとして使用する）
    - 暗号化→暗号化（共有元の暗号化EBSを、共有先で暗号化EBSとして使用する）

# 手順
## 1. 共有方法の基本操作
### 1-1. 共有元アカウントでの作業 
- `マネジメントコンソール` > `EC2` > `イメージ` > `AMI` > `<共有対象のAMI>` > `アクション` > `AMI許可を編集` を選択する
- `アカウント許可を作成するときに、関連付けられたスナップショットに [ボリュームを作成] の許可を追加します。`をチェックする
:::note info
検証でこちらのチェックの設定漏れがあったのですが、その際に共有先でAMIのコピーを試みると「You do not have permission to access the storage of this ami」というエラーが発生しました。
その後設定を追加してみたのですが、後からの設定ではボリューム作成の権限は設定は追加されず同様のエラーが発生したため、このチェックは最初の共有時に忘れずに設定が必要です。
:::
- `共有アカウント`セクションで `アカウントIDを追加` を選択する
![1-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/d56db247-5785-1a9b-23d7-125fb27e1aee.png)
- 共有先のアカウントIDを入力して `AMIを共有` > `変更を保存` を選択する
![1-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/10f6b102-7d3a-b066-7f1f-bb904a8849af.png)

### 1-2. 共有先アカウントでの作業 
- [マネジメントコンソール] > [EC2] > [イメージ] > [AMI] を選択して、プライベートイメージに共有されたAMIが存在することを確認する
![1-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/174f74ef-2c8d-26af-a3dd-40c35795ce96.png)


## 2. EBS暗号化の検証
### 2-1. 非暗号化→暗号化（共有元の非暗号化EBSを、共有先で暗号化EBSとして使用する）
#### 2-1-1.共有元アカウントでの作業
- 「1. 共有方法の基本操作」と同様の手順で、AMI共有を設定する
#### 2-1-2.共有先アカウントでの作業
- `マネジメントコンソール` > `EC2` > `イメージ` > `AMI` > `<暗号化対象のAMI>` > `アクション` > `AMIをコピー`を選択する
- `AMI コピーの EBS スナップショットを暗号化` にチェックを入れ、`AMIをコピー` を選択する
![2-1-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/4a2ad713-3e78-fc42-3d8c-fff2cc792c8e.png)
- コピーされたAMIを参照すると、EBSスナップショットが暗号化されていることが確認できます。
![2-1-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/774b56a2-dd39-d63d-85f0-c6a07fd09347.png)

### 2-2. 暗号化→暗号化（共有元の暗号化EBSを、共有先で暗号化EBSとして使用する）
#### 2-2-1.共有元アカウントでの作業
- 「1. 共有方法の基本操作」と同様の手順で、暗号化EBSに紐づくAMIに対して、AMI共有を設定する
:::note info
前提として、共有元のEBSスナップショットはAWS マネージドキー（aws/ebs）で暗号化されたスナップショットでは共有不可のため、カスタマーマネージドキーで暗号化します。
:::
- `マネジメントコンソール` > `KMS` > `カスタマー管理型のキー` > `<暗号化に使用したCMK>`> `キーポリシー`セクションで`編集`を選択し、以下ポリシーのように共有先アカウントのユーザーのアクセス許可を設定する
:::note info
暗号化EBSスナップショットを共有する場合、暗号化に使用したカスタマーマネージド型キーに共有先アカウントのユーザーにアクセス権限を設定する必要があります
:::

```
{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<共有元アカウントID>:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<共有元アカウントID>:user/<User>",
                    "arn:aws:iam::<共有先アカウントID>:user/<User>"
                ]
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<共有元アカウントID>:user/<User>",
                    "arn:aws:iam::<共有先アカウントID>:user/<User>"
                ]
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<共有元アカウントID>:user/<User>",
                    "arn:aws:iam::<共有先アカウントID>:user/<User>"
                ]
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}
```

#### 2-2-2.共有先アカウントでの作業
- 「2-1. 非暗号化→暗号化（共有元の非暗号化EBSを、共有先で暗号化EBSとして使用する）」と同様の手順で、共有されたAMIをコピー＆再暗号化します
![2-2-2-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/3eb59bc9-0a32-867a-8c12-bf1eab6ff1a7.png)
- コピーされたAMIを参照すると、EBSスナップショットが再暗号化されていることが確認できます。
![2-2-2-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/f71e9210-0446-4cd2-1263-532c90b2f495.png)

## さいごに
共有元でEBS暗号化している場合はカスタマーマネージドキーにも許可設定が必要など、少し注意する点がありますね。
それでは、 NTTテクノクロス Advent Calendar 2022 22日目も、引き続きお楽しみください。


## 参考サイト
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/sharingamis-explicit.html