更新时间:2024-09-05 GMT+08:00

ObsClient初始化(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当前开通的服务地址。

securityToken

string

可选

临时访问密钥中的SecurityToken。

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

WithCustomDomainName(cname bool)

是否通过自定义域名访问OBS服务。默认为false。

默认

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/intl/zh-cn/usermanual-ca/ca_01_0003.html。
        ak := os.Getenv("AccessKeyID")
        sk := os.Getenv("SecretAccessKey")
        // endpoint填写Bucket对应的Endpoint, 这里以中国-香港为例,其他地区请按实际情况填写。
        endPoint := "https://obs.ap-southeast-1.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/intl/zh-cn/usermanual-ca/ca_01_0003.html。
        ak := os.Getenv("AccessKeyID")
        sk := os.Getenv("SecretAccessKey")
        // endpoint填写Bucket对应的Endpoint, 这里以中国-香港为例,其他地区请按实际情况填写。
        endPoint := "https://obs.ap-southeast-1.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/intl/zh-cn/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.ap-southeast-1.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/intl/zh-cn/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.ap-southeast-1.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/intl/zh-cn/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.ap-southeast-1.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/intl/zh-cn/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.ap-southeast-1.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/intl/zh-cn/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.ap-southeast-1.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中指定。