所有文档

          对象存储 BOS

          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。

          err := bosClient.PutBucketAclFromCanned(bucketName, "private")

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

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

          BOS还可以实现设置指定用户对Bucket的访问权限,参考如下代码实现:

          // import "github.com/baidubce/bce-sdk-go/bce"
          // import "github.com/baidubce/bce-sdk-go/services/bos/api"
          
          // 1. 直接上传ACL文件流
          aclBodyStream := bce.NewBodyFromFile("<path-to-acl-file>")
          err := bosClient.PutBucketAcl(bucket, aclBodyStream)
          
          // 2. 直接使用ACL json字符串
          aclString := `{
              "accessControlList":[
                  {
                      "grantee":[{
                          "id":"e13b12d0131b4c8bae959df4969387b8" //指定用户ID
                      }],
                      "permission":["FULL_CONTROL"] //指定用户权限
                  }
              ]
          }`
          err := bosClient.PutBucketAclFromString(bucket, aclString)
          
          // 3. 使用ACL文件
          err := bosClient.PutBucketAclFromFile(bucket, "<acl-file-name>")
          
          // 4. 使用ACL struct对象设置
          grantUser1 := api.GranteeType{"<user-id-1>"}
          grantUser2 := api.GranteeType{"<user-id-2>"}
          grant1 := api.GrantType{
          	Grantee: []api.GranteeType{grantUser1},
          	Permission: []string{"FULL_CONTROL"},
          }
          grant2 := api.GrantType{
          	Grantee: []api.GranteeType{granteUser2},
          	Permission: []string{"READ"},
          }
          grantArr := make([]api.GranteeType, 0)
          grantArr = append(grantArr, grant1)
          grantArr = append(grantArr, grant2)
          args := &api.PutBucketAclArgs{grantArr}
          err := bosClient.PutBucketAclFromStruct(bucketName, args)

          注意: Permission中的权限设置包含三个值:READWRITEFULL_CONTROL,它们分别对应相关权限。具体内容可以参考BOS API文档 上传ACL文件方式的权限控制。 ACL规则比较复杂,直接编辑ACL的文件或JSON字符串比较困难,因此提供了第四种方式方便使用代码创建ACL规则。

          设置更多Bucket访问权限

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

            aclString := `{
                "accessControlList":[
                    {
                        "grantee":[{"id":"*"]},        //指定用户ID为全部用户
                        "permission":["FULL_CONTROL"], //指定用户权限
                        "condition":[{"referer": {"stringEquals": "http://allowed-domain/"}}]
                    }
                ]
            }`
            err := bosClient.PutBucketAclFromString(bucket, aclString)
          2. 限制客户端IP访问,只允许部分客户端IP访问

            aclString := `{
                "accessControlList":[
                    {
                        "grantee":[{"id":"*"]}, //指定用户ID为全部用户
                        "permission":["READ"],  //指定用户权限
                        "condition":[{"ipAddress": ["ip-1", "ip-2"]}]
                    }
                ]
            }`
            err := bosClient.PutBucketAclFromString(bucket, aclString)

          设置STS临时token权限

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

          STS的简介及设置临时权限的方式可参见临时授权访问

          使用BOS GO SDK设置STS临时token权限可参考如下示例:

          // import "github.com/baidubce/bce-sdk-go/services/sts"
          
          AK, SK := <your-access-key-id>, <your-secret-access-key>
          stsClient, err := sts.NewClient(AK, SK)
          aclString := `{
              "accessControlList":[
                  {
                      "grantee":[{"id":"*"]},        //指定用户ID为全部用户
                      "permission":["FULL_CONTROL"], //指定用户权限
                      "condition":[{"referer": {"stringEquals": "http://allowed-domain/"}}]
                  }
              ]
          }`
          //使用有效期为300秒且指定ACL的方式获取临时STS token
          sts, err := stsClient.GetSessionToken(300, aclString)

          查看Bucket的访问权限

          用户可以通过如下接口查看Bucket的访问权限,注意:Bucket的访问权限不能删除,默认为私有。

          result, err := bosClient.GetBucketAcl(bucketName)

          返回的结果对象的字段包含了访问权限的详细内容,具体定义如下:

          type GetBucketAclResult struct {
          	AccessControlList []struct{
          		Grantee []struct {
          			Id string
          		}
          		Permission []string
          	}
          	Owner struct {
          		Id string
          	}
          }

          查看Bucket所属的区域

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

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

          location, err := bosClient.GetBucketLocation(bucketName)

          新建Bucket

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

          // 新建Bucket的接口为PutBucket,需指定Bucket名称
          if loc, err := bosClient.PutBucket(<your-bucket-name>); err != nil {
          	fmt.Println("create bucket failed:", err)
          } else {
          	fmt.Println("create bucket success at location:", loc)
          }

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

          Bucket的命名有以下规范:

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

          列举Bucket

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

          if res, err := bosClient.ListBuckets(); err != nil {
          	fmt.Println("list buckets failed:", err)
          } else {
          	fmt.Println("owner:", res.Owner)
          	for i, b := range res.Buckets {
          		fmt.Println("bucket", i)
          		fmt.Println("    Name:", b.Name)
          		fmt.Println("    Location:", b.Location)
          		fmt.Println("    CreationDate:", b.CreationDate)
          	}
          }

          删除Bucket

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

          err := bosClient.DeleteBucket(bucketName)

          注意:

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

          判断Bucket是否存在

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

          exists, err := bosClient.DoesBucketExist(bucketName)
          if err == nil && exists {
          	fmt.Println("Bucket exists")
          } else {
          	fmt.Println("Bucket not exists")
          }

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

          上一篇
          初始化
          下一篇
          文件管理