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

同账户下如何从us-east-2的Lambda访问us-east-1的EC2实例?

跨区域Lambda与EC2的连接方案(SSH/API调用)

一、通过SSH实现Lambda连接EC2

1. 打通跨区域VPC网络

由于Lambda在us-east-2、EC2在us-east-1,需建立跨区域网络连通:

  • 为两个区域的VPC创建VPC对等连接,或使用AWS Transit Gateway(多区域场景更便捷)。
  • 配置双方VPC的路由表,将对方VPC的CIDR段指向对等连接/Transit Gateway,确保子网间路由可达。

2. 配置Lambda的VPC访问权限

  • 为Lambda执行角色附加AWSLambdaVPCAccessExecutionRole托管权限,同时添加必要的EC2描述权限(可选,用于动态获取EC2私有IP)。
  • 修改Lambda配置,将其部署到us-east-2的目标VPC子网中,并关联自定义安全组。

3. 调整安全组规则

  • EC2安全组:添加入站规则,允许来自Lambda安全组ID(或其所在VPC CIDR)的22端口(SSH)流量。
  • Lambda安全组:添加出站规则,允许向EC2所在VPC CIDR发起22端口的出站请求。

4. Lambda内实现SSH连接

  • 打包SSH依赖库(如Python的paramiko)为Lambda层,或直接包含在部署包中。
  • 将EC2的SSH私钥存储在AWS Secrets Manager中,为Lambda执行角色添加访问该密钥的权限。
  • 示例Python代码:
import paramiko
import boto3
import os

def lambda_handler(event, context):
    # 从Secrets Manager获取私钥
    secrets_client = boto3.client('secretsmanager', region_name='us-east-1')
    secret_resp = secrets_client.get_secret_value(SecretId='ec2-ssh-private-key')
    private_key_content = secret_resp['SecretString']
    
    # 将私钥写入Lambda临时存储
    key_path = '/tmp/id_rsa'
    with open(key_path, 'w') as f:
        f.write(private_key_content)
    os.chmod(key_path, 0o600)
    
    # 建立SSH连接并执行命令
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ec2_private_ip = '10.0.0.15'  # 替换为EC2的私有IP
    
    try:
        ssh_client.connect(
            hostname=ec2_private_ip,
            username='ec2-user',
            key_filename=key_path
        )
        stdin, stdout, stderr = ssh_client.exec_command('df -h')
        return {
            'statusCode': 200,
            'body': f'执行结果:\n{stdout.read().decode()}'
        }
    finally:
        ssh_client.close()
        os.remove(key_path)

二、通过调用EC2上的API服务器实现连接

1. 配置网络连通性

  • 优先选择VPC对等/Transit Gateway实现跨区域VPC内访问;若允许公网访问,可为EC2分配弹性IP,Lambda通过公网地址调用API(安全性低于VPC内访问)。

2. 安全组规则调整

  • EC2安全组:添加入站规则,允许来自Lambda安全组(或VPC CIDR)的API端口流量(如80/443)。
  • Lambda安全组:添加出站规则,允许向EC2所在VPC CIDR(或公网)发起对应端口的请求。

3. Lambda内发起API请求

  • 若为VPC内访问,使用EC2私有IP作为API地址;公网访问则使用弹性IP或绑定的域名。
  • 示例Python代码:
import requests

def lambda_handler(event, context):
    api_endpoint = 'http://10.0.0.15:8080/api/data'  # 替换为EC2的API地址
    try:
        resp = requests.get(api_endpoint, timeout=10)
        resp.raise_for_status()
        return {
            'statusCode': 200,
            'body': resp.json()
        }
    except requests.exceptions.RequestException as e:
        return {
            'statusCode': 500,
            'body': f'API调用失败: {str(e)}'
        }

4. 安全增强建议

  • 为API启用HTTPS,使用AWS Certificate Manager(ACM)申请免费证书,部署在EC2或搭配Application Load Balancer使用。
  • 采用IAM认证保护API:让Lambda使用自身角色签名请求,EC2上的API服务验证签名后再处理请求。

通用注意事项

  • 跨区域数据传输会产生额外费用,优先选择VPC内访问降低成本。
  • 调整Lambda的超时时间(默认3秒),确保SSH连接或API调用有足够执行时长。
  • 遵循最小权限原则,为Lambda执行角色仅授予必要的访问权限。

内容的提问来源于stack exchange,提问作者Santhosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:36:16