我有一组视频文件从一个AWS Bucket从另一个帐户复制到我自己的存储桶中的帐户。
我现在遇到一个问题,当我尝试将所有文件公开时,我收到了拒绝访问错误的所有文件。
具体来说,我登录到我的AWS账户,进入S3,深入查看文件夹结构,找到其中一个视频文件。
当我查看此特定文件时,文件上的权限选项卡不会显示分配给任何人的任何权限。未分配任何用户,组或系统权限。
在权限选项卡的底部,我看到一个小框,显示“错误:访问被拒绝”。我无法改变文件的任何内容。我无法添加元数据。我无法将用户添加到该文件中。我无法将文件设为Public。
有没有办法让我可以控制这些文件,以便我可以公开它们?有超过15,000个文件/大约60GB的文件。我想避免下载和重新上传所有文件。
在这里的一些帮助和建议下,我尝试了以下内容。我在我的桶中创建了一个名为“media”的新文件夹。
我试过这个命令:
aws s3 cp s3://mybucket/2014/09/17/thumb.jpg s3://mybucket/media --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers full=emailaddress=my_aws_account_email_address
调用HeadObject操作时收到致命错误403:禁止。
一个非常有趣的难题!幸运的是,有一个解决方案。
首先,回顾一下:
我设法重现了这一点,并确认帐户B中的用户无法访问该文件 - 甚至不是帐户B中的root用户!
幸运的是,事情可以修复。 aws s3 cp
中的AWS Command-Line Interface (CLI)命令可以在复制到同一名称时更新文件的权限。但是,要触发此操作,您还必须更新其他内容,否则会出现此错误:
此复制请求是非法的,因为它试图将对象复制到自身而不更改对象的元数据,存储类,网站重定向位置或加密属性。
因此,可以使用以下命令更新权限:
aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --acl bucket-owner-full-control --metadata "One=Two"
--acl bucket-owner-full-control
将授予帐户B许可,以便您能够正常使用这些对象最终结果:你可以使用一个水桶!
aws s3 cp s3://account1/ s3://accountb/ --recursive --acl bucket-owner-full-control
如果有人试图这样做但使用Hadoop / Spark作业而不是AWS CLI。
<property>
<name>fs.s3a.acl.default</name>
<description>Set a canned ACL for newly created and copied objects. Value may be Private,
PublicRead, PublicReadWrite, AuthenticatedRead, LogDeliveryWrite, BucketOwnerRead,
or BucketOwnerFullControl.</description>
<value>$chooseOneFromDescription</value>
</property>
编程方式:
spark.sparkContext.hadoopConfiguration.set("fs.s3a.acl.default", "BucketOwnerFullControl")
要为新添加的文件正确设置适当的权限,请添加此存储桶策略:
[...]
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012::user/their-user"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
并在代码中为新创建的文件设置ACL。 Python示例:
import boto3
client = boto3.client('s3')
local_file_path = '/home/me/data.csv'
bucket_name = 'my-bucket'
bucket_file_path = 'exports/data.csv'
client.upload_file(
local_file_path,
bucket_name,
bucket_file_path,
ExtraArgs={'ACL':'bucket-owner-full-control'}
)
来源:https://medium.com/artificial-industry/how-to-download-files-that-others-put-in-your-aws-s3-bucket-2269e20ed041(免责声明:由我撰写)
我担心你无法按照自己的意愿转让所有权。这是你做的:
旧帐户将对象复制到新帐户。
这样做的“正确”方式(假设您想要承担新帐户的所有权)将是:
新帐户从旧帐户复制对象。
看到小而重要的区别? S3 docs有点解释它。
我认为你可以通过复制同一个存储桶中的所有文件,然后删除旧文件,而无需下载整个文件。确保您可以在执行复制后更改权限。这样可以节省一些钱,因为您无需支付下载所有内容的数据传输费用。
通过推杆
--acl bucket-owner-full-control让它发挥作用。