我有一个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)
让我知道是否可以提供更多信息来帮助
答案 0 :(得分:4)
由于您说如果缺少s3:ListBucket
权限,文件将丢失其预期的行为
此操作需要s3:GetObject权限。有关更多信息,请转到Amazon Simple Storage Service开发人员指南中的在策略中指定权限。如果您请求的对象不存在,Amazon S3返回的错误取决于您是否还具有s3:ListBucket权限。
如果您对存储桶具有s3:ListBucket权限,则Amazon S3将 返回HTTP状态代码404(“没有这样的键”)错误。
如果您没有s3:ListBucket权限,Amazon S3将返回 HTTP状态代码403(“访问被拒绝”)错误。
链接到doco
在上传对象之前,HEAD
之前还有一种“不同的”最终一致性行为。
Amazon S3数据一致性模型 Amazon S3为所有区域中的S3存储桶中的新对象提供PUTS写入后读取一致性,但请注意。需要注意的是,如果在创建对象之前对键名称发出HEAD或GET请求(以查找对象是否存在),则Amazon S3最终会为写后读取提供一致性。
答案 1 :(得分:1)
我在此link上找到了解决方案,所以所有功劳都归功于作者。
基本上,您可能需要检查您是否对该操作具有正确的权限(至少s3:GetObject
和s3:ListBucket
),并且资源表达式与ARN匹配,再加上路径,例如--{{1} },而不是此-> "Resource":"arn:aws:s3:::BUCKET_NAME/*"
。
答案 2 :(得分:0)
对于带方括号的键(例如 [x][y]abcd.ext
),我刚刚遇到了这个问题。
重命名密钥后,一切正常 - 403 错误已解决。
这是一个非常不直观的解决方案。