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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:57:09