AWS API RunInstance未使用指定SSH密钥对问题排查求助
AWS EC2实例密钥对绑定异常排查
问题概述
用Node.js开发的部署流程中,主服务器(MASTER)绑定KEY-M密钥对,客户端实例(CLIENT)绑定KEY-C密钥对,AWS实例列表显示密钥对绑定关系正确,但两个实例的authorized_keys文件内容均为KEY-M的公钥,且该问题为偶发性。
部署核心代码
const deploy_key = await aws.createDeployKeyIfNotExists(region); // ... 省略其他逻辑 ... const run_config = { ImageId: image.ami_id, InstanceType: this.options.type || 't2.micro', MinCount: Math.max(this.options.number || 1, 1), MaxCount: Math.max(this.options.number || 1, 1), KeyName: deploy_key.name, AssociatePublicIpAddress: true, SecurityGroups: [security_group.GroupName], }; const instances = (await aws.ec2(region).runInstances(run_config)).Instances;
排查方向
- 验证
createDeployKeyIfNotExists函数逻辑- 偶发异常时,打印
deploy_key.name的实际值,确认是否确实返回KEY-C的名称而非KEY-M。排查函数内是否存在缓存未更新、并发竞态或区域不匹配的问题,比如误返回KEY-M的信息。
- 偶发异常时,打印
- 检查AMI的预置配置
- 若用于创建实例的AMI本身在镜像中预置了KEY-M的公钥到
~/.ssh/authorized_keys,即使指定新密钥对,部分自定义AMI会覆盖该文件。可单独启动一个绑定KEY-C的临时实例,检查authorized_keys是否仍为KEY-M,以此验证AMI是否存在问题。
- 若用于创建实例的AMI本身在镜像中预置了KEY-M的公钥到
- 排查启动脚本/用户数据
- 检查部署流程是否通过用户数据(UserData)或实例内的启动脚本(如
/etc/rc.d/下的脚本),在实例启动时自动写入KEY-M的公钥。比如主服务器的部署脚本是否误将自身公钥同步到了客户端实例。
- 检查部署流程是否通过用户数据(UserData)或实例内的启动脚本(如
- AWS API状态同步问题
- 偶发性问题可能源于密钥对创建后,AWS服务端未完成状态同步就调用了
runInstances。可在createDeployKeyIfNotExists执行后,添加短暂延迟,或调用describeKeyPairs确认KEY-C状态为可用后,再启动实例。
- 偶发性问题可能源于密钥对创建后,AWS服务端未完成状态同步就调用了
- IAM权限与区域一致性
- 确认部署使用的IAM角色拥有操作密钥对和实例的完整权限,且密钥对创建的区域与实例启动的区域完全一致。若区域不匹配,可能导致找不到KEY-C,进而 fallback 使用默认的KEY-M。
内容的提问来源于stack exchange,提问作者Sukanta Paul
相关产品推荐
相关产品推荐

