Lambda函数调用PutObject操作时遇Access Denied问题求助
以下是几个容易被忽略的核心排查点及解决方法:
检查S3块公共访问设置
即便桶策略配置了Principal: "*",如果桶的Block Public Access中Block all public access或Block public access to buckets and objects granted any access control lists (ACLs)处于开启状态,公开权限会被强制阻断。前往S3控制台的桶权限页面,确认这四个选项是否全部关闭(若需公开访问)。验证Lambda执行角色的权限边界
IAM角色的Permission Boundary常被忽略:若Lambda执行角色绑定了权限边界,即便给角色添加了S3权限,只要权限边界未允许s3:PutObject操作,请求仍会被拒绝。进入IAM控制台找到Lambda的执行角色,查看权限边界配置,确保其包含s3:PutObject及对应资源ARN。检查Docker镜像中的AWS凭证优先级
Lambda容器默认通过IAM角色获取临时凭证,但如果Docker镜像中设置了AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY这类环境变量,SDK会优先使用硬编码凭证而非Lambda执行角色的权限。检查Dockerfile或容器启动脚本,删除这类环境变量,让容器自动获取角色凭证。S3桶加密的KMS权限
若桶启用了默认加密(SSE-KMS),调用PutObject时,Lambda执行角色除s3:PutObject权限外,还需要对应KMS密钥的kms:GenerateDataKey权限。前往KMS控制台找到目标密钥,为Lambda执行角色添加该权限。VPC配置下的S3端点
若Lambda部署在VPC内,必须配置S3网关端点(Gateway Endpoint),否则Lambda无法访问S3。进入VPC控制台的端点页面,创建S3网关端点并关联Lambda所在的子网与路由表。调整桶策略的资源范围
当前桶策略仅覆盖对象级资源arn:aws:s3:::bucket-xxx/*,可将资源范围扩展为桶级+对象级:{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": ["arn:aws:s3:::bucket-xxx", "arn:aws:s3:::bucket-xxx/*"] } ] }确认Lambda执行角色关联正确性
进入Lambda控制台的函数配置页,检查“执行角色”是否为你配置了S3权限的角色,避免因选错角色导致权限不足。
内容的提问来源于stack exchange,提问作者Jhakiz

