【问题标题】:ClientError: An error occurred (403) when calling the HeadObject operation: ForbiddenClientError: 调用 HeadObject 操作时发生错误 (403): Forbidden
【发布时间】:2026-01-26 14:40:01
【问题描述】:

我正在创建一个 AWS Lambda 函数,它尝试将文件 (s3.download_file) 下载到我使用 Python (3.6) 中的 tempfile 库创建的临时目录。然后,我对文件进行了一些转换,我需要再次上传它(s3.upload_file)。我对我的临时目录的生命周期充满信心,当 Lambda 完成其工作时,临时目录将自行销毁。 Lambda 返回与禁止的 HeadObject 操作相关的错误。确切的错误是:

“调用HeadObject操作时发生错误(403):禁止”

如何调试此错误?我已经检查了几个来源,其中一些谈到调整策略,检查权限,但我的问题是,有一些循序渐进的(AWS 在其文档中没有),这让我能够解决这个问题?

【问题讨论】:

  • 您对 S3 的 API 调用是使用 AWS 凭证进行的。如果您想对 S3 对象调用 HeadObject 操作,则您的凭据需要有权在相关 S3 对象上调用该操作。检查与 Lambda 函数正在使用的凭证(可能是 IAM 角色)关联的 IAM 策略。
  • 谢谢!我没有处理角色,只处理用户。这就是错误。只是为了测试,我添加了对用户和角色的完全访问权限并且它正在工作!

标签: amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

您对 S3 的 API 调用是使用 AWS 凭证进行的。如果您想对 S3 对象调用 HeadObject 操作,那么您的凭据需要有权在相关 S3 对象上调用该操作。

检查与 Lambda 函数正在使用的 IAM role 关联的 IAM 策略。

这是一个 S3 策略示例,它允许对 mybucket 中的所有对象执行 S3 HeadObject 操作,并且还允许在 mybucket 上执行 GetBucketLocation

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:HeadObject",
      "Resource": [
        "arn:aws:s3:::my_bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "s3:GetBucketLocation",
      "Resource": [
        "arn:aws:s3:::my_bucket"
      ]
    }
  ]
}

【讨论】: