You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Boto设置Ceph RadosGW存储桶默认对象public-read权限?

解决Ceph RadosGW上传对象默认Public-Read的问题

我明白你的痛点——非开发团队成员没法手动给每个上传的对象加权限,但又需要所有上传的内容自动公开可读。之前你设置的桶public-read policy其实只是控制了桶的访问权限(比如允许别人列出桶里的内容),但对象的权限是独立的,不会自动继承桶的设置。下面给你两个靠谱的解决方案,都能实现你要的效果:

方案一:设置桶的默认Canned ACL(推荐)

这个方案会让所有新上传到桶里的对象自动继承public-read权限,完全不需要上传者做额外操作,最适合你的场景。

操作步骤:

  1. 如果你已经创建了目标桶,先通过Boto获取桶对象;如果是新建桶,可以在创建后直接设置:
#!/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(),
)

# 方式1:新建桶后设置默认ACL
bucket = conn.create_bucket('public-bucket')
bucket.set_acl('public-read', default=True)

# 方式2:修改已存在的桶的默认ACL
# bucket = conn.get_bucket('public-bucket')
# bucket.set_acl('public-read', default=True)
  1. 验证效果:
    上传任意文件到桶里后,用以下代码检查对象的ACL:
key = bucket.get_key('your-uploaded-file.tgz')
print(key.get_acl())

你应该能看到http://acs.amazonaws.com/groups/global/AllUsers = READ的权限,说明对象已经自动变成公开可读了。

方案二:用桶Policy强制所有对象公开可读

如果你不想修改对象的ACL,也可以通过桶Policy直接授权所有用户读取桶内的所有对象。这种方式下,对象本身的ACL还是私有,但桶的Policy会覆盖这个限制,允许公开访问。

操作步骤:

用Boto设置桶Policy:

import json

# 获取桶对象
bucket = conn.get_bucket('public-bucket')

# 定义桶Policy
bucket_policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": f"arn:aws:s3:::{bucket.name}/*"
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": f"arn:aws:s3:::{bucket.name}"
        }
    ]
}

# 应用Policy
bucket.set_policy(json.dumps(bucket_policy))

设置完成后,所有上传到这个桶的对象都会自动被允许公开访问,即使上传者没设置任何权限。

两种方案的区别

  • 默认ACL方案:对象本身的ACL会被设置为public-read,在对象的权限列表里能直接看到所有用户的读取权限,更直观。
  • 桶Policy方案:对象的ACL保持私有,但桶Policy授权了所有用户的读取权限,适合需要保留对象私有属性但又要公开访问的场景。

对于你的需求(非开发人员上传后自动公开),方案一的默认ACL是最直接且符合预期的选择。

内容的提问来源于stack exchange,提问作者Josh Worley

火山引擎 最新活动