调用 GetObjectTagging 操作时,Amazon S3 cp 失败并显示 (AccessDenied)

Sli*_*Fat 12 amazon-s3 amazon-web-services

当我尝试将数据从公共存储桶复制到我自己的存储桶时,它失败并出现以下错误

aws s3 cp s3://awssampledbuswest2/tickit/spectrum/sales/sales_ts.000 s3://<my bkt>/

copy failed: s3://awssampledbuswest2/tickit/spectrum/sales/sales_ts.000 to s3://<my bkt>/sales_ts.000 An error occurred (AccessDenied) when calling the GetObjectTagging operation: Access Denied
Run Code Online (Sandbox Code Playgroud)

由于源路径可供每个人使用,因此任何人都可以尝试通过替换<my bkt>为您自己的路径来执行相同的操作。

令人惊讶的是,我可以将文件从公共存储桶下载到本地文件系统并将其上传到我自己的存储桶中

aws s3 cp s3://awssampledbuswest2/tickit/spectrum/sales/ . --recursive
Run Code Online (Sandbox Code Playgroud)

aws s3 cp sales_ts.000 s3://<my bkt>/
Run Code Online (Sandbox Code Playgroud)

非常感谢任何解释为什么会发生这种错误以及如何避免此错误!

附言。我尝试与 AWS 账户所有者和以下 IAM 用户联系,但没有成功。 在此输入图像描述

vir*_*iru 34

--copy-props none更简单的解决方案是在复制时使用

例子: aws s3 cp s3://source/object-name s3://destination/object-name/ --copy-props none --recursive


dov*_*vka 12

就我而言,问题出在AWS CLI 版本上。存储桶到存储桶的复制可以与 AWS CLI v1 配合使用。但是,AWS CLI v2 的复制操作失败,并出现错误“调用 GetObjectTagging 操作时(AccessDenied)”

检查 aws v2 与 v1 重大更改列表显示有关文件属性和标签的行为更改

当您在 aws s3 命​​名空间中使用 AWS CLI 版本 1 版本的命令将文件从一个 Amazon S3 存储桶位置复制到另一个 Amazon S3 存储桶位置,并且该操作使用分段复制时,源对象中的任何文件属性都不会复制到目标对象。默认情况下,s3 命名空间中执行多部分复制的 AWS CLI 版本 2 命令现在将所有标签和以下属性集从源复制到目标复制:内容类型、内容语言、内容编码、内容处置、缓存控制、过期和元数据。

因此,我们需要将GetObjectTagging操作添加到源存储桶的 IAM 策略中,并为目标存储桶添加PutObjectTagging 操作

  • 为什么这个答案只有一票赞成?这似乎是一个更干净的解决方案,修复权限而不必学习新的复杂命令。这对每个人都有效吗?@john-rotenstein 对于这个答案与你的答案有何不同的想法? (2认同)

Joh*_*ein 11

这不是你的错。这是由于源存储桶上的存储桶策略所致。它不允许GetObjectTaggingAPI 调用。

按照AWS 文档中的示例,存储awssampledbuswest2桶已设置为允许从 Amazon Redshift 进行访问。此类访问不会尝试检索对象标签。

但是,在存储桶之间进行复制时,AWS CLIaws s3 cp命令会尝试创建对象的完整副本(包括对象标签)。这会导致它失败。

复制到本地文件系统成功,因为在复制到 S3 之外的目标时,AWS CLI 不会尝试获取标签,因为普通操作系统没有文件标签的概念。

为了避免这个问题,您可以使用以下aws s3api copy-object命令在存储桶之间复制文件,该命令只是进行复制,而不尝试复制标签:

aws s3api copy-object --copy-source awssampledbuswest2/tickit/spectrum/sales/sales_ts.000 --bucket YOUR-BUCKET --key sales_ts.000
Run Code Online (Sandbox Code Playgroud)


Cor*_*mer 7

命令输出显示问题是访问策略之一:

An error occurred (AccessDenied) when calling the GetObjectTagging operation: Access Denied
Run Code Online (Sandbox Code Playgroud)

修复很简单,您需要将以下操作添加到您的访问策略中

"s3:PutObjectTagging"
"s3:GetObjectTagging"
"s3:GetObjectVersion"
"s3:GetObjectVersionTagging"
Run Code Online (Sandbox Code Playgroud)

以下是一项标准策略,允许从存储桶直接复制到存储桶(也可以从同一存储桶中的一个路径复制到另一个路径):

{
   "Effect": "Allow",
   "Action": [
       "s3:PutObject",
       "s3:GetObject",
       "s3:DeleteObject",
       "s3:PutObjectTagging",
       "s3:GetObjectTagging",
       "s3:GetObjectVersion",
       "s3:GetObjectVersionTagging"
   ],
   "Resource": "arn:aws:s3:::bucketname/*"
}
Run Code Online (Sandbox Code Playgroud)