Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 关于s3中的文件权限ACL,boto3 copy vs copy_对象_Amazon S3_Boto3 - Fatal编程技术网

Amazon s3 关于s3中的文件权限ACL,boto3 copy vs copy_对象

Amazon s3 关于s3中的文件权限ACL,boto3 copy vs copy_对象,amazon-s3,boto3,Amazon S3,Boto3,在我用不同的密钥和前缀将一个对象复制到同一个bucket之后(我相信这类似于重命名),它的公共读取权限将被删除 import boto3 s3 = boto3.resource('s3') copy_source = { 'Bucket': 'mybucket', 'Key': 'mykey' } s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey') 当我试图使用s3上的链接在浏览器上打开文件时。而且,我意识到在

在我用不同的密钥和前缀将一个对象复制到同一个bucket之后(我相信这类似于重命名),它的公共读取权限将被删除

import boto3
s3 = boto3.resource('s3')
copy_source = {
    'Bucket': 'mybucket',
    'Key': 'mykey'
}
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey')
当我试图使用s3上的链接在浏览器上打开文件时。而且,我意识到在“权限”选项卡上,它没有公共读取权限,而原始文件有

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>***</RequestId>
    <HostId>***</HostId>
</Error>
2个问题:
i) 使用时是否可以维护ACL权限 (CopySource、Bucket、Key、ExtraArgs=None、Callback=None、SourceClient=None、Config=None)


ii)我可以设置哪些额外参数?这份文件什么也没提到

这不是我想要的确切答案,但目前看来似乎有效

我不知道如何维护权限,但我可以手动将其设置为公共读取或其他我需要的类型

这是boto3的可能值:
“private”|“public-read”|“public-read-write”|“authenticated-read”|“aws-exec-read”|“bucket-owner-read”|“bucket-owner-full-control”

import boto3
s3 = boto3.resource('s3')
copy_source = {
    'Bucket': 'mybucket',
    'Key': 'mykey'
}
extra_args = {
    'ACL': 'public-read'
}
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey', extra_args)
然后,我意识到执行此操作需要更多权限。我不确定它现在实际需要哪个权限,但我得到了以下错误:
i) 调用CopyObject操作时发生错误(AccessDenied):拒绝访问。
ii)调用CreateMultipartUpload操作时发生错误(AccessDenied):拒绝访问


在我添加了“s3:PutObjectAcl”策略之后,它就可以工作了

旁注:如果可能,避免将权限直接放在对象上。如果希望将对象公开,最好创建一个bucket策略,该策略可以将整个bucket或bucket的一部分公开(不管在特定对象上设置的ACL如何)。这比在每个对象上拥有不同的权限更易于维护和管理。(但是,有时也有很好的理由拥有每个对象的权限。)