AWS Lambda:调用 HeadObject 操作时出错 (403):禁止访问



我有一个lambda函数进行s3 HeadObject调用。尽管已经为此 lambda 函数制定了自定义策略,但每当进行此 HeadObject 调用时,我都会收到 403 错误。具体有;

An error occurred (403) when calling the HeadObject operation: Forbidden

我的策略非常清楚地允许 GetObject 调用有问题的存储桶。不知道问题是什么。我有三重检查它是否都排好了。有问题的行是:

s3 = boto3.client('s3')
local_file_path = '/tmp/' + key_name.split('/')[-1] + '_REMOTE.json'
response = s3.head_object(Bucket=environ['OUTPUT_BUCKET'], Key=OUTPUT_FILE_NAME)

如果可以提供更多信息来提供帮助,请告诉我

既然您说文件丢失了,那么如果您缺少s3:ListBucket权限,这是预期的行为

此操作需要 s3:GetObject 权限。 有关更多信息,请转到 Amazon Simple Storage Service 开发人员指南 中的在策略中指定权限。如果您请求的对象不存在,则 Amazon S3 返回的错误取决于您是否还具有 s3:ListBucket 权限。

如果您对存储桶具有 s3:ListBucket 权限,则 Amazon S3 将 返回 HTTP 状态代码 404("无此类密钥"(错误。

如果您没有 s3:ListBucket 权限,Amazon S3 将返回 HTTP 状态代码 403("访问被拒绝"(错误。

链接到文档

还有一个"不同"的最终一致性行为,用于在上传对象之前执行HEAD

Amazon S3 数据一致性模型 Amazon S3 为所有区域中 S3 存储桶中的新对象的 PUT 提供写后读一致性,但有一个警告。需要注意的是,如果您在创建对象之前向键名称发出 HEAD 或 GET 请求(以查找对象是否存在(,Amazon S3 将为写入后读取提供最终一致性。

我在此链接上找到了解决方案,因此所有功劳都归功于作者。

基本上,您可能需要检查您是否具有操作的正确权限(至少s3:GetObjects3:ListBucket(,并且资源表达式与ARN以及路径匹配,例如此->"Resource":"arn:aws:s3:::BUCKET_NAME/*"而不是此->"Resource":"arn:aws:s3:::BUCKET_NAME"

我刚刚遇到了带有方括号的键(例如[x][y]abcd.ext(的问题.
重命名键后,一切都正常进行 - 403错误已解决。

这是一个令人难以置信的非直观解决方案。

>s3:ListBucket是特定于存储桶的权限,因此 iamInlinePolicy 应该是这样的

Action:
- s3:ListBucket
- s3:PutObject
- s3:GetObject
- s3:DeleteObject
Resource: 'arn:aws:s3:::BUCKET_NAME/*'
- Effect: Allow
Action:
- s3:ListBucket
Resource: 'arn:aws:s3:::BUCKET_NAME'

添加这样的资源arn:aws:s3:::BUCKET_NAME/*将使您能够在存储桶内执行操作,对于 ListBucket,资源只是存储桶arn:aws:s3:::BUCKET_NAME

相关内容

  • 没有找到相关文章

最新更新