AWS共享加密AMI用于ASG启动实例时出现客户端启动错误求助
我之前遇到过一模一样的问题!当时折腾了好一阵才找到根源,给你分享下我的解决思路和实操步骤:
控制台手动启动EC2能成功,但ASG启动失败,核心差异在于ASG使用的IAM角色权限和你控制台操作时用的用户权限完全不同,大概率是KMS密钥的权限配置没覆盖到ASG相关的角色。
给ASG服务角色添加KMS权限:
先找到ASG使用的服务角色(默认是AutoScalingServiceRole,如果是自定义角色就用你自己创建的那个),然后去KMS控制台找到共享AMI对应的加密密钥,在「密钥策略」里添加以下权限规则:{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的账号ID:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling" }, "Action": [ "kms:Decrypt", "kms:DescribeKey" ], "Resource": "*" }记得把
你的账号ID替换成实际值,如果用了自定义ASG角色,也要把ARN换成自定义角色的。给实例配置文件(Instance Profile)的角色加KMS权限:
ASG启动实例时会用启动模板里指定的Instance Profile,这个Profile关联的IAM角色也需要有访问该KMS密钥的权限。你可以在KMS密钥策略里添加这个角色,或者直接在IAM角色的权限策略里加:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:DescribeKey" ], "Resource": "arn:aws:kms:你的区域:共享AMI的账号ID:key/密钥ID" } ] }再次确认AMI和KMS的共享设置:
确保共享AMI时,对方不仅共享了AMI资源,还把对应的KMS密钥共享给了你的账号,并且密钥策略里明确允许你的账号(以及相关角色)进行解密操作——手动启动用的是你的个人用户权限,ASG用的是服务角色,这就是两者的关键区别。检查ASG启动模板/配置:
最后再核对下ASG的启动模板,确认选的是正确的共享加密AMI,并且Instance Profile关联的是刚才配置了KMS权限的角色,别不小心选错了模板或者Profile。
如果上面的步骤都做完还是报错,去CloudTrail里搜实例ID i-0a306b1c0c65fb197,找到启动失败对应的API调用记录,里面会有更详细的KMS错误信息,能帮你精准定位问题。
内容的提问来源于stack exchange,提问作者Alastair Montgomery

