在亚马逊s3 boto bucket中设置特定权限

Dil*_*lli 5 python amazon amazon-s3 boto

我有一个名为'ben-bucket'的桶,我有多个文件.我希望能够为每个文件URL设置权限.我不太确定,但我假设我想要一个桶内每个文件的URL.我的网址会是这样的吗?

https://ben-bucket.s3.amazonaws.com/<file_name>
Run Code Online (Sandbox Code Playgroud)

所以基本上,我想设置对该URL的公共访问.我该怎么办?我试过这个并没有用

    bucket = s3.Bucket('ben-bucket').Object('db.sqlite')
    bucket.BucketAcl('public-read')
    print bucket_acl
Run Code Online (Sandbox Code Playgroud)

提供的代码.db.sqlite是我的存储桶ben-bucket中的一个文件代码不起作用.我希望能够公开访问以下URL

https://ben-bucket.s3.amazonaws.com/db.sqlite
Run Code Online (Sandbox Code Playgroud)

我提供的代码没有设置public-read的权限.

Joh*_*ein 9

默认情况下,Amazon S3中的所有对象都是私有的.然后,您可以添加权限,以便人们可以访问您的对象.这可以通过以下方式完成:

  • 访问控制列出单个对象的权限
  • 一个Bucket Policy,根据路径,IP地址,引用等方式授予广泛的访问权限
  • 向具有AWS凭据的用户授予权限的IAM用户和组
  • 预签名网址

如果您希望授予对整个存储桶的公共访问权限,则最简单的选项是创建这样的存储桶策略(来自存储桶策略示例):

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::MY-BUCKET/*"]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果你希望公众能够获得只授予一个子目录 斗,使用方法:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::MY-BUCKET/PATH/*"]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

是的,您还可以为每个单独的文件设置权限.代码是:

import boto3
s3 = boto3.resource('s3')
object = s3.Bucket('ben-bucket').Object('db.sqlite')
object.Acl().put(ACL='public-read')
Run Code Online (Sandbox Code Playgroud)

参考:Boto3 S3访问控制