调用HeadObject操作遇403禁止错误,AWS Lambda权限问题求助
排查Lambda调用S3 HeadObject时的403 Forbidden错误
问题背景
严格遵循AWS官方S3+Lambda教程操作后,Lambda执行时触发以下403错误,调用HeadObject操作被拒绝:
{ "errorMessage": "An error occurred (403) when calling the HeadObject operation: Forbidden", "errorType": "ClientError", "requestId": "eb834711-562c-4d92-8607-f96d16aa56e6", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 23, in lambda_handler\n s3_client.download_file(bucket, key, download_path)\n", " File \"/var/lang/lib/python3.12/site-packages/boto3/s3/inject.py\", line 192, in download_file\n return transfer.download_file(\n", " File \"/var/lang/lib/python3.12/site-packages/boto3/s3/transfer.py\", line 406, in download_file\n future.result()\n", " File \"/var/lang/lib/python3.12/site-packages/s3transfer/futures.py\", line 103, in result\n return self._coordinator.result()\n", " File \"/var/lang/lib/python3.12/site-packages/s3transfer/futures.py\", line 266, in result\n raise self._exception\n", " File \"/var/lang/lib/python3.12/site-packages/s3transfer/tasks.py\", line 269, in _main\n self._submit(transfer_future=transfer_future, **kwargs)\n", " File \"/var/lang/lib/python3.12/site-packages/s3transfer/download.py\", line 354, in _submit\n response = client.head_object(\n", " File \"/var/lang/lib/python3.12/site-packages/botocore/client.py\", line 565, in _api_call\n return self._make_api_call(operation_name, kwargs)\n", " File \"/var/lang/lib/python3.12/site-packages/botocore/client.py\", line 1021, in _make_api_call\n raise error_class(parsed_response, operation_name)\n" ] }
当前Lambda执行角色的权限策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogGroup", "logs:CreateLogStream" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::tiral-bucket0973", "arn:aws:s3:::tiral-bucket0973/*", "arn:aws:s3:::target-bucket-152", "arn:aws:s3:::target-bucket-152/*", "arn:aws:s3:::tiral-bucket0973/example-folder-48523/*" ] } ] }
排查方向
1. 检查S3 Bucket策略是否拒绝访问
Lambda角色的IAM权限允许了GetObject,但Bucket自身的策略可能存在Deny语句,或未显式允许Lambda角色访问:
- 进入S3控制台,找到目标Bucket(
tiral-bucket0973),查看权限 > Bucket策略。 - 确保策略中包含允许Lambda执行角色ARN访问
GetObject的语句,示例:{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的账号ID:role/你的Lambda执行角色名" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::tiral-bucket0973/*" } - 检查是否存在优先级更高的Deny语句,比如限制IP访问、拒绝特定角色的规则。
2. 验证对象级ACL权限
如果目标对象的ACL未授予Lambda执行角色读取权限,也会触发403:
- 进入S3控制台,找到报错对应的对象,查看权限 > 对象ACL。
- 确认Lambda执行角色(或其所属账号)被授予
读取权限。
3. 确认Lambda角色的信任关系
检查Lambda执行角色的信任策略,确保允许Lambda服务扮演该角色:
- 进入IAM控制台,找到该角色,查看信任关系。
- 确保存在以下信任实体:
{ "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" }
4. 核对资源ARN的准确性
检查Lambda权限策略中的Bucket ARN是否与实际操作的Bucket完全匹配:
- 确认Bucket名称拼写无误(比如
"tiral-bucket0973"是否是实际Bucket名,是否存在拼写错误如trial)。 - 确保操作的对象路径在
arn:aws:s3:::tiral-bucket0973/*或指定的子路径范围内。
5. 检查S3存储桶所有权控制
若Bucket启用了对象所有权设置为Bucket owner enforced,需确保Lambda角色的权限能覆盖对象访问:
- 进入S3控制台,目标Bucket的权限 > 对象所有权,确认设置是否影响ACL生效。
6. VPC配置检查(若Lambda部署在VPC内)
如果Lambda部署在VPC中,网络不通也可能表现为403:
- 确认VPC配置了S3网关端点或接口端点,允许Lambda访问S3。
- 检查Lambda所在子网的路由表,是否有指向S3端点或公网的路由。
7. KMS加密权限(若对象使用KMS加密)
如果目标对象通过KMS密钥加密,Lambda角色还需额外的kms:Decrypt权限:
- 检查对象的加密配置,若使用KMS,需在Lambda权限策略中添加:
{ "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:区域:账号ID:key/你的KMS密钥ID" }
内容的提问来源于stack exchange,提问作者james kam
相关产品推荐
相关产品推荐

