VPC外Lambda访问S3超时问题:存储桶策略配置排查求助
问题分析及解决办法
问题出在网络路径不匹配:你的Lambda部署在VPC外,默认走公网访问S3,但你关闭了S3的公网访问权限,导致Lambda的请求根本到不了S3,直接超时。你的存储桶权限配置本身是对的,但忽略了网络访问的限制。
为啥会超时?
- Lambda在VPC外时,访问S3只能走公网通道。当你关闭S3公网访问后(比如开启了Block Public Access、或者配置了仅允许VPC端点访问),这条通道被彻底阻断了——不是权限不够,是请求连S3的权限校验环节都没到,直接被拦截,所以表现为超时(不是权限拒绝错误)。
- 你的存储桶策略只给Lambda角色开了权限,但没考虑到S3已经关闭了公网访问的入口,相当于门给特定人开了,但门锁死了,那人根本进不来。
两种解决思路
思路1:让Lambda继续走公网访问S3
如果不想动Lambda的部署位置,需要调整S3的访问控制,给这个Lambda角色开公网访问的口子:
- 检查S3的Block Public Access设置:如果开了“Block all public access”,得关掉,或者确认你的存储桶策略属于“授权的私有访问”(不是公开给所有人,只是给特定角色),这种情况下Block Public Access不会拦截。
- 可以给存储桶策略加个安全条件,确保只有该角色通过HTTPS访问:
{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "LambdaAllow", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::xxxxxx:role/service-role/Lambda_accessingS3-role" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::uploads-from-lambda567", "arn:aws:s3:::uploads-from-lambda567/*" ], "Condition": { "Bool": { "aws:SecureTransport": "true" } } } ] }
思路2:把Lambda移到VPC内,用内网访问S3
如果要保持S3公网访问关闭,这是更安全的方案:
- 把Lambda函数部署到你的VPC子网里,配置好安全组(允许出站访问S3)。
- 在VPC里创建S3网关型VPC端点,关联到Lambda所在的子网。这样Lambda就能通过VPC内网直接访问S3,不用走公网。
- 可选:给存储桶策略加条件,只允许来自这个VPC的访问,进一步锁死权限:
{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "LambdaAllow", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::xxxxxx:role/service-role/Lambda_accessingS3-role" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::uploads-from-lambda567", "arn:aws:s3:::uploads-from-lambda567/*" ], "Condition": { "StringEquals": { "aws:SourceVpc": "你的VPC ID" } } } ] }
额外要检查的点
- 确认Lambda的执行角色本身有S3访问权限:虽然公网访问时正常,但还是要检查角色的IAM策略里有没有允许
s3:*或者对应存储桶的权限(存储桶策略是资源端授权,角色策略是身份端授权,两者都得允许)。 - 排查超时原因:在Lambda里加日志,看是收不到响应(网络问题)还是收到权限拒绝(权限问题)——无响应基本就是网络被拦了。
内容的提问来源于stack exchange,提问作者Anudocs
相关产品推荐
相关产品推荐

