部署在VPC内的Lambda无法启动ECS Fargate任务且超时如何解决?
故障根因
Lambda部署到VPC后默认没有公网访问能力,你代码中调用的client.run_task()属于ECS服务的公网API端点,请求无法从VPC内发出直接导致超时。EC2上运行正常是因为该EC2已配置公网出口(公网IP或NAT网关路由)。
解决方案
方案1:为Lambda所在子网配置公网出口
- 将Lambda部署到VPC的私有子网,在该私有子网的路由表中添加指向NAT网关的默认路由
- NAT网关需部署在VPC的公有子网,且绑定弹性公网IP(EIP),实现VPC内资源的公网出网能力
- 注意:Lambda部署在VPC中时不会被分配公网IP,即使绑定了互联网网关的公有子网也无法直接让Lambda访问公网,必须通过NAT网关中转
方案2:配置ECS服务的VPC端点(PrivateLink)
- 在Lambda所在的VPC内创建ECS服务的Interface类型VPC端点,所有ECS API调用请求会直接通过AWS内网链路传输,无需走公网
- 开启VPC端点的私有DNS解析功能,确保boto3 SDK会自动将ECS API域名解析到内网端点地址,无需修改现有代码
- 配置VPC端点的安全组入站规则,允许Lambda的安全组访问端点的443端口
排查补充项
- 确认Lambda执行角色已包含
ecs:RunTask、iam:PassRole(如果任务定义指定了执行角色/任务角色)的相关权限,权限不足也可能导致调用失败 - 你代码中Fargate任务配置的
assignPublicIp: ENABLED仅在任务部署到公有子网时生效,如果任务子网为私有子网需改为DISABLED,否则会导致Fargate任务启动失败(该问题不会导致Lambda调用超时,属于后续任务启动的排查项)
内容的提问来源于stack exchange,提问作者ab234
相关产品推荐
相关产品推荐

