背景
・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
このエラーメッセージで調べて、解決方法を見つかりました。
例 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