EC2实例配置文件KMS权限问题导致ASG创建的EC2实例启动后终止
问题根因排查与修复方案
核心问题1:IAM权限拼写错误
你当前实例IAM策略中的kms:GenerateDataKeyWithoutPlainText为错误写法,AWS IAM权限大小写敏感,正确权限名为kms:GenerateDataKeyWithoutPlaintext(末尾t为小写),拼写错误直接导致KMS权限校验失败。
核心问题2:KMS密钥策略缺失必要权限
EC2实例启动阶段(实例角色未加载完成时)的EBS加密卷挂载操作由EC2、Auto Scaling服务主体执行,你仅给实例角色授予了KMS权限,但未在KMS客户管理密钥(CMK)的密钥策略中给对应服务主体授予操作权限,这是最常见的启动失败原因。
修复步骤
- 修正实例IAM策略的拼写错误
更新data "aws_iam_policy_document" "instance_policy"中的KMS动作列表:
statement { actions = [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt", "kms:GenerateDataKey", "kms:DescribeKey", "kms:GenerateDataKeyWithoutPlaintext" ] resources = [var.device_encryption_key] }
- 更新KMS密钥的资源策略
如果你是用Terraform管理该KMS密钥,直接在aws_kms_key资源的policy中添加如下statement:
statement { sid = "Allow EC2 and ASG service access for EBS encryption" effect = "Allow" principals { type = "Service" identifiers = [ "ec2.amazonaws.com", "autoscaling.amazonaws.com" ] } actions = [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ] resources = ["*"] }
如果密钥不是当前Terraform栈管理,直接到AWS KMS控制台找到对应密钥,在密钥策略中添加上述权限即可。
3. 验证修复
重新执行terraform apply更新配置,触发ASG实例滚动更新,确认实例可正常启动运行。
额外注意事项
当前实例角色授予了ec2:*的全权限,生产环境建议根据实际使用场景收紧权限,避免权限过大带来的安全风险。
内容的提问来源于stack exchange,提问作者Manish Garotki
相关产品推荐
相关产品推荐

