使用AWS Amplify上传图片至S3遇Forbidden错误,求排查
我尝试通过AWS Amplify从线上网站将图片上传至S3存储桶,但在CloudFront中持续收到错误提示:
ERROR Error in headObject: Forbidden: null
我确定这是权限问题,已参考网上方案进行配置,但问题仍未解决。
已配置的权限内容
Lambda函数执行角色的内联策略(S3Access)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::aws-bucket", "arn:aws:s3:::aws-bucket/*" ] } ] }
Lambda角色的信任关系
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
S3存储桶策略
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::aws-bucket/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::32132131241:distribution/EKTT2sAWYDZ" } } }, { "Sid": "AllowLambdaFunctionAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::12345678910:role/awsLambdaRole312d22e0a-auth" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::aws-bucket", "arn:aws:s3:::aws-bucket/*" ] } ] }
排查方向与可能遗漏的配置
CloudFront Origin Access Control (OAC) 配置
如果你使用的是新版CloudFront访问私有S3桶,必须配置OAC而非旧版OAI。确认CloudFront分发已关联正确的OAC,且S3桶策略中允许该OAC的访问(当前策略仅允许CloudFront服务主体,若用OAC则Principal应为OAC的ARN)。Lambda执行角色的有效性
确认Lambda函数实际使用的执行角色就是你配置的awsLambdaRole312d22e0a-auth;检查该角色是否存在权限边界限制,若有需确保边界允许S3相关操作。S3桶的访问控制列表(ACL)与所有者一致性
确认S3桶的ACL未设置冲突权限;若资源跨账号,需确保桶所有者与IAM角色、CloudFront资源的所有者一致,避免跨账号权限拦截。CloudFront行为配置
检查CloudFront行为设置中是否允许HEAD请求(错误源于headObject操作),确保允许的HTTP方法包含HEAD;若前端直接上传,确认Amplify Storage的storage/upload权限配置正确,生成的签名URL有效。ARN正确性校验
逐一核对所有ARN中的账号ID、桶名、CloudFront分发ID是否完全匹配实际资源:- S3桶ARN中的
aws-bucket是否为真实桶名 - CloudFront SourceArn中的账号ID
32132131241和分发IDEKTT2sAWYDZ是否正确 - Lambda角色ARN中的账号ID
12345678910是否正确
- S3桶ARN中的
内容的提问来源于stack exchange,提问作者Randy Chu

