Bucket管理

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

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

说明:

  • 百度智能云目前开放了多区域支持,请参考区域选择说明
    目前支持“华北-北京”、“华南-广州”和“华东-苏州”三个区域。北京区域:http://bj.bcebos.com,广州区域:http://gz.bcebos.com,苏州区域:http://su.bcebos.com
  • 存储在BOS上的每个Object都必须包含在一个Bucket中。
  • 一个用户最多可创建100个Bucket,但每个Bucket中存放的Object的数量和大小总和没有限制,用户不需要考虑数据的可扩展性。

Bucket权限管理

设置Bucket的访问权限

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

use BaiduBce\Services\Bos\CannedAcl;
$client->setBucketCannedAcl($bucket, CannedAcl::ACL_PRIVATE);

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

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

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

$my_acl = array(
    array(
        'grantee' => array(
             array(
                 'id' => '7f34788d02a64a9c98f85600567d98a7',
             ),
             array(
                 'id' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
             ),
         ),
         'permission' => array('FULL_CONTROL'),
    ),
);
$client->setBucketAcl($bucket, $my_acl);

注意:

  1. permission中的权限设置包含三个值:READWRITEFULL_CONTROL,它们分别对应相关权限。具体内容可以参考《BOS API文档 上传ACL文件方式的权限控制》。
  2. 设置两个以上(含两个)被授权人时,请参考以上示例的格式,若将数组合并会返回报错。

设置更多Bucket访问权限

  1. 通过设置referer白名单方式设置防盗链

    $my_acl = array(
        array(
            'grantee' => array(
                array(
                    'id' => '7f34788d02a64a9c98f85600567d98a7',
                ),
            ),
            'permission' => array('FULL_CONTROL'),
            'condition' => array(
                'referer' => array(
                    'stringLike' => array('http://www.abc.com/*'),
                    'stringEquals' => array('http://www.abc.com'),
                ),
            ),
        ),
    );
    $client->setBucketAcl($bucket, $my_acl);
    
  2. 限制客户端IP访问,只允许部分客户端IP访问

    $my_acl = array(
        array(
             'grantee' => array(
                  array(
                      'id' => '7f34788d02a64a9c98f85600567d98a7',
                  ),
             ),
             'permission' => array('FULL_CONTROL'),
             'condition' => array(
                'ipAddress' => array("192.168.0.0/16"),
             ),
        ),
    );
    $client->setBucketAcl($bucket, $my_acl);
    

设置STS临时token权限

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

使用BOS PHP SDK设置STS临时token权限可参考使用STS创建BosClient

查看Bucket的权限

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

$response = $client->getBucketAcl($bucket);

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

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

查看Bucket所属的区域

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

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

$client->getBucketLocation($bucketName);

新建Bucket

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

$bucketName = "your_bucket";

//Bucket是否存在,若不存在创建Bucket
$exist = $client->doesBucketExist($bucketName);
if(!$exist){
    $client->createBucket($bucketName);
}

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

Bucket的命名有以下规范:

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

通过上述代码创建的bucket,权限是私有读写,存储类型是标准类型(Standard)。用户在控制台创建Bucket时可以指定Bucket权限和存储类型。

列举Bucket

如下代码可以列出用户所有的Bucket:

$response = $client->listBuckets();
foreach ($response->buckets as $bucket) {
    print $bucket->name;
}

删除Bucket

删除指定Bucket

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

$bucketName = "your_bucket";
$client->deleteBucket($bucketName);

注意:

  • 在删除前需要保证此Bucket下的所有Object和未完成的三步上传Part已经被删除,否则会删除失败。
  • 在删除前确认该Bucket没有开通跨区域复制,不是跨区域复制规则中的源Bucket或目标Bucket,否则不能删除。

删除所有Bucket

deleteBucketlistBuckets函数结合,可以删除全部Bucket,参考代码如下:

//列出全部Bucket
$response = $client->listBuckets();

//遍历删除全部Bucket
foreach ($response->buckets as $bucket) {
    $marker = null;
    while (true) {
        $options = array();
        if ($marker !== null) {
            $options[BosOptions::MARKER] = $marker;
        }
        $response = $client->listObjects($bucket->name, $options);
        foreach ($response->contents as $object) {
            $client->deleteObject($bucket->name, $object->key);
        }
        if ($response->isTruncated) {
            $marker = $response->nextMarker;
        } else {
            break;
        }
    }
    $client->deleteBucket($bucket->name);
}

判断Bucket是否存在

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

$client->doesBucketExist($bucketName);

Bucket跨区域同步

Bucket跨区域同步实现了不同Region间Bucket内数据的自动同步,并且支持通过设置具体规则来定制同步方式。其中同步的数据分为两种,存量数据和增量数据。以下为使用方法:

创建跨区域同步

$replication_rule = array(
        'status' => 'enabled',
        'replicateDeletes' => 'enabled',
        'id' => 'sample'
        );
$replication_rule['resource'][0] = $bj_bucket . "/*";
$replication_rule['destination']['bucket'] = $gz_bucket;
$replication_rule['replicateHistory']['bucket'] = $gz_bucket;
$bj_client->putBucketReplication($bj_bucket, $replication_rule);

获取跨区域复制的Bucket信息

$response = $bj_client->getBucketReplication($bj_bucket);

删除跨区域同步复制配置

$response = $bj_client->deleteBucketReplication($bj_bucket);

获取Bucket跨区域复制的进程状态

$response = $bj_client->getBucketReplicationProgress($bj_bucket);