Terraform配置VPC内Lambda实现外部HTTP请求网络访问
VPC内Lambda函数无法访问外部API的排查与修复方案
核心问题根源
你的Lambda无法访问外部API,问题出在NAT Gateway的部署子网配置错误:
- NAT Gateway必须部署在公有子网(关联了Internet Gateway路由表的子网),只有它自己能访问互联网,才能为私有子网内的Lambda转发流量。
- 当前你的NAT Gateway部署在
main_subnet_nat_gateway_a,但这个子网关联的是指向NAT Gateway自身的路由表,形成循环依赖,导致NAT Gateway本身无法连接互联网,自然没法给Lambda转发外部请求。
具体修复步骤(对应Terraform代码调整)
1. 修正NAT Gateway所在子网的路由关联
把NAT Gateway部署的子网main_subnet_nat_gateway_a,关联到带IGW的主路由表route-table-main,让它成为公有子网:
resource "aws_route_table_association" "subnet-association-nat-gateway-a" { subnet_id = aws_subnet.main_subnet_nat_gateway_a.id route_table_id = aws_route_table.route-table-main.id # 改为关联主路由表 }
同时给这个子网开启自动分配公网IP(可选,但配合EIP使用更稳妥):
resource "aws_subnet" "main_subnet_nat_gateway_a" { vpc_id = aws_vpc.main_vpc.id cidr_block = "10.0.4.0/24" availability_zone = "us-east-2a" map_public_ip_on_launch = true # 新增配置 }
2. 保留Lambda所在子网的正确配置
Lambda部署的main_subnet_nat_gateway_b/c子网,继续关联route-table-nat(默认路由指向NAT Gateway),这部分你的配置是对的,不用改。
3. 确认安全组无拦截
当前main_sg的出站规则已经允许所有流量(0.0.0.0/0、全协议端口),不会拦截Lambda的外部请求,无需调整。
4. IAM权限已满足
你的Lambda角色已经附加了AWSLambdaVPCAccessExecutionRole,该权限包含Lambda在VPC内运行所需的ENI管理等核心权限,足够支持网络访问。
验证建议
- 部署修正后的配置后,手动触发Lambda函数,查看CloudWatch日志,确认网络请求是否正常。
- 可以在Lambda代码中添加DNS解析测试(比如解析
google.com),排查是否存在DNS解析问题(你的VPC已开启enable_dns_support和enable_dns_hostnames,这部分大概率没问题)。
内容的提问来源于stack exchange,提问作者Alexandru Romînu
相关产品推荐
相关产品推荐

