インフラエンジニアの木村(@K2020_js)です!前回は以下自己紹介ブログをしたので、今回、別アカウントの暗号化されたAMIを使用してAuto Scalingで使用しようとすると、権限のエラーでハマってしまったので、その解決方法を紹介したいと思います!
今回の事象
今回私は上記のように、下記手順でアカウントAのAMIでアカウントBでEC2とAutoScalingを立ち上げようとしました。
- アカウントAのAMIをアカウントBに共有
- アカウントAのカスタマー管理KMSのキーポリシーをアカウントBでもこのKMSを復号化できるように修正
- アカウントBでアカウントAのKMSに対しての権限をIAMロールで設定。
- 1で共有されたAMIを使ってEC2を作成(こちらは成功)
- 1で共有されたAMIを使って起動テンプレートを作り、AutoScalingGroupでEC2を立ち上げ(こちらは失敗…)
「なぜ手順4はうまくいって、手順5は失敗するのか…」その謎は次の題目より説明させていただきます。
今回の失敗理由
早速、失敗した理由について説明させていただきます。原因としてはIAMロールです。実はAutoScalingにはAutoScalingで動いているEC2に紐づいたIAMロールの他に、AutoScalingGroup自体にもサービスロールというものがついています。
AMIの暗号化を復号化するときに、AutoScalingGroupはこのサービスロールの権限でKMSキーを使うので、先ほどの手順3で作ったIAMロールでは意味がなく、権限の違いでエラーとなり、AutoScalingでのEC2立ち上げに失敗します。
また、サービスロールはIAMポリシーの変更ができないので、ただ単純にポリシーの変更だけでは解決できないというハマりポイントがあります。
解決手順
AWS CLIでコマンドを打って無理やり、アカウントBのAutoScalingGroupのサービスロールでアカウントAのKMSの復号化をできるように、アカウントAのKMSに対して権限(Grant)を修正してやる必要があります。下記よりその手順を記載します。
1. アカウントAのKMSのキーポリシーに、アカウントBからの権限付与ができるポリシーをつける
アカウントAのキーポリシーを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
{ "Version": "2012-10-17", "Id": "key-consolepolicy-3", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<アカウントAのID>:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow external account use of the KMS", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<アカウントBのID>:root" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources in external account", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<アカウントBのID>:root" }, "Action": "kms:CreateGrant", "Resource": "*" } ] } |
2. アカウントBのcloudshellから下記AWS CLIコマンドを実行する
1 2 3 4 |
$ aws kms create-grant \ --key-id <アカウントAのKMSのARN> \ --grantee-principal arn:aws:iam::<アカウントBのID>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling \ --operations Decrypt GenerateDataKeyWithoutPlaintext ReEncryptFrom ReEncryptTo CreateGrant |
あとは、通常通りアカウントAのKMSで暗号化されたAMIを使って、アカウントBでAutoScalingGroupのEC2を立ち上げればOK!
まとめ
このトラブルに直面して、AutoScalingにこんな罠があったとは…と実感しました。私はこのエラー対応で1日費やしてしまったので、この記事をご覧になった方が、同じようなトラブルに遭遇されないことを心から願っております。
1992年生まれのインフラエンジニア。建築資材の営業マンから、エンジニアへキャリアチェンジし、エンジニア歴としては3年目となる。都内の受託会社にて様々なAWS案件に携わり、3年目にてAWS All Certification EngineersやAWS Top Engineersに選出される。業務領域を超えた幅広い知識を身につけるためTechBullコミュニティへ参画。業界未経験という立場からインフラエンジニアへキャリアアップした経験やクラウド関連の記事を執筆。