Lambda函数无法连接S3桶且超时,请求技术排查协助
Lambda访问S3超时问题排查与解决
核心原因
你的Lambda部署在VPC子网内,默认情况下没有公网访问能力。S3虽是AWS全局服务,但调用其公网端点需要出站公网连接,而VPC内的Lambda仅拥有私有IP,无法直接发起公网请求,导致请求一直阻塞直到超时。
解决方案
方案1:配置S3 VPC网关端点(推荐)
这是最安全且成本更低的方式,无需依赖NAT网关:
- 在你的Terraform配置中添加S3网关型VPC端点:
resource "aws_vpc_endpoint" "s3_gateway" { vpc_id = aws_vpc.default.id # 替换为你的默认VPC ID service_name = "com.amazonaws.${var.aws_region}.s3" vpc_endpoint_type = "Gateway" route_table_ids = [aws_route_table.private_subnet.id] # 替换为Lambda所在子网的路由表ID }
- 确认路由表中自动添加了指向S3前缀列表(
pl-xxxx)的路由,目标为该网关端点 - 网关端点不依赖安全组控制流量,无需额外配置
方案2:配置NAT网关(适用于需访问多公网服务的场景)
如果你的Lambda还需要访问其他公网服务,可给私有子网配置NAT网关:
- 在VPC的公有子网中创建NAT网关并绑定弹性公网IP(EIP)
- 修改Lambda所在私有子网的路由表,将
0.0.0.0/0的路由指向NAT网关 - 确保NAT网关所在安全组允许出站到S3的HTTPS(443端口)流量
额外检查项
- Lambda IAM权限:确认执行角色拥有
s3:ListBuckets等所需权限,示例IAM策略片段:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListBuckets", "Resource": "*" } ] }
- 代码优化:你的Lambda代码中重复导入了
json模块,可删除其中一个(此问题不导致超时)。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

