华为云对象存储OBSObsClient初始化(Go SDK)_云淘科技

功能说明

ObsClient是访问OBS服务的Go客户端,它为调用者提供一系列与OBS服务进行交互的接口,用于管理、操作桶(Bucket)和对象(Object)等OBS服务上的资源。使用OBS Go SDK向OBS发起请求,您需要初始化一个ObsClient实例,并根据需要调整客户端配置参数。

初始化方法

func New(ak, sk, endpoint string, configurers ...configurer) (*ObsClient, error)

参数描述

字段名

类型

约束

说明

ak

string

必选

访问密钥中的AK。

sk

string

必选

访问密钥中的SK。

endpoint

string

必选

连接OBS的服务地址。包含协议类型、域名(或IP)、端口号。示例:https://your-endpoint:443。(出于安全性考虑,建议使用https协议)

您可以从这里查看OBS当前开通的服务地址。

configurers

configurer(obs包中的私有类型)

可选

一组用于配置ObsClient的参数,可进行连接超时时间、最大重试次数、最大连接数等配置。

可用的configurer

您可通过configurer(obs命名空间中的私有类型)对ObsClient进行配置,可用的configurer见下表:

创建方式

描述

建议值

WithSslVerifyAndPemCerts(sslVerify bool, pemCerts []byte)

配置验证服务端证书的参数。默认为不验证。

N/A

WithHeaderTimeout(headerTimeout int)

配置获取响应头的超时时间。默认为60秒。

[10,60]

WithMaxConnections(maxIdleConns int)

配置允许最大HTTP空闲连接数。默认为1000。

N/A

WithConnectTimeout(connectTimeout int)

配置建立HTTP/HTTPS连接的超时时间(单位:秒)。默认为60秒。

[10,60]

WithSocketTimeout(socketTimeout int)

配置读写数据的超时时间(单位:秒)。默认为60秒。

[10,60]

WithIdleConnTimeout(idleConnTimeout int)

配置空闲的HTTP连接在连接池中的超时时间(单位:秒)。默认为30秒。

默认

WithMaxRetryCount(maxRetryCount int)

配置HTTP/HTTPS连接异常时的请求重试次数。默认为3次。

[1,5]

WithProxyUrl(proxyUrl string)

配置HTTP代理。

N/A

WithHttpTransport(transport *http.Transport)

配置自定义的Transport。

默认

WithRequestContext(ctx context.Context)

配置每次HTTP请求的上下文。

N/A

WithMaxRedirectCount(maxRedirectCount int)

配置HTTP/HTTPS请求重定向的最大次数。默认为3次。

[1,5]

WithSecurityToken(securityToken string)

配置临时访问密钥中的SecurityToken

N/A

建议值为N/A的表示需要根据实际情况进行设置。
如网络状况不佳,建议增大WithConnectTimeout和WithSocketTimeout的值。

代码示例

您可以通过New函数创建OBS客户端,永久访问密钥(AK/SK)创建OBS客户端示例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 引入依赖包
import (
    obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
    ak := os.Getenv("AccessKeyID")
    sk := os.Getenv("SecretAccessKey")
    // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
    endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
    // 创建obsClient实例
    obsClient, err := obs.New(ak, sk, endPoint)
    if err == nil {
         // 使用访问OBS

         // 关闭obsClient
         obsClient.Close()
    }
}

携带代理proxy创建OBS客户端代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 引入依赖包
import (
       "obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
    ak := os.Getenv("AccessKeyID")
    sk := os.Getenv("SecretAccessKey")
    // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
    endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
    // 创建obsClient实例
    obsClient, err := obs.New(ak, sk, endPoint, obs.WithProxyUrl("https://username:password!@yourProxy"))
    if err == nil {
         // 使用访问OBS

         // 关闭obsClient
         obsClient.Close()
    }
}

临时访问密钥(AK/SK和SecurityToken)创建OBS客户端代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 引入依赖包
import (
    obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
    ak := os.Getenv("AccessKeyID")
    sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    // securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
    endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
    // 创建obsClient实例
    // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。
    obsClient, err := obs.New(ak, sk, endPoint, obs.WithSecurityToken(securityToken))
    if err == nil {
         // 使用访问OBS

         // 关闭obsClient
         obsClient.Close()
    }
}

您还可以通过配置系统环境变量的方式或者通过访问ECS服务器获取临时访问密钥的方式创建OBS客户端。

从环境变量中获取访问密钥创建OBS客户端的代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 引入依赖包
import (
    obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
    ak := os.Getenv("AccessKeyID")
    sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    // securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
    endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
    // 创建obsClient实例
    // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。
    obsClient, err := obs.New(ak, sk, endPoint, obs.WithSecurityProviders(obs.NewEnvSecurityProvider(""))
    if err == nil {
         // 使用访问OBS

         // 关闭obsClient
         obsClient.Close()
    }
}

以上方式会从当前系统的环境变量中寻找访问密钥,需要对应在环境变量中定义OBS_ACCESS_KEY_ID、OBS_SECRET_ACCESS_KEY字段。同时如果采用临时访问密钥时,还需要在环境变量中定义OBS_SECURITY_TOKEN字段。

从ECS获取临时访问密钥创建OBS客户端的代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 引入依赖包
import (
    obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
    ak := os.Getenv("AccessKeyID")
    sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    // securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
    endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
    // 创建obsClient实例
    // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。
    obsClient, err := obs.New(ak, sk, endPoint, obs.WithSecurityProviders(obs.NewEcsSecurityProvider(1))
    if err == nil {
         // 使用访问OBS

         // 关闭obsClient
         obsClient.Close()
    }
}

当应用程序部署在ECS服务器上且该ECS绑定了相关委托项时,可以采用以上方式从ECS服务器上自动获取临时访问密钥。

使用链式方式从系统环境变量及ECS上获取访问密钥创建OBS客户端的代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 引入依赖包
import (
    obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
    ak := os.Getenv("AccessKeyID")
    sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    // securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
    endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
    // 创建obsClient实例
    // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。
    obsClient, err := obs.New(ak, sk, endPoint,
      obs.WithSecurityProviders(obs.NewEnvSecurityProvider(""), obs.NewEcsSecurityProvider(1)) 
    )
    if err == nil {
         // 使用访问OBS

         // 关闭obsClient
         obsClient.Close()
    }
}

以上初始化过程指定以链式的方式从环境变量和ECS中顺序获取访问密钥,并采用第一组成功获取到的访问密钥创建obsClient。

您的工程中可以有多个ObsClient,也可以只有一个ObsClient。

ObsClient是协程安全的,可在并发场景下使用。
ObsClient在调用ObsClient.close方法关闭后不能再次使用。

您可以通过调用WithHttpTransport传入自定义Transport实现指定单Host最大连接数的功能,示例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 引入依赖包
import (
       "time"
    obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

// 创建ObsClient结构体
var obsClient, err = obs.New(ak, sk, endpoint, obs.WithHttpTransport(transport))

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
    ak := os.Getenv("AccessKeyID")
    sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    // securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
    endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
    // 初始化自定义transport
    var maxIdleConns = 1000
    var maxConnsPerHost = 1000
    var idleConnTimeout = 30
    var transport = &http.Transport{
        MaxIdleConns:        maxIdleConns,
        MaxIdleConnsPerHost: maxIdleConns,
        MaxConnsPerHost:     maxConnsPerHost,
        IdleConnTimeout:     time.Second * time.Duration(idleConnTimeout),
    }
    // 创建obsClient实例
    // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。
    obsClient, err := obs.New(ak, sk, endPoint,obs.WithHttpTransport(transport))

    if err == nil {
        // 使用访问OBS
        // 关闭obsClient
        obsClient.Close()
    }
}

只有在Golang 1.11以上的版本中才支持在Transport结构中指定MaxConnsPerHost参数;
如果指定了自定义的Transport,则无法通过WithMaxConnections、WithProxyUrl等配置方法配置Transport相关的最大空闲连接数、代理配置等参数,对应参数应直接在自定义Transport中指定;

父主题: 初始化(Go SDK)

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家