同一VPC内通过VPC Endpoint实现Lambda A调用Lambda B的配置问题求助
Lambda跨VPC端点调用超时排查方案
核心问题梳理
同一VPC内,Lambda A尝试通过VPC Endpoint调用Lambda B(无NAT Gateway),调用触发30秒超时,CloudWatch仅记录时长无明确错误日志,已配置三个专属安全组并启用VPC DNS解析/主机名。
排查修复步骤
1. 确认VPC Endpoint基础配置
- 必须创建Lambda服务的接口型VPC Endpoint,服务名称需为
com.amazonaws.<区域>.lambda,网关型端点不支持Lambda调用 - 确保Endpoint关联了Lambda A所在的所有子网,且这些子网的路由表已添加指向该Endpoint的路由(目标为Lambda服务DNS名称,下一跳为VPC Endpoint)
2. 补全安全组端口规则
当前安全组仅配置了安全组访问,缺少端口限定,需补充:
- Lambda B安全组:入站规则添加「允许来自VPC Endpoint安全组的TCP 443端口访问」(Lambda调用走HTTPS)
- VPC Endpoint安全组:出站规则添加「允许到Lambda B安全组的TCP 443端口访问」
- Lambda A安全组:出站规则添加「允许到VPC Endpoint安全组的TCP 443端口访问」
3. 修正Lambda客户端配置
当前代码未适配VPC Endpoint环境,需调整:
- 删除硬编码的
BasicAWSCredentials,Lambda运行时会自动通过执行角色获取权限 - 强制客户端使用VPC内的Lambda私有端点,示例代码修改如下:
var config = new AmazonLambdaConfig { RegionEndpoint = RegionEndpoint.USEast1, // 启用私有DNS时可留空,客户端自动解析;未启用则填写VPC Endpoint的具体DNS ServiceURL = "https://lambda.us-east-1.amazonaws.com" }; var amazonLambdaClient = new AmazonLambdaClient(config); InvokeResponse mongoDbConnectCentralInsertInvokeResponse = await amazonLambdaClient.InvokeAsync(new InvokeRequest { FunctionName = "LambdaB", Payload = new JObject().ToString() });
4. 校验IAM权限
- Lambda A的执行角色需附加
lambda:InvokeFunction权限,资源指定为Lambda B的ARN - VPC Endpoint的策略需允许Lambda A的执行角色通过该端点调用Lambda服务,示例策略:
{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<账号ID>:role/LambdaA-Execution-Role" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1::<账号ID>:function:LambdaB" } ] }
5. 验证网络连通性
- 在Lambda A所在子网启动EC2实例,关联Lambda A的安全组,执行
telnet lambda.us-east-1.amazonaws.com 443或curl -v https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/LambdaB/invocations,测试是否能连通端点并调用Lambda B - 执行
nslookup lambda.us-east-1.amazonaws.com,确认返回VPC内私有IP(而非公网IP),验证DNS解析正常
6. 检查Lambda B的VPC部署状态
若Lambda B未部署在VPC内,VPC Endpoint无法直接访问,需将Lambda B也部署到同一VPC的子网中,或调整架构逻辑
内容的提问来源于stack exchange,提问作者Quan Nguyen
相关产品推荐
相关产品推荐

