AWS Lambda部署至VPC后初始化阶段超时问题求助
问题:Docker镜像部署的Lambda加入VPC后Init阶段超时
我有一个用Docker镜像部署的AWS Lambda函数,未加入VPC时运行正常。流程是先连接AWS Secrets Manager获取凭证,再用该凭证连接外部Web API获取数据。现在因为需要访问MongoDB Atlas数据库,把它迁移到了VPC,用以下Terraform模块创建VPC:
module "vpc" { source = "terraform-aws-modules/vpc/aws" name = "vpc-mongodb-atlas" cidr = "10.0.0.0/16" azs = ["eu-west-2a", "eu-west-2b"] private_subnets = ["10.0.1.0/24", "10.0.2.0/24"] public_subnets = ["10.0.0.0/24"] enable_nat_gateway = true single_nat_gateway = true }
随后将Lambda加入该VPC:
module "lambda_function_container_image" { source = "terraform-aws-modules/lambda/aws" ... image_uri = module.docker_image.image_uri package_type = "Image" ... vpc_subnet_ids = module.vpc.private_subnets vpc_security_group_ids = [module.vpc.default_security_group_id] attach_network_policy = true }
部署完成后,Lambda在init阶段超时,日志如下:
INIT_REPORT Init Duration: 10007.38 ms Phase: init Status: timeout
我怀疑是Lambda无法连接互联网,但多次排查仍未定位问题,相关配置信息如下:
- VPC配置:CIDR为10.0.0.0/16,包含1个公有子网(10.0.0.0/24)和2个私有子网(10.0.1.0/24、10.0.2.0/24),启用单NAT网关
- 私有子网路由表:默认路由指向NAT网关
- 公有子网路由表:默认路由指向互联网网关
- 网络ACL:入站和出站规则均允许所有流量
- Lambda VPC配置:关联私有子网和VPC默认安全组
排查步骤与解决方案
1. 验证NAT网关与路由表有效性
Lambda放在私有子网,依赖NAT网关访问公网,需确认:
- NAT网关状态为
available,且已绑定弹性公网IP - 私有子网路由表的
0.0.0.0/0路由确实指向NAT网关,且该路由表已关联到Lambda所在的私有子网 - 公有子网路由表的
0.0.0.0/0路由指向互联网网关,确保NAT网关能正常访问公网
2. 检查安全组与网络ACL规则
- 默认安全组需允许所有出站流量(AWS默认配置,但需确认未被修改);如果需要访问MongoDB Atlas,需额外允许出站27017端口流量
- 网络ACL需允许出站443端口(Secrets Manager、外部Web API均使用HTTPS),同时允许对应入站响应流量(Ephemeral端口范围:1024-65535)
3. 优化AWS服务访问方式(推荐使用VPC端点)
Lambda访问Secrets Manager时,使用VPC端点可绕过NAT网关,避免公网延迟或连通性问题:
resource "aws_vpc_endpoint" "secrets_manager" { vpc_id = module.vpc.vpc_id service_name = "com.amazonaws.${var.region}.secretsmanager" vpc_endpoint_type = "Interface" security_group_ids = [module.vpc.default_security_group_id] subnet_ids = module.vpc.private_subnets private_dns_enabled = true }
开启私有DNS后,Lambda可直接通过默认域名访问Secrets Manager,无需额外配置。
4. 调整Lambda Init超时配置
Lambda默认Init阶段超时为10秒,与日志中的超时时间完全匹配。如果Docker镜像启动或初始化逻辑耗时较长,需在Terraform中调整超时参数:
module "lambda_function_container_image" { ... timeout = 30 # 根据实际需求调整,比如30秒 ... }
5. 验证MongoDB Atlas网络配置
确保MongoDB Atlas的IP白名单已添加NAT网关的弹性公网IP,或已配置VPC peering连接到当前AWS VPC,否则Lambda连接MongoDB Atlas时会阻塞,导致Init阶段超时。
6. 临时测试网络连通性
在Lambda所在的私有子网启动EC2实例,关联相同安全组,执行以下测试:
- 访问外部域名:
curl https://google.com - 访问Secrets Manager:
aws secretsmanager list-secrets - 连接MongoDB Atlas:用MongoDB客户端测试连接
通过EC2的测试结果,可快速定位是VPC网络问题还是Lambda自身配置问题。
内容的提问来源于stack exchange,提问作者wikiselev
相关产品推荐
相关产品推荐

