You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何AWS Lambda无法通过Paramiko SSH连接同VPC下的EC2实例

问题排查与解决方案

核心错误原因

你当前的核心问题是绑定了VPC的Lambda使用公网IP访问同VPC内的EC2:
绑定了VPC的Lambda默认只有私有IP,没有公网访问能力,如果你没有额外为Lambda所在子网配置NAT网关/实例,公网访问请求会直接被丢弃,因此发起SSH公网IP连接时无响应、直接超时。

修复步骤

  1. 替换连接地址
    将ssh_client.connect中的hostname参数从EC2公网IP改为EC2的私有IP,同VPC内资源走私有网络通信无需经过公网,也不需要额外配置NAT。
  2. 确认安全组配置
  • EC2实例的入站安全组:开放22端口,源地址填写Lambda函数的安全组ID,最小权限配置避免暴露公网风险
  • Lambda函数的出站安全组:确认开放22端口的出站访问(默认出站规则为全通可跳过此步)
  1. 修复代码语法问题
    你现有返回值中的statusCode和body均缺失开头的单引号,连接成功后也会抛出语法错误,需要补上。
  2. 增加排错配置
    建议给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:09:03