初始化
确认Endpoint
在确认您使用SDK时配置的Endpoint时,可先阅读开发人员指南中关于BOS访问域名的部分,理解Endpoint相关的概念。百度智能云目前开放了多区域支持,请参考区域选择说明。
region与endpoint参考如下链接
https://cloud.baidu.com/doc/BOS/s/akrqd2wcx
常见示例如下:
| 访问区域 | 对应Endpoint |
|---|---|
| BJ | bj.bcebos.com |
| BD | bd.bcebos.com |
| SU | su.bcebos.com |
| GZ | gz.bcebos.com |
| CD | cd.bcebos.com |
| HKG | hkg.bcebos.com |
| FWH | fwh.bcebos.com |
| FSH | fsh.bcebos.com |
获取密钥
要使用百度智能云BOS,您需要拥有一个有效的AK(Access Key ID)和SK(Secret Access Key)用来进行签名认证。AK/SK是由系统分配给用户的,均为字符串,用于标识用户,为访问BOS做签名验证。
可以通过如下步骤获得并了解您的AK/SK信息:
新建BOS Client
BOS Client是BOS服务的客户端,为开发者与BOS服务进行交互提供了一系列的方法。
使用AK/SK新建BOS Client
最简单的创建方式如下:
1package main
2
3import (
4 "fmt"
5
6 "github.com/baidubce/bce-sdk-go/services/bos"
7)
8
9func main() {
10 ak := "YOUR_ACCESS_KEY_ID"
11 sk := "YOUR_SECRET_ACCESS_KEY"
12 endpoint := "https://bj.bcebos.com"
13
14 bosClient, err := bos.NewClient(ak, sk, endpoint)
15 if err != nil {
16 fmt.Printf("create BOS client failed: %v\n", err)
17 return
18 }
19
20 _ = bosClient
21}
需要配置网络参数、寻址方式或重试策略时,推荐先通过 bos.NewBosClientConfig 创建配置,再调用链式配置方法:
1package main
2
3import (
4 "fmt"
5 "time"
6
7 "github.com/baidubce/bce-sdk-go/services/bos"
8)
9
10func main() {
11 config := bos.NewBosClientConfig(
12 "YOUR_ACCESS_KEY_ID",
13 "YOUR_SECRET_ACCESS_KEY",
14 "https://bj.bcebos.com",
15 ).
16 WithRedirectDisabled(true).
17 WithDialTimeout(30 * time.Second).
18 WithResponseHeaderTimeout(60 * time.Second)
19
20 bosClient, err := bos.NewClientWithConfig(config)
21 if err != nil {
22 fmt.Printf("create BOS client failed: %v\n", err)
23 return
24 }
25
26 _ = bosClient
27}
bos.NewBosClientConfig 的主要默认值如下:
- 禁止自动重定向:
RedirectDisabled = true - 使用虚拟主机风格寻址:
PathStyleEnable = false - 启用 Keep-Alive:
DisableKeepAlives = false - 校验 HTTPS 证书:
NoVerifySSL = false - 使用客户端独享的 HTTP Client:
ExclusiveHTTPClient = true - 使用 BOS 专用默认重试策略:
api.DEFAULT_BOS_RETRY_POLICY - API 版本:
v1
直接使用 bos.BosClientConfiguration{} 的零值与上述默认值并不完全相同,因此通常应使用 bos.NewBosClientConfig。
在上面代码中,AK对应控制台中的“Access Key ID”,SK对应控制台中的“Access Key Secret”,获取方式请参考《操作指南 管理ACCESSKEY》。第三个参数ENDPOINT支持用户自己指定域名,如果设置为空字符串,会使用默认域名作为BOS的服务地址。RedirectDisabled 是否关闭重定向,true关闭。
注意:
ENDPOINT参数需要用指定区域的域名来进行定义,如服务所在区域为北京,则为http://bj.bcebos.com。
使用STS创建BOS Client
申请STS token
BOS可以通过STS机制实现第三方的临时授权访问。STS(Security Token Service)是百度智能云提供的临时授权服务。通过STS,您可以为第三方用户颁发一个自定义时效和权限的访问凭证。第三方用户可以使用该访问凭证直接调用百度智能云的API或SDK访问百度智能云资源。
通过STS方式访问BOS,用户需要先通过STS的client申请一个认证字符串,申请方式可参见百度智能云STS使用介绍。
用STS token新建BOS Client
申请好STS后,可将STS Token配置到BOS Client中,从而实现通过STS Token创建BOS Client。
代码示例
GO SDK实现了STS服务的接口,用户可以参考如下完整代码,实现申请STS Token和创建BOS Client对象:
1import (
2 "fmt"
3
4 "github.com/baidubce/bce-sdk-go/auth" //导入认证模块
5 "github.com/baidubce/bce-sdk-go/services/bos" //导入BOS服务模块
6 "github.com/baidubce/bce-sdk-go/services/sts" //导入STS服务模块
7)
8
9func main() {
10 // 创建STS服务的Client对象,Endpoint使用默认值
11 AK, SK := <your-access-key-id>, <your-secret-access-key>
12 stsClient, err := sts.NewClient(AK, SK)
13 if err != nil {
14 fmt.Println("create sts client object :", err)
15 return
16 }
17
18
19 // 获取临时认证token,有效期为60秒,ACL为空
20 sts, err := stsClient.GetSessionToken(60, "")
21 if err != nil {
22 fmt.Println("get session token failed:", err)
23 return
24 }
25
26 //若需指定特殊的权限,示例代码如下
27 /*
28 aclstr := `{
29 "accessControlList":[
30 {
31 "region":"*",
32 "effect":"Allow",
33 "resource":["*"],
34 "service":"bce:bos",
35 "permission":["READ", "WRITE"]
36 }
37 ]
38 }`
39 sts, err := stsClient.GetSessionToken(60, aclstr)
40 /*
41 fmt.Println("GetSessionToken result:")
42 fmt.Println(" accessKeyId:", sts.AccessKeyId)
43 fmt.Println(" secretAccessKey:", sts.SecretAccessKey)
44 fmt.Println(" sessionToken:", sts.SessionToken)
45 fmt.Println(" createTime:", sts.CreateTime)
46 fmt.Println(" expiration:", sts.Expiration)
47 fmt.Println(" userId:", sts.UserId)
48
49 // 使用申请的临时STS创建BOS服务的Client对象,Endpoint使用默认值
50 bosClient, err := bos.NewClient(sts.AccessKeyId, sts.SecretAccessKey, "")
51 if err != nil {
52 fmt.Println("create bos client failed:", err)
53 return
54 }
55 stsCredential, err := auth.NewSessionBceCredentials(
56 sts.AccessKeyId,
57 sts.SecretAccessKey,
58 sts.SessionToken)
59 if err != nil {
60 fmt.Println("create sts credential object failed:", err)
61 return
62 }
63 bosClient.Config.Credentials = stsCredential
64}
注意: 目前使用STS配置BOS Client时,无论对应BOS服务的Endpoint在哪里,STS的Endpoint都需配置为
http://sts.bj.baidubce.com。上述代码中创建STS对象时使用此默认值。
配置访问协议和寻址方式
使用 HTTPS
在 Endpoint 中显式指定 https://:
1bosClient, err := bos.NewClient(
2 "YOUR_ACCESS_KEY_ID",
3 "YOUR_SECRET_ACCESS_KEY",
4 "https://bj.bcebos.com",
5)
使用自定义域名
将自定义域名与 Bucket 绑定后,可将其作为 Endpoint,并开启 CNAME:
1bosClient, err := bos.NewClient(
2 "YOUR_ACCESS_KEY_ID",
3 "YOUR_SECRET_ACCESS_KEY",
4 "https://cdn-test.cdn.bcebos.com",
5)
6if err != nil {
7 return
8}
9bosClient.Config.CnameEnabled = true
CnameEnabled 属于创建后的 bce.BceClientConfiguration,不是 bos.BosClientConfiguration 的字段。
使用 Path Style
默认情况下 SDK 使用虚拟主机风格访问官方 BOS Endpoint。需要路径风格寻址时,在创建客户端前开启:
1config := bos.NewBosClientConfig(
2 "YOUR_ACCESS_KEY_ID",
3 "YOUR_SECRET_ACCESS_KEY",
4 "https://bj.bcebos.com",
5).WithPathStyleEnable(true)
6
7bosClient, err := bos.NewClientWithConfig(config)
生成路径风格的预签名 URL 时,应使用 GeneratePresignedUrlPathStyle。
使用备用 Endpoint
1bosClient.Config.BackupEndpoint = "cdn-test.bj.bcebos.com"
备用 Endpoint 不是在任意失败时都会启用。当前 SDK 仅在以下情况完成主 Endpoint 的重试后尝试备用地址:
- HTTP 500、502、503
- HTTP 400 且服务错误码为
Http400 BceClientError客户端错误
带请求体的请求只有在 Body 可重放时才能切换到备用 Endpoint。普通 403、404 等错误不会触发备用地址。
配置 BOS Client
bos.Client 嵌入了 bce.BceClient。构造阶段使用 bos.BosClientConfiguration;创建成功后,bosClient.Config 是 *bce.BceClientConfiguration。两者字段不同。
参数说明
用户使用GO SDK访问BOS时,创建的BOS Client对象的Config字段支持的所有参数如下表所示:
| 配置项名称 | 类型 | 含义 |
|---|---|---|
| Endpoint | string | 请求服务的域名 |
| ProxyUrl | string | 客户端请求的代理地址 |
| Region | string | 请求资源的区域 |
| UserAgent | string | 用户名称,HTTP请求的User-Agent头 |
| Credentials | *auth.BceCredentials | 请求的鉴权对象,分为普通AK/SK与STS两种 |
| SignOption | *auth.SignOptions | 认证字符串签名选项 |
| Retry | RetryPolicy | 连接重试策略 |
| ConnectionTimeoutInMillis | int | 连接超时时间,单位毫秒,默认20分钟 |
| DialTimeout | *time.Duration | 建立连接的超时时间,默认30*time.Second |
| KeepAlive | *time.Duration | 活跃连接上keepalive探帧的发送周期,默认30*time.Second |
| ReadTimeout | *time.Duration | 每次读调用的超时时间,默认0,不设置超时时间 |
| WriteTimeout | *time.Duration | 每次写调用的超时时间,默认0,不设置超时时间 |
| TLSHandshakeTimeout | *time.Duration | TLS握手的超时时间,默认10 * time.Second |
| IdleConnectionTimeout | *time.Duration | 空闲连接最长保留时间,默认90 * time.Second |
| ResponseHeaderTimeout | *time.Duration | 等待服务端应答headers的超时时间,默认60 * time.Second |
| HTTPClientTimeout | *time.Duration | 从建立连接到读完response body的超时时间,默认1200 * time.Second |
使用代理
代理地址需要包含协议:
1bosClient.Config.ProxyUrl = "http://127.0.0.1:8080"
设置重试策略
BOS 默认使用 api.NewBosRetryPolicy(3, 20000, 300) 创建的专用重试策略。默认最大重试次数为 3,最大等待时间为 20000 毫秒,退避基数为 300 毫秒。该策略会按当前 SDK 实现对网络错误及部分 HTTP 状态进行重试。
关闭重试:
1// import "github.com/baidubce/bce-sdk-go/bce"
2config := bos.NewBosClientConfig(ak, sk, endpoint).
3 WithRetryPolicy(bce.NewNoRetryPolicy())
4bosClient, err := bos.NewClientWithConfig(config)
自定义 BOS 重试策略:
1// import "github.com/baidubce/bce-sdk-go/services/bos/api"
2retryPolicy := api.NewBosRetryPolicy(5, 30000, 500)
3config := bos.NewBosClientConfig(ak, sk, endpoint).
4 WithRetryPolicy(retryPolicy)
设置网络超时参数
1config := bos.NewBosClientConfig(ak, sk, endpoint).
2 WithDialTimeout(10 * time.Second).
3 WithReadTimeout(2 * time.Minute).
4 WithWriteTimeout(2 * time.Minute).
5 WithTLSHandshakeTimeout(10 * time.Second).
6 WithIdleConnectionTimeout(90 * time.Second).
7 WithResponseHeaderTimeout(60 * time.Second).
8 WithHttpClientTimeout(20 * time.Minute)
这些配置分别控制连接建立、底层连接读写、TLS 握手、空闲连接、响应头等待及整个 HTTP 请求的超时。bosClient.Config.ConnectionTimeoutInMillis 是通用 BCE 配置中的请求超时字段,单位为毫秒,默认值为 20 分钟;使用 WithHttpClientTimeout 时 SDK 会同步设置该字段。
使用自定义 HTTP Client
1customClient := http.Client{
2 Timeout: 5 * time.Minute,
3}
4config := bos.NewBosClientConfig(ak, sk, endpoint).
5 WithHttpClient(customClient)
6bosClient, err := bos.NewClientWithConfig(config)
WithHttpClient 接收 http.Client 值。使用自定义 Client 时,代理、Transport、TLS 和连接池等行为由该 Client 的配置共同决定。
配置上传、下载限速
1config := bos.NewBosClientConfig(ak, sk, endpoint).
2 WithUploadRateLimit(10 * 1024).
3 WithDownloadRateLimit(20 * 1024)
限速单位为 KB/s。设置限速时 SDK 会为该 BOS Client 创建独享 HTTP Client。
配置 API 版本
1config := bos.NewBosClientConfig(ak, sk, endpoint).
2 WithApiVersion("v2")
当前 SDK 支持通过构造配置设置默认 API 版本,也可通过 api.ApiVersion(...) 为单次请求指定版本。具体 API 是否支持对应版本请以 BOS 服务文档为准。
TLS 证书校验
1config := bos.NewBosClientConfig(ak, sk, endpoint).
2 WithNoVerifySSL(true)
关闭证书校验会失去对服务端身份和中间人攻击的防护,仅应在受控测试或排障环境临时使用,生产环境应保持默认值 false。
配置签名选项
1headersToSign := map[string]struct{}{
2 "host": {},
3}
4bosClient.Config.SignOption.HeadersToSign = headersToSign
5bosClient.Config.SignOption.ExpireSeconds = 30
说明:
Credentials字段使用auth.NewBceCredentials与auth.NewSessionBceCredentials函数创建,默认使用前者,后者为使用STS鉴权时使用,详见“使用STS创建BOS Client”小节。
SignOption字段为生成签名字符串时的选项,详见下表说明:
名称 类型 含义 HeadersToSign map[string]struct{} 生成签名字符串时使用的HTTP头 Timestamp int64 生成的签名字符串中使用的时间戳,默认使用请求发送时的值 ExpireSeconds int 签名字符串的有效期 其中,HeadersToSign默认为
host,content-type,content-length,content-md5;TimeStamp一般为零值,表示使用调用生成认证字符串时的时间戳,用户一般不应该明确指定该字段的值;ExpireSeconds默认为1800秒即30分钟。Retry字段指定重试策略,目前支持两种:NoRetryPolicy和BackOffRetryPolicy。默认使用后者,该重试策略是指定最大重试次数、最长重试时间和重试基数,按照重试基数乘以2的指数级增长的方式进行重试,直到达到最大重试次数或者最长重试时间为止。
评价此篇文章
