AMIをアカウント間で共有する方法

■1. やりたいこと

アカウント間でAMIを共有し、共有先のアカウントで共有化したAMIを元としたEC2インスタンスを起動する。

EC2インスタンスに割り当てるEBSボリュームは暗号化するものとし、kmsキーは以下の条件を満たすようにする。

  • 共有元アカウントではEBSボリュームをカスタマー管理型のkmsキーで暗号化する。
  • 共有先アカウントではEBSボリュームを共有先アカウントで作成したカスタマー管理型のkmsキーで暗号化する。

■2. 共有元アカウントでやること

キーポリシーの設定

EBSボリュームの暗号化に使用しているkmsキーのキーポリシーを編集して、共有先のアカウントでの復号化するための権限を与える必要があります。

"Sid": "Allow use of the key for AMI sharing"のステートメントにて共有先アカウントでの使用権限を設定しています。

{
   "Id": "key-consolepolicy-3",
   "Version": "2012-10-17",
   "Statement": [
       {
           "Sid": "Enable IAM User Permissions",
           "Effect": "Allow", 
           "Principal": {
               "AWS": "arn:aws:iam::<Source-Account-ID>:root"
           },
           "Action": "kms:*",
           "Resource": "*"
       },
       {
           "Sid": "Allow use of the key for AMI sharing",
           "Effect": "Allow",
           "Principal": {
               "AWS": "arn:aws:iam::<Target-Account-ID>:root"
           },
           "Action": [
               "kms:Decrypt",
               "kms:CreateGrant", 
               "kms:ReEncrypt*",
               "kms:GenerateDataKey*",
               "kms:DescribeKey"
           ],
           "Resource": "*"
       }
   ]
}

AMIの作成

次に、上記のkmsキーで暗号化されたEC2インスタンスからAMIを作成しましょう。
対象のEC2インスタンスを選択し、アクションからイメージの作成を行います。

AMIの許可編集

AMIをアカウント間で共有されるように設定していきましょう。
作成したAMIのステータスが「利用可能」になったら、AMI許可の編集から設定を行っていきます。

AMI許可編集の画面では

「アカウント許可を作成するときに、関連付けられたスナップショットに [ボリュームを作成] の許可を追加します。」
にチェックを入れましょう。

これはアクセス許可をAMIに紐づいたEBSボリュームにも与える必要があるからですね。

「アカウントIDを追加」から共有先のアカウントIDを追加して設定を保存したら、共有元アカウントで行う設定は完了となります。

■3. 共有先アカウントでやること

AMIの確認

早速共有先アカウントでAMIが共有されていることを確認しましょう。
AMIの画面はデフォルトでは表示項目が「自己所有」になっており、共有化されたAMIが表示されません。そこで、「プライベートイメージ」を表示項目に選択する必要があります。

プライベートイメージを選択することで、共有化されたAMIを確認することができました。

EC2インスタンスの立ち上げ

ではAMI画面から対象AMIを選択後「AMIからインスタンスを起動」を押下して、共有化されたAMIからEC2インスタンスを立ち上げましょう!

EC2インスタンスの設定にて、EBSボリュームの暗号化キーに共有先アカウントで作成したkmsキーを指定することが確認できます。

EC2インスタンスの設定を終えると、インスタンスが起動し無事ステータスチェックに合格していることを確認できました!

■4. おわりに

無事共有元のAMIからEC2インスタンスを立ち上げることができました!
今回は共有AMIからインスタンスを立ち上げましたが、この状態だとアカウント間でAMIの依存関係が残ってしまうため、共有後にコピーしたAMIを使用した方が環境間の分離が行われるかと思います。

参考:AWS公式ドキュメント

Last modified: 2025-02-16

Author