我正在尝试在 AWS CloudFormation 中启动 Amazon Elastic Compute Cloud (Amazon EC2) 实例,但收到了 "did not stabilize" 错误。
简短描述
当 CloudFormation 成功启动 EC2 实例,但该实例未能达到稳定状态时,会出现以下错误:
"AWS::EC2::Instance with identifier 'i-abcxyz1234' did not stabilize"
出现上述错误的原因如下:
- 您使用了其他 AWS 账户中的 AWS Key Management Service (AWS KMS) 密钥来加密从中启动 EC2 实例的亚马逊机器映像 (AMI)。
- 您未在 CloudFormation 模板中指定 AWS KMS 密钥。
要解决这些问题,请执行以下操作:
- 更新 AWS KMS 密钥策略,允许对您启动实例的账户执行 AWS KMS 操作。
- 确认账户中存在 AWS KMS 密钥,并且您在模板中指定了 AWS::KMS::Alias。
解决方法
**先决条件:**要确定导致 "did not stabilize" 错误的原因,请在 Event source(事件源)列中使用 kms.amazonaws.com 筛选 AWS CloudTrail 日志。选择 Preferences(首选项)以显示 Error code(错误代码)列,然后打开 Error code(错误代码)。您可以在 Event name(事件名称)列中查找问题。有关更多信息,请参阅如何查看有关 AMI 或快照的加密信息?
更新密钥策略
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
当您尝试跨 AWS 区域或账户访问加密资源时,您可能会在 CloudTrail 日志中收到以下错误消息:
"user/role xyz is not authorized to perform: kms:ReEncryptFrom..."
要获取 AWS KMS 密钥 ID,请完成以下步骤:
- 在 AMI 所在的账户中打开 Amazon EC2 控制台。
- 在导航窗格中,选择 Images(映像),然后选择 AMI。
- 选择 AMI。
- 选择 Storage(存储)选项卡,然后记下 KMS 密钥 ID。
要检查密钥策略是否向您启动实例所在的账户授予 AWS KMS 权限,请参阅查看密钥策略。
以下密钥策略包含必要的 AWS KMS 权限:
{
"Sid": "Allow destination account use of the customer managed key",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::destination-account:root"
]
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
}
**注意:**将 destination-account 替换为您启动实例的账户 ID。
如果密钥策略未包含必要的 AWS KMS 权限,则编辑策略以添加这些权限。此外,请确保向执行堆栈操作的 Identity and Access Management (IAM) 实体授予相同的权限。要添加权限,您可以使用 IAM 控制台或 AWS CLI。要编辑现有 IAM 策略,请参阅编辑 IAM 策略。
在 CloudFormation 模板中指定 AWS KMS 密钥
如果您使用了 BlockDeviceMapping 属性,但未在 CloudFormation 模板中指定 AWS KMS 密钥别名,则会在 CloudTrail 日志中收到 "NotFoundException" 错误消息。
要解决此问题,请在模板中指定 AWS KMS 密钥别名。确保该别名与其关联的密钥位于同一区域和账户中。