Bucket

Bucket既是BOS上的命名空间,也是计费、权限控制、日志记录等高级功能的管理实体。

  • Bucket名称在所有区域中具有全局唯一性,且不能修改。

    说明:

    百度智能云目前开放了多区域支持,请参考区域选择说明。目前支持“华北-北京”、“华南-广州”和“华东-苏州”三个区域。

  • 存储在BOS上的每个Object都必须包含在一个Bucket中。

  • 一个用户最多可创建100个Bucket,但每个Bucket中存放的Object的数量和大小总和没有限制,用户不需要考虑数据的可扩展性。

Bucket权限管理

设置Bucket的访问权限

如下代码将Bucket的权限设置为了private:

bos_client.set_bucket_canned_acl(bucket_name, canned_acl.PRIVATE)

其中canned_acl中包含三个参数:PRIVATEPUBLIC_READPUBLIC_READ_WRITE,它们分别对应的相关权限为:privatepublic-readpublic-read-write。关于权限的具体内容可以参考《BOS API文档 使用CannedAcl方式的权限控制》。

设置指定用户对Bucket的访问权限

BOS提供set_bucket_acl方法来实现指定用户对Bucket的访问权限设置,可以参考如下代码实现:

bos_client.set_bucket_acl(
    bucket_name,
    [{'grantee': [{'id': 'b124deeaf6f641c9ac27700b41a350a8'},
                  {'id': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'}],
      'permission': ['FULL_CONTROL']}])

注意:

  1. id为用户ID,您可在用户信息中查看。
  2. permission中的权限设置包含三个值:READWRITEFULL_CONTROL,它们分别对应相关权限。具体内容可以参考《BOS API文档 上传ACL文件方式的权限控制》。
  3. set_bucket_acl()的第二个参数acl不需要包含"accessControlList"字段,已经封装到接口中。

设置更多Bucket访问权限

  1. 通过设置refer白名单方式设置防盗链
myAcl =[{"grantee":[{"id": "*"}], 
        "permission":["FULL_CONTROL"], 
        "condition":{
            "referer":{"stringEquals":["http://test/index"]}
            }
        }]
bos_client.set_bucket_acl(bucket_name, myAcl)
  1. 限制客户端IP访问,只允许部分客户端IP访问
myAcl = [{"grantee":[{"id":"*"}], 
        "permission":["FULL_CONTROL"], 
        "condition":{"ipAddress":["192.170.0.6"]}
        }]
bos_client.set_bucket_acl(bucket_name, myAcl)

设置STS临时token权限

对于通过STS方式创建的临时访问身份,管理员也可进行专门的权限设定。
STS的简介及设置临时权限的方式可参见临时授权访问

使用BOS Python SDK设置STS临时token权限可参考通过sts方式访问BOS

查看Bucket的权限

如下代码可以查看Bucket的权限:

response = bos_client.get_bucket_acl(bucket_name)

bos_client.set_bucket_acl(bucket_name, response.access_control_list)

get_bucket_acl方法返回的解析类中可供调用的参数有:

参数 说明
owner Bucket owner信息
+id Bucket owner的用户ID
access_control_list 标识Bucket的权限列表
+grantee 标识被授权人
++id 被授权人ID
+permission 标识被授权人的权限

查看Bucket所属的区域

Bucket Location即Bucket Region,百度智能云支持的各region详细信息可参见区域选择说明

如下代码可以获取该Bucket的Location信息:

region = bos_client.get_bucket_location(bucket_name)                  
print region

新建Bucket

如下代码可以新建一个Bucket:

if not bos_client.does_bucket_exist(bucket_name):
    bos_client.create_bucket(bucket_name)

注意:
由于Bucket的名称在所有区域中是唯一的,所以需要保证bucketName不与其他所有区域上的Bucket名称相同。
Bucket的命名有以下规范:

  • 只能包括小写字母,数字,短横线(-)。
  • 必须以小写字母或者数字开头。
  • 长度必须在3-63字节之间。

列举Bucket

用如下方式可以列出用户所有的Bucket:

response = bos_client.list_buckets()
for bucket in response.buckets:
     print bucket.name

list_buckets方法返回的解析类中可供调用的参数如下:

参数 说明
owner Bucket Owner信息
+id Bucket Owner的用户ID
+display_name Bucket Owner的名称
buckets 存放多个Bucket信息的容器
bucket 存放一个Bucket信息的容器
+name Bucket名称
+creation_date Bucket创建时间
+location Bucket所属的区域

删除Bucket

如下代码可以删除一个Bucket:

bos_client.delete_bucket(bucket_name)

注意:

  • 如果Bucket不为空(即Bucket中有Object和未完成的三步上传Part存在),则Bucket无法被删除,必须清空Bucket后才能成功删除。
  • 在删除前确认该Bucket没有开通跨区域复制,不是跨区域复制规则中的源Bucke>t或目标Bucket,否则不能删除。

判断Bucket是否存在

若用户需要判断某个Bucket是否存在,则如下代码可以做到:

# 获取Bucket的存在信息,需要传入bucket名称,返回值为布尔型
exists = bos_client.does_bucket_exist(bucket_name)
# 输出结果
if exists:
    print "Bucket exists"
else:
    print "Bucket not exists"

Bucket生命周期管理

应用场景

一个数据是有其生命周期的,从创建到归档到删除可以认为是一个完整的循环。创建之初的数据往往需要频繁访问读取,之后迅速冷却归档,最终被删除。生命周期管理就是对象存储服务帮助用户自动化管理数据的生命周期。 通常可以服务于以下场景:

  1. 数据达到一定寿命后自动归档或删除。
  2. 指定时间执行操作。

新建Lifecycle配置

如下代码新建了一个Lifecycle配置

rule = {}
rule['id'] = 'rule1'
rule['status'] = 'enabled'
rule['action'] = {}
rule['action']['name'] = 'Transition'
rule['action']['storageClass'] = 'STANDARD_IA'
#对baidubosmty2里所有Object生效
rule['resource'] = ['baidubosmty2/*']
rule['condition'] = {}
rule['condition']['time'] = {'dateGreaterThan': 'XXXX-XX-XXTXX:XX:XXZ'}
rules=[]
rules.append(rule)
bos_client.put_bucket_lifecycle(bucket_name, rules)

注意:

  1. 只有Bucket的Owner拥有full control才能够进行此操作。
  2. "resource"指明规则对哪些资源生效。例如,对samplebucket里以prefix/为前缀的Object生效:samplebucket/prefix/*;对samplebucket里所有Object生效:samplebucket/*

生命周期管理功能相关参数的详细解释及配置注意事项请参见PutBucketLifecycle接口

读取Bucket的Lifecycle配置

如下代码可读取Bucket的Lifecycle配置

response = bos_client.get_bucket_lifecycle(bucket_name)

删除Bucket Lifecycle

如下代码可以删除Bucket的lifecycle:

bos_client.delete_bucket_lifecycle(bucket_name)

Bucket跨域资源访问

应用场景

跨域资源共享(CORS)允许WEB端的应用程序访问不属于本域的资源。BOS提供接口方便开发者控制跨域访问的各种权限。

设定CORS规则

如下代码设定了一个CORS规则:

conf = {}
conf['allowedOrigins'] = ['http://www.boluor.com']
conf['allowedMethods'] = ['GET', 'HEAD', 'DELETE']
conf['allowedHeaders'] = ['Authorization', 'x-bce-test', 'x-bce-test2']
conf['allowedExposeHeaders'] = ['user-custom-expose-header']
conf['maxAgeSeconds'] = 3600
confs = []
#每个Bucket最多允许有100条规则。
confs.append(conf)
bos_client.put_bucket_cors(bucket_name, confs)

注意:

  1. 如果原规则存在则覆盖原规则。
  2. 只有Bucket的所有者和被授予FULL_CONTROL权限的用户才能设置Bucket的CORS。没有权限时,返回403 Forbidden错误,错误码:AccessDenied。

CORS规则相关参数的详细解释请参见PutBucketCors接口

获取Bucket的CORS规则

如下代码可获取Bucket的CORS配置:

response = bos_client.get_bucket_cors(bucket_name)

关闭Bucket的CORS功能并清空所有规则

如下代码可以关闭Bucket的CORS功能并清空所有规则:

bos_client.delete_bucket_cors(bucket_name)