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。

int setBucketPrivate (Client& client, const std::string& bucketName) {
    PutBucketAclRequest request(bucketName, "private");//第二个参数为CannedACL
    PutBucketAclResponse response;
    int ret = client.put_bucket_acl(request, &response);
    //client error
    if (ret != 0) {
        return ret;
    }
    //response errro
    if (response.is_fail()) {
        printf("error-message:%s\n", response.error().message().c_str());
        return response.status_code();
    }
    return 0;
}

CannedACL包含三个值: privatepublic-readpublic-read-write ,它们分别对应相关权限。具体内容可以参考BOS API文档 使用CannedAcl方式的权限控制

查看Bucket的权限

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

GetBucketAclRequest("bucketName");
GetBucketAclResponse response;
int ret = client.get_bucket_acl(request, &response);
if (response.is_fail()) {
        printf("error-message:%s\n", response.error().message().c_str());
        return;
}
std::string owner_id = reponse.owner().id;
std::cout << "owner_id: " << owner_id << std::endl;
for (const Grant& grant : response.access_control_list()) {//c++11
    do_something(grant);
}

get_bucket_acl方法返回的response中可供调用的参数有:

参数 类型 说明
owner Owner(string) Bucket owner id
access_control_list vector\ 保存acl的容器
+grantee vector\ 被授权人ID
+permission vector\ 标识被授权人的权限

查看Bucket所属的区域

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

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

Client client (ak, sk, config);

ListBucketsRequest listBucketsRequest;
ListBucketsResponse listBucketsResponse;
int ret = client.list_buckets(listBucketsRequest, &listBucketsResponse)
std::vector<BucketSummary> bucketSummaryList =  listBucketsResponse.buckets();
if (listBucketsResponse.is_fail()) {
        printf("error-message:%s\n", listBucketsResponse.error().message().c_str());
        return ;
}
for(const BucketSummary& bs : bucketSummaryList){
    std::cout << "name: " << bs.name << 
        " location: " << bs.location << std::endl;
}

GetBucketLocationRequest getBucketLocationRequest("bucketName");
GetBucketLocationResponse getBucketLocationResponse;
ret = client.get_bucket_location(getBucketLocationRequest, 
                    &getBucketLocationResponse);
if (getBucketLocationResponse.is_fail()) {
        printf("error-message:%s\n", response.error().message().c_str());
        return;
}
std::cout << "location: " << getBucketLocationResponse.location() << std::endl;

新建Bucket

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

int createBucket (Client& client, const std::string& bucketName) {
    // 新建一个Bucket
    PutBucketRequest request(bucketName);
    PutBucketResponse response;
    int ret = client.put_bucket(request, &response);
    if (ret !=0) {
        return ret;
    }
    if (response.is_fail()) {
        printf("error-message:%s\n", response.error().message().c_str());
    }
    return ret;
}
int main() {
    std::sting ak = "ak";
    std::string sk = "sk";
    Client client(ak, sk);
    int ret = createBucket(client, "bucketName");
    std::string ret_info = stringfy_ret_code(ret);
    std::cout << ret_info << std::endl;
}

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

Bucket的命名有以下规范:

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

通过上述代码创建的bucket,权限是私有读写,存储类型是标准类型(Standard)。

列举Bucket

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

int listBuckets (Client& client) {
    // 获取用户的Bucket列表
    ListBucketsRequest listBucketsRequest;
    ListBucketsResponse listBucketsResponse;
    int ret = client.list_buckets(listBucketsRequest, &listBucketsResponse)
    std::vector<BucketSummary> bucketSummaryList = listBucketsResponse.buckets();
    if (listBucketsResponse.is_fail()) {
        printf("error-message:%s\n", listBucketsResponse.error().message().c_str());
        return ret;
    }
    // 遍历Bucket
    for(const BucketSummary& bs : bucketSummaryList){
        std::cout << "bucketName: " << bs.name <<  std::endl;
    }
    return ret;
}

删除Bucket

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

int deleteBucket (Client& client, const std::string& bucketName) {
    // 删除Bucket
    DeleteBucketRequest request(bucketName);
    DeleteBucketResponse response;
    int ret = client.delete_bucket(request, &response);
    if (response.is_fail()) {
        printf("error-message:%s\n", listBucketsResponse.error().message().c_str());
    }
    return ret;
}

注意:

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

判断Bucket是否存在

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

//0 表示check成功,bucket存在
//-1不存在
//other其他错误,具体error-message给出
int checkBucketExist (Client& client, const std::string& bucketName) {
    bool exist = false;
    // 获取Bucket的存在信息
    HeadBucketRequest request(bucketName);
    HeadBucketResponse response;
    int ret = client.head_bucket(request, &response);
    if (response.is_fail() && response.status_code() != 404){
        printf("error-message:%s\n", response.error().message().c_str());
        return ret; 
    } else if (response.status_code() == 404){
        return -1;
    }
    //200 ok
    return 0;
}

注意:
如果Bucket不为空(即Bucket中有Object存在),则Bucket无法被删除,必须清空Bucket后才能成功删除。