Ceph Radosgw-存储桶策略-默认情况下将所有对象公开读取 - python

我与一群非开发人员合作,他们通过radosgw将对象上传到s3样式存储桶。所有上载的对象都必须公开可用,但不能以编程方式进行。有没有一种方法可以使对象的默认权限公开读取,因此不必每次都手动设置此权限?必须使用boto进行此操作,但是我还没有找到任何示例。使用AWS的GUI有很多选择,但这对我来说不是一个选择。 🙁

我正在创建一个像这样的存储桶:

#!/usr/bin/env python

import boto
import boto.s3.connection

access_key = "SAMPLE3N84XBEHSAMPLE"
secret_key = "SAMPLEc4F3kfvVqHjMAnsALY8BCQFwTkI3SAMPLE"

conn = boto.connect_s3(
        aws_access_key_id = access_key,
        aws_secret_access_key = secret_key,
        host = '10.1.1.10',
        is_secure=False,
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )

bucket = conn.create_bucket('public-bucket', policy='public-read')

我将策略设置为“公共读取”,这似乎允许人们将存储桶作为目录浏览,但是存储桶中的对象不继承此权限。

>>> print bucket.get_acl()
<Policy: http://acs.amazonaws.com/groups/global/AllUsers = READ, S3 Newbie (owner) = FULL_CONTROL>

需要澄清的是,我确实知道可以像这样按每个对象来解决此问题:

key = bucket.new_key('thefile.tgz')
key.set_contents_from_filename('/home/s3newbie/thefile.tgz')
key.set_canned_acl('public-read')

但是我的最终用户无法执行此操作,因此我需要一种方法来将其设置为上载文件的默认权限。

参考方案

我找到了解决问题的办法。

首先,非常感谢joshbean发布了此内容:https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/python/example_code/s3/s3-python-example-put-bucket-policy.py

我注意到他正在使用boto3库,因此我开始将其用于连接。

import boto3
import json

access_key = "SAMPLE3N84XBEHSAMPLE"
secret_key = "SAMPLEc4F3kfvVqHjMAnsALY8BCQFwTkI3SAMPLE"

conn = boto3.client('s3', 'us-east-1',
                    endpoint_url="http://mycephinstance.net",
                    aws_access_key_id = access_key,
                    aws_secret_access_key = secret_key)

bucket = "public-bucket"

bucket_policy = {
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::{0}/*".format(bucket)]
    }
  ]
}

bucket_policy = json.dumps(bucket_policy)
conn.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy)

现在,当将对象上传到公共桶中时,可以匿名下载该对象,而无需显式将密钥许可设置为公共读取或生成下载URL。

如果您要这样做,请务必确保任何人都可以下载该文件。特别是如果您的radosgw服务可以在Internet上公开访问。

45码