Ceph radosgw - bucket policy - 使所有对象 public-默认读取
Ceph radosgw - bucket policy - make all objects public-read by default
我和一群非开发人员一起工作,他们正在通过 radosgw 将对象上传到 s3 样式的存储桶。所有上传的对象都需要 public 可用,但它们不能以编程方式执行此操作。有没有办法使对象的默认权限 public-read 不必每次都手动设置?必须有一种方法可以用 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')
我将策略设置为 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)
现在,当一个对象被上传到 public-bucket 时,它可以被匿名下载,而无需明确设置密钥权限为 public-read 或生成下载 URL。
如果您这样做,请务必确定任何人都可以下载这些内容。特别是如果您的 radosgw 服务 public 只能在互联网上访问。
我和一群非开发人员一起工作,他们正在通过 radosgw 将对象上传到 s3 样式的存储桶。所有上传的对象都需要 public 可用,但它们不能以编程方式执行此操作。有没有办法使对象的默认权限 public-read 不必每次都手动设置?必须有一种方法可以用 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')
我将策略设置为 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)
现在,当一个对象被上传到 public-bucket 时,它可以被匿名下载,而无需明确设置密钥权限为 public-read 或生成下载 URL。
如果您这样做,请务必确定任何人都可以下载这些内容。特别是如果您的 radosgw 服务 public 只能在互联网上访问。