同账户下如何从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
相关产品推荐
相关产品推荐

