使用Lambda上传文件至AWS S3时遭遇Access Denied(403)权限错误
Lambda上传AWS S3报403 Access Denied问题排查
我在通过Lambda函数上传文件到AWS S3时,持续遇到"access denied"(403)权限拒绝错误。该Lambda函数已配置读写目标存储桶的权限策略,但将应用镜像部署到另一个完全不同的环境后,上传流程可正常运行。
Lambda权限策略
{ "Version": "2012-10-17", // ... { "Action": [ "s3:Abort*", "s3:DeleteObject*", "s3:GetBucket*", "s3:GetObject*", "s3:List*", "s3:PutObject", "s3:PutObjectLegalHold", "s3:PutObjectRetention", "s3:PutObjectTagging", "s3:PutObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::celta-ui-data", "arn:aws:s3:::celta-ui-data/*" ], "Effect": "Allow" } ] }
日志错误内容
{ "errorType": "AccessDenied", "errorMessage": "Access Denied", "name": "AccessDenied", "$fault": "client", "$metadata": { "httpStatusCode": 403, "requestId": "S0D2PKHKJFKPQWPS", "extendedRequestId": "+CdFU95c5bkdfh0U99ujUNpewoZ1CA/xPtsctvDagwFQGEw0QLrq9wlbSwqy4e6fLw7K1OCvKG4=", "attempts": 1, "totalRetryDelay": 0 }, "Code": "AccessDenied", "RequestId": "S0D2PKHKJFKPQWPS", "HostId": "+CdFU95c5bkdfh0U99ujUNpewoZ1CA/xPtsctvDagwFQGEw0QLrq9wlbSwqy4e6fLw7K1OCvKG4=", "message": "Access Denied", "stack": [ "AccessDenied: Access Denied", " at throwDefaultError (/var/runtime/node_modules/@aws-sdk/node_modules/@smithy/smithy-client/dist-cjs/index.js:840:20)", " at /var/runtime/node_modules/@aws-sdk/node_modules/@smithy/smithy-client/dist-cjs/index.js:849:5", " at de_CommandError (/var/runtime/node_modules/@aws-sdk/client-s3/dist-cjs/index.js:4749:14)", " at process.processTicksAndRejections (node:internal/process/task_queues:95:5)", " at async /var/runtime/node_modules/@aws-sdk/node_modules/@smithy/middleware-serde/dist-cjs/index.js:35:20", " at async /var/runtime/node_modules/@aws-sdk/middleware-sdk-s3/dist-cjs/index.js:482:18", " at async /var/runtime/node_modules/@aws-sdk/node_modules/@smithy/middleware-retry/dist-cjs/index.js:320:38", " at async /var/runtime/node_modules/@aws-sdk/middleware-flexible-checksums/dist-cjs/index.js:174:18", " at async /var/runtime/node_modules/@aws-sdk/middleware-sdk-s3/dist-cjs/index.js:110:22", " at async /var/runtime/node_modules/@aws-sdk/middleware-sdk-s3/dist-cjs/index.js:138:14" ] }
已尝试的操作
- 给S3存储桶添加允许Lambda执行S3命令的策略,无效果
- 添加
s3:PutObjectAcl权限,问题未解决 - 不允许将存储桶设为公开访问
排查建议
- 检查S3桶策略的拒绝规则:S3桶策略中
Deny规则优先级高于IAM允许权限,哪怕Lambda角色有允许权限,只要桶策略存在匹配的Deny条目就会触发拒绝。仔细核对桶策略是否有针对Lambda角色、特定IP或请求条件的拒绝配置。 - 验证Lambda执行角色的信任关系:确认Lambda执行角色的信任策略是否允许
lambda.amazonaws.com服务扮演该角色,避免因信任关系配置错误导致无法获取有效访问凭证。 - 检查S3桶加密配置:如果目标桶开启了SSE-KMS加密,Lambda权限策略还需添加
kms:GenerateDataKey和kms:Decrypt权限(对应KMS密钥的ARN),否则上传加密桶会触发403错误。 - 确认代码中的目标路径:检查Lambda代码里指定的S3对象键(文件路径)是否正确,桶名是否准确为
celta-ui-data,避免因路径拼写错误导致访问错误资源。 - 排查VPC端点配置(若Lambda在VPC内):如果Lambda部署在VPC中,需确认已配置S3的VPC端点,且端点策略允许该Lambda角色访问S3,同时路由表正确指向端点,否则会因网络问题导致权限校验失败。
- 检查临时凭证有效性:可在Lambda日志中打印STS获取的临时凭证信息(注意脱敏),确认凭证的权限范围是否包含所需的S3操作。
- 核对对象锁/版本控制限制:若桶开启了对象锁或版本控制,确认Lambda权限中的
s3:PutObjectRetention等权限配置正确,且代码未设置违反桶规则的保留参数。
内容的提问来源于stack exchange,提问作者Fernando Mashimo
相关产品推荐
相关产品推荐

