Auto Scalingで別アカウントの暗号化されたAMIを使用すると失敗する件について

インフラエンジニアの木村(@K2020_js)です!前回は以下自己紹介ブログをしたので、今回、別アカウントの暗号化されたAMIを使用してAuto Scalingで使用しようとすると、権限のエラーでハマってしまったので、その解決方法を紹介したいと思います!

インフラエンジニアになってから3年目になったので振り返る


今回の事象

今回私は上記のように、下記手順でアカウントAのAMIでアカウントBでEC2とAutoScalingを立ち上げようとしました。

  1. アカウントAのAMIをアカウントBに共有
  2. アカウントAのカスタマー管理KMSのキーポリシーをアカウントBでもこのKMSを復号化できるように修正
  3. アカウントBでアカウントAのKMSに対しての権限をIAMロールで設定。
  4. 1で共有されたAMIを使ってEC2を作成(こちらは成功)
  5. 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のキーポリシーを以下のように編集してください。

2. アカウントBのcloudshellから下記AWS CLIコマンドを実行する

あとは、通常通りアカウントAのKMSで暗号化されたAMIを使って、アカウントBでAutoScalingGroupのEC2を立ち上げればOK!


まとめ

このトラブルに直面して、AutoScalingにこんな罠があったとは…と実感しました。私はこのエラー対応で1日費やしてしまったので、この記事をご覧になった方が、同じようなトラブルに遭遇されないことを心から願っております。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール