背景

・KMSでCMKを作成し、EBSを暗号化しています。
・CMKで暗号化したAMIでAuto Scalingを作成する
・yaml形式のファイルを使って、CloudFormaitonで作成する

問題

CloudFormaiton画面でエラーメッセージの確認

CloudFormaitonでAuto Scalingのスタックを作成時、下記のエラーが出ました。

スタックのステータスがCREATE_IN_PROGRESSからCREATE_FAILEDになるまで、1時間以上掛かりました。

Auto Scalingのスタックエラー:

Group did not stabilize. {current/minSize/maxSize} group size = {0/1/2}.

このエラーで調べましたが、解決方法が見つかりませんでした。

Auto Scaling グループ画面でエラーメッセージの確認

Launching a new EC2 instance: i-00603f2f146012670. Status Reason: Instance became unhealthy while waiting for instance to be in InService state. Termination Reason: Client.InternalError: Client error on launch

このエラーメッセージで調べて、解決方法を見つかりました。

解決方法(参考):
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/key-policy-requirements-EBS-encryption.html#policy-example-cmk-access

例 1: CMK へのアクセスを許可するキーポリシーセクション

以下の 2 つのポリシーステートメントをカスタマー管理の CMK のキーポリシーに追加して、例の ARN を、CMK へのアクセスが許可されている適切なサービスにリンクされたロールの ARN に置き換えます。次の例では、AWSServiceRoleForAutoScaling という名前のサービスにリンクされたロールに、カスタマー管理の CMK を使用するアクセス許可を付与します。

{
   "Sid": "Allow service-linked role use of the CMK",
   "Effect": "Allow",
   "Principal": {
       "AWS": [
           "arn:aws:iam::123456789012:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"
       ]
   },
   "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::123456789012:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"
       ]
   },
   "Action": [
       "kms:CreateGrant"
   ],
   "Resource": "*",
   "Condition": {
       "Bool": {
           "kms:GrantIsForAWSResource": true
       }
    }
}

解決方法

こちらでは、yaml形式のファイルでCMKを作成しているので、CMKのyamlファイルを下記のように追加します。

        - Sid: Allow service-linked role use of the CMK
          Effect: Allow
          Principal:
            AWS:
              - !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling
          Action:
          - kms:Encrypt
          - kms:Decrypt
          - kms:ReEncrypt*
          - kms:GenerateDataKey*
          - kms:DescribeKey
          Resource: "*"

        - Sid: Allow attachment of persistent resources AutoScaling
          Effect: Allow
          Principal:
            AWS:
              - !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling
          Action:
          - kms:CreateGrant
          Resource: "*"
          Condition:
            Bool:
              kms:GrantIsForAWSResource: true

CMKのyamlファイルを修正して、CMKのスタックを更新してから、
Auto Scalingのスタックを作成すると、エラーがなく作成できました。

まとめ

CloudFormaitonでAuto Scalingを作成する場合、不適切なエラーメッセージが出る場合があります。この場合、Auto Scaling画面でもエラーメッセージを確認してから調べましょう。

結論:CMKを使って暗号化したAMIでAuto Scalingを作成する場合、CMKのポリシーで権限付与しないといけません。
また、下記の場合はCMKのポリシーでAuto Scalingを作成する権限の付与が不要です。
・デフォルトKMS暗号化の使う場合
・暗号化しない場合

参考

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html

Last modified: 2021-09-16

Author