如何使用AWS s3或AWS s3api以递归方式将权限更改为文件夹

gc5*_*gc5 8 directory acl file-permissions amazon-s3 amazon-web-services

我正在尝试向s3中的现有帐户授予权限.

存储桶由该帐户拥有,但数据是从另一个帐户的存储桶中复制的.

当我尝试使用该命令授予权限时:

aws s3api put-object-acl --bucket <bucket_name> --key <folder_name> --profile <original_account_profile> --grant-full-control emailaddress=<destination_account_email>
Run Code Online (Sandbox Code Playgroud)

我收到错误:

An error occurred (NoSuchKey) when calling the PutObjectAcl operation: The specified key does not exist.
Run Code Online (Sandbox Code Playgroud)

如果我在一个文件上执行此操作,则命令成功.

如何使其适用于完整文件夹?

小智 17

这只能通过使用管道来实现.试试 -

aws s3 ls s3://bucket/path/ --recursive | awk '{cmd="aws s3api put-object-acl --acl bucket-owner-full-control --bucket bucket --key "$4; system(cmd)}'
Run Code Online (Sandbox Code Playgroud)


Str*_*tch 15

其他答案都可以,但最快的方法是使用aws s3 cp带有选项的命令--metadata-directive REPLACE,如下所示:

aws s3 cp --recursive --acl bucket-owner-full-control s3://bucket/folder s3://bucket/folder --metadata-directive REPLACE
Run Code Online (Sandbox Code Playgroud)

这给出了介于 50Mib/s 和 80Mib/s 之间的速度。

John R 的评论中的答案,建议使用“虚拟”选项,例如--storage-class STANDARD. 虽然这有效,但只给了我 5Mib/s 和 11mb/s 之间的复制速度。

尝试此操作的灵感来自 AWS 关于该主题的支持文章:https : //aws.amazon.com/premiumsupport/knowledge-center/s3-object-change-anonymous-ownership/

注意:如果您的某些对象遇到“访问被拒绝”,这可能是因为您将 AWS 凭证用于存储桶拥有账户,而您需要对从中复制文件的账户使用凭证。


Joh*_*ein 7

您将需要为每个对象单独运行该命令。

您可以使用以下方法来简化该过程:

aws s3 cp --acl bucket-owner-full-control --metadata Key=Value --profile <original_account_profile> s3://bucket/path s3://bucket/path
Run Code Online (Sandbox Code Playgroud)

也就是说,您将文件复制到它们自己,但是具有添加的ACL,该ACL向存储桶所有者授予权限。

如果您有子目录,请添加--recursive

  • 将文件复制到自身失败,并显示“此复制请求是非法的,因为它试图在不更改对象的元数据,存储类,网站重定向位置或加密属性的情况下将对象复制到自身”;但是添加另一个虚拟更改(如设置存储类),就可以了:&lt;code&gt; aws s3 cp --recursive --acl bucket-owner-full-control s3:// bucket / path s3:// bucket /路径-存储级标准&lt;/ code&gt; (4认同)