使用AWS CloudFormation创建EC2密钥对失败,求助原因与解决方案
问题原因与解决方法
错误原因
你的问题核心在于CloudFormation创建AWS::EC2::KeyPair资源时,依赖AWS自动生成密钥对的场景下,资源处理程序无法正确完成私钥的返回/校验流程:EC2实际已经成功生成了密钥对,但CloudFormation的资源处理逻辑在后续步骤中出现内部异常,导致标记资源为CREATE_FAILED。后续堆栈回滚尝试删除已存在的密钥对时,同样触发了相同的内部错误,最终导致DELETE_FAILED。
这种情况通常关联以下场景:
- CloudFormation执行角色缺少获取私钥或执行删除操作的必要权限
- 当前AWS区域服务临时出现内部故障
- 未通过
PublicKeyMaterial导入公钥,依赖自动生成密钥对的流程存在兼容性问题
解决步骤
1. 手动清理残留密钥对
先登录EC2控制台,找到名称为myKey的密钥对,手动删除它,解决当前堆栈回滚失败的状态。
2. 改用导入公钥的方式创建(推荐)
相比让AWS自动生成密钥对,导入本地生成的公钥更稳定,能避免私钥返回环节的异常。操作流程:
- 本地生成ed25519密钥对:
ssh-keygen -t ed25519 -f myKey -N "" - 打开生成的
myKey.pub文件,复制全部公钥内容 - 修改CloudFormation模板,添加
PublicKeyMaterial属性,示例如下:AWSTemplateFormatVersion: "2010-09-09" Description: A sample template Resources: MyEC2KeyPair: Type: "AWS::EC2::KeyPair" Properties: KeyName: myKey KeyType: ed25519 PublicKeyMaterial: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI[...] 替换为你的公钥内容"
3. 检查CloudFormation执行权限
确保CloudFormation使用的执行角色拥有以下IAM权限:
ec2:CreateKeyPairec2:DeleteKeyPairec2:DescribeKeyPairs
4. 处理区域临时故障
如果上述操作后仍出现InternalFailure,大概率是当前AWS区域的服务临时故障,可以尝试切换到其他区域重新部署模板,或等待一段时间后重试。
内容的提问来源于stack exchange,提问作者agongji
相关产品推荐
相关产品推荐

