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

juv*_*oco 3 amazon-s3 amazon-web-services aws-lambda

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

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

我该如何调试这个错误?我已经检查了几个来源,其中一些谈到调整策略、检查权限,但我的问题是,有一些逐步的步骤(AWS 在其文档中没有),可以让我解决这个问题吗?

jar*_*mod 5

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

\n

检查与Lambda 函数正在使用的IAM 角色关联的 IAM 策略。你需要s3:GetObject许可。

\n

请注意 HeadObject 的另一件事:如果您请求的对象不存在,S3 返回的错误取决于您是否也拥有该s3:ListBucket权限:

\n
    \n
  • 如果您拥有存储桶的 s3:ListBucket 权限,S3 将返回 HTTP 状态代码 404(“无此类密钥”)错误

    \n
  • \n
  • 如果您没有\xe2\x80\x99t s3:ListBucket 权限,S3 将返回 HTTP 状态代码 403(“访问被拒绝”)错误

    \n
  • \n
\n

以下是 S3 策略的示例,该策略允许GetObject针对 in 中的所有对象执行 S3 操作mybucket,并且还允许ListBucketon mybucket

\n
{\n  "Version": "2012-10-17",\n  "Statement": [\n    {\n      "Effect": "Allow",\n      "Action": "s3:GetObject",\n      "Resource": [\n        "arn:aws:s3:::mybucket/*"\n      ]\n    },\n    {\n      "Effect": "Allow",\n      "Action": "s3:ListBucket",\n      "Resource": [\n        "arn:aws:s3:::mybucket"\n      ]\n    }\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n