AMI 暗号化時に使用した KMS キーを使ってクロスアカウント先で EC2 インスタンスを起動させてみた – CLI 編

暗号化された AMI を他のアカウントから起動する際、暗号元の KMS キーを使用することができます。
2022.07.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

カナダ・バンクーバーオフィスの山口です。

AMI を他のアカウントと共有する際、コンプライアンス上の理由から AMI を暗号化する必要があるかと思います。今回は、AMI 暗号化時に使用した KMS キーをクロスアカウント先に共有して EC2 インスタンスを起動してみたいと思います。

How to share encrypted AMIs across accounts to launch encrypted EC2 instances

事前作業

① 本ブログでは、2つの AWS アカウントが必要となります。

  • AMI の共有元アカウント (111111111111) <-- ソースアカウント
  • AMI の共有先アカウント (999999999999) <-- ターゲットアカウント

ここでは便宜上 AMI の共有元アカウント (111111111111) をソースアカウント、AMI の共有先アカウント (999999999999) をターゲットアカウントとします。

② ソースアカウント (111111111111) 側で、カスタマーマネージド KMS キーで暗号化された AMI を構築しておきます。

ソースアカウント側 (111111111111) での作業


STEP.1 AMI を共有するための権限を付与する

ソースアカウント側 (111111111111) では、IAM ユーザーまたはロールに EC2インスタンス の [ModifyImageAttribute] 操作権限を付与します。これは AMI を共有するために必要な最小限の権限となります。

例えば AMI (ami-1234xxxxxxxxxxxxx) を共有するためには以下のようなポリシーを作成し、IAM ユーザーまたはロールにアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2: ModifyImageAttribute"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1::image/1234xxxxxxxxxxxxx"
            ]
        }
 ] 
}


STEP.2 カスタマーマネージド KMS キーの共有を許可する

カスタマーマネージド KMS キーを共有するために、KMS キーポリシーにターゲットアカウント ID を追加します。

他のアカウントのユーザーに KMS キーの使用を許可する

まず、ソースアカウント (111111111111) 側にて作成済みのカスタマーマネージド KMS キーを選択します。

次に「別の AWS アカウントを追加」をクリックし、ターゲットアカウント ID (999999999999) を入力します。


STEP.3 AMI の共有を許可する

ターゲットアカウントと AMI を共有するために、対象の AMI の画面でターゲットアカウント ID を入力します。

特定の AWS アカウントとの AMI の共有

ソースアカウント (111111111111) で作成済みの AMI を選択し、「許可」タブ内の「アカウント ID を追加」をクリックした後、ターゲットアカウント ID (999999999999) を入力します。


ターゲットアカウント側 (999999999999) での作業


STEP.4 カスタマーマネージド KMS キーを操作するための権限を付与する

ターゲットアカウント側 (999999999999) では、IAM ユーザーまたはロールに KMS の [DescribeKey, CreateGrant, ReEncrypt*, Decrypt] 操作権限を付与します。これは暗号化された AMI から EC2 インスタンスを起動するために必要な最小限の権限です。

ここでは以下のようなポリシーを作成し IAM ユーザーまたはロールにアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey",
                "kms:ReEncrypt*",
                "kms:CreateGrant",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:ap-northeast-1:111111111111:key/kms-key-id"
            ]                                                    
        }
    ]
}


CLI でインスタンスを起動する

上記の設定が全て完了したら、CLI を使ってインスタンスを立ち上げていきましょう。

まず、事前に以下の内容を「mapping.json」という名前をつけて保存しておきます。ここで指定するソースアカウント側 (111111111111) のカスタマーマネージド KMS キーが、インスタンスボリュームの作成時に用いられます。

[
    {
        "DeviceName": "/dev/xvda",
        "Ebs": {
                "Encrypted": true,
                "KmsKeyId": "arn:aws:kms:ap-northeast-1:111111111111:key/kms-key-id"
        }
    }
]


次に、ターゲットアカウント側 (999999999999) で CLI を使って EC2 インスタンスを立ち上げます。オプションで先ほど作成した「mapping.json」ファイルを指定するので、ファイルを作成したディレクトリで実行するようにしてください。

$ aws ec2 run-instances \
    --image-id ami-1234xxxxxxxxxxxxx \
    --count 1 \
    --instance-type t2.micro \
    --region ap-northeast-1 \
    --subnet-id subnet-9876xxxxxxxxxxxxx \
    --key-name key-pair-name \
    --security-group-ids sg-abcdxxxxxxxxxxxxx \
    --block-device-mappings file://mapping.json


ターゲットアカウント側 (999999999999) で EC2 インスタンスが起動したら、ストレージの「KMS キー ID」の項目を確認します。そうすると、ソースアカウント (111111111111) にて AMI の暗号化時に使用したカスタマーマネージド KMS キーが指定されているのがわかります。


これでターゲットアカウント側で KMS キーを用意しなくても、暗号化された AMI から EC2 インスタンスを起動することができました。

このブログが少しでも皆様のお役に立つことができたら幸いです。

参考URL
How to share encrypted AMIs across accounts to launch encrypted EC2 instances
他のアカウントのユーザーに KMS キーの使用を許可する
特定の AWS アカウントとの AMI の共有