使用AWS CDK创建的EC2实例SSH连接超时问题排查
问题分析与解决
核心问题:KeyName参数的设置方式错误
你当前通过instance.instance.add_property_override("KeyName", ...)设置密钥对的方式不符合CDK的规范,大概率是导致密钥对未正确生效的原因。CDK的ec2.Instance构造器本身就提供了key_name参数,直接通过该参数指定密钥对名称才是正确做法。
修正后的代码
将密钥对配置直接整合到ec2.Instance的初始化参数中,移除手动override属性的代码:
import os import aws_cdk as cdk from aws_cdk import aws_ec2 as ec2 class YourStack(cdk.Stack): def __init__(self, scope: cdk.App, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) vpc = ec2.Vpc.from_lookup(self, "VPC", vpc_name=os.getenv("VPC_NAME")) sec_group = ec2.SecurityGroup(self, "SG", vpc=vpc, allow_all_outbound=True) sec_group.add_ingress_rule(ec2.Peer.any_ipv4(), ec2.Port.tcp(22)) sec_group.add_ingress_rule(ec2.Peer.any_ipv6(), ec2.Port.tcp(22)) instance = ec2.Instance( self, "name", vpc=vpc, instance_type=ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO), machine_image=ec2.AmazonLinuxImage( generation=ec2.AmazonLinuxGeneration.AMAZON_LINUX_2 ), security_group=sec_group, key_name=os.getenv("KEYPAIR_NAME") # 直接在此指定密钥对名称 ) elastic_ip = ec2.CfnEIP(self, "EIP", domain="vpc", instance_id=instance.instance_id)
原代码失效原因
add_property_override是修改底层CloudFormation资源属性的低级操作,绕过了CDK的类型检查和资源生命周期管理逻辑。实例创建过程中,CDK会对实例属性做封装处理,手动overrideKeyName可能导致该参数未被正确传递到实例启动元数据中,使得实例无法使用指定密钥对完成SSH认证,最终表现为连接超时。
额外排查点
若修正密钥对配置后仍超时,可检查以下内容:
- 确认弹性IP已成功关联到实例,且你使用该弹性IP进行SSH连接
- 检查VPC路由表,确保实例所在子网配置了正确的互联网网关路由(IPv4)或Egress Only Internet Gateway(IPv6)
- 确认实例所在子网为公有子网(已关联互联网网关),否则绑定弹性IP也无法实现公网访问
内容的提问来源于stack exchange,提问作者A Simple Programmer
相关产品推荐
相关产品推荐

