为何AWS Lambda无法通过Paramiko SSH连接同VPC下的EC2实例
问题排查与解决方案
核心错误原因
你当前的核心问题是绑定了VPC的Lambda使用公网IP访问同VPC内的EC2:
绑定了VPC的Lambda默认只有私有IP,没有公网访问能力,如果你没有额外为Lambda所在子网配置NAT网关/实例,公网访问请求会直接被丢弃,因此发起SSH公网IP连接时无响应、直接超时。
修复步骤
- 替换连接地址
将ssh_client.connect中的hostname参数从EC2公网IP改为EC2的私有IP,同VPC内资源走私有网络通信无需经过公网,也不需要额外配置NAT。 - 确认安全组配置
- EC2实例的入站安全组:开放22端口,源地址填写Lambda函数的安全组ID,最小权限配置避免暴露公网风险
- Lambda函数的出站安全组:确认开放22端口的出站访问(默认出站规则为全通可跳过此步)
- 修复代码语法问题
你现有返回值中的statusCode和body均缺失开头的单引号,连接成功后也会抛出语法错误,需要补上。 - 增加排错配置
建议给connect方法增加超时参数、增加异常捕获逻辑,方便后续问题定位。
修正后代码示例
import json import boto3 import paramiko import traceback def lambda_handler(event, context): try: s3_client = boto3.client("s3") s3_client.download_file("censored-bucket-name", "keyname.pem", "/tmp/keyname.pem") ssh_key = paramiko.RSAKey.from_private_key_file("/tmp/keyname.pem") ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 替换为EC2私有IP,增加10秒超时 ssh_client.connect(hostname="此处替换为EC2私有IP", username="ubuntu", pkey=ssh_key, timeout=10) return { 'statusCode': 200, 'body': json.dumps('Commands have been successfully executed ') } except Exception as e: print(traceback.format_exc()) return { 'statusCode': 500, 'body': json.dumps(f'连接失败:{str(e)}') }
内容的提问来源于stack exchange,提问作者Prithvi Boinpally
相关产品推荐
相关产品推荐

