Client是OSS的Go客户端,用于管理存储空间和文件等OSS资源。使用Go SDK发起OSS请求时,您需要初始化一个Client实例,并根据需要修改默认配置项。

新建Client

说明 新建Client时,需要指定Endpoint。关于Endpoint的更多信息,请参见访问域名和数据中心

您可以通过以下多种方式新建Client。

使用OSS域名新建Client

以下代码用于使用OSS域名新建Client。

package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)
func main(){
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    fmt.Printf("client:%#v\n", client)
}       

使用自定义域名新建Client

以下代码用于使用自定义域名新建Client。

说明 使用自定义域名时不支持使用ListBuckets方法。
package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)
func main(){
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    // oss.UseCname(true)用于开启CNAME。CNAME用于将自定义域名绑定至存储空间。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret", oss.UseCname(true))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    fmt.Printf("client:%#v\n", client)
}
            

关于自定义域名的完整示例代码,请参见GitHub

使用STS新建Client

以下代码用于使用STS新建一个Client。

package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)
func main(){
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // yourAccessKeyId以及yourAccessKeySecret分别填写从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
    // yourSecurityToken填写从STS服务获取的安全令牌(SecurityToken)。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret", oss.SecurityToken("yourSecurityToken"))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    fmt.Printf("client:%#v\n", client)
}            

使用EcsRamRole新建Client

以下代码用于使用EcsRamRole新建Client。

package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "github.com/aliyun/credentials-go/credentials"
    "os"
)
type Credentials struct {
    AccessKeyId     string
    AccessKeySecret string
    SecurityToken string
}

type CredentialsProvider struct {
    cred credentials.Credential
}

func (credentials *Credentials) GetAccessKeyID() string {
    return credentials.AccessKeyId
}

func (credentials *Credentials) GetAccessKeySecret() string {
    return credentials.AccessKeySecret
}

func (credentials *Credentials) GetSecurityToken() string {
    return credentials.SecurityToken
}

func (defBuild CredentialsProvider) GetCredentials() oss.Credentials {
    id,_ := defBuild.cred.GetAccessKeyId()
    secret,_ := defBuild.cred.GetAccessKeySecret()
    token,_ := defBuild.cred.GetSecurityToken()

    return &Credentials{
        AccessKeyId: *id,
        AccessKeySecret: *secret,
        SecurityToken: *token,
    }
}

func NewStaticCredentialsProvider(credential credentials.Credential) CredentialsProvider {
    return CredentialsProvider{
        cred: credential,
    }
}

func main(){
    config := new(credentials.Config).
        // 指定Credential类型,固定值为ecs_ram_role。
        SetType("ecs_ram_role").
        // (可选项)指定角色名称。如果不指定,OSS会自动获取角色。强烈建议指定角色名称,以降低请求次数。
        SetRoleName("RoleName")

    ecsCredential, err := credentials.NewCredential(config)
    if err != nil {
        return
    }
    provider := NewStaticCredentialsProvider(ecsCredential)
    client, err := oss.New("oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    fmt.Printf("client:%#v\n", client)

}

使用STSAssumeRole新建Client

以下代码用于使用STSAssumeRole新建Client。

package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "github.com/aliyun/credentials-go/credentials"
    "os"
)
type Credentials struct {
    AccessKeyId     string
    AccessKeySecret string
    SecurityToken string
}

type defaultCredentialsProvider struct {
    cred credentials.Credential
}

func (credentials *Credentials) GetAccessKeyID() string {
    return credentials.AccessKeyId
}

func (credentials *Credentials) GetAccessKeySecret() string {
    return credentials.AccessKeySecret
}

func (credentials *Credentials) GetSecurityToken() string {
    return credentials.SecurityToken
}

func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials {
    id,_ := defBuild.cred.GetAccessKeyId()
    secret,_ := defBuild.cred.GetAccessKeySecret()
    token,_ := defBuild.cred.GetSecurityToken()

    return &Credentials{
        AccessKeyId: *id,
        AccessKeySecret: *secret,
        SecurityToken: *token,
    }
}

func NewCredentialsProvider(credential credentials.Credential) defaultCredentialsProvider {
    return defaultCredentialsProvider{
        cred: credential,
    }
}

func main(){
    config := new(credentials.Config).
        // 填写Credential类型,固定值为ram_role_arn。
        SetType("ram_role_arn").
        // 填写RAM用户的访问密钥(AccessKeyId和AccessKeySecret)。
        SetAccessKeyId("AccessKeyId").        
        SetAccessKeySecret("AccessKeySecret").
        // 填写角色的ARN信息,即需要扮演的角色ID。格式为acs:ram::$accountID:role/$roleName。
        SetRoleArn("acs:ram::15069***********:role/ram-oss-test").
        // 自定义角色会话名称,用于区分不同的令牌。
        SetRoleSessionName("Role_Session_Name").
        // (可选)限制STS Token权限。
        SetPolicy("").
        // (可选)限制STS Token的有效时间。
        SetRoleSessionExpiration(3600)


    arnCredential, err := credentials.NewCredential(config)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    provider := NewCredentialsProvider(arnCredential)
    client, err := oss.New("oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    fmt.Printf("client:%#v\n", client)

}

配置Client

您可以通过Client配置代理、连接超时、最大连接数等参数。

参数描述方法
MaxIdleConns最大闲置连接数。默认值为100。oss.MaxConns
MaxIdleConnsPerHost每个主机的最大闲置连接数。默认值为100。oss.MaxConns
MaxConnsPerHost每个主机的最大连接数。默认为空。oss.MaxConns
ConnectTimeoutHTTP超时时间,单位为秒。默认值为10秒,0表示不超时。oss.Timeout
ReadWriteTimeoutHTTP读取或写入超时时间,单位为秒。默认值为20秒,0表示不超时。oss.Timeout
IsCname是否支持将自定义域名作为Endpoint,默认不支持。 oss.UseCname
UserAgent设置HTTP的User-Agent头,默认值为aliyun-sdk-go。oss.UserAgent
ProxyHost是否开启代理服务器主机地址和端口。取值如下:
  • true:开启代理服务器主机地址和端口。
  • false(默认值):关闭代理服务器主机地址和端口。
oss.AuthProxy
ProxyUser代理服务器验证的用户名。oss.AuthProxy
ProxyPassword代理服务器验证的密码。oss.AuthProxy
RedirectEnabled设置是否开启HTTP重定向。取值如下:
  • true(默认值):开启HTTP重定向。
  • false:关闭HTTP重定向。
oss.RedirectEnabled
InsecureSkipVerify设置是否开启SSL证书校验。取值如下:
  • true(默认值):开启SSL证书校验。
  • false:关闭SSL证书校验。
oss.InsecureSkipVerify
IsEnableCRC是否开启CRC数据校验。取值如下:
  • true(默认值):开启CRC数据校验。
  • false:关闭CRC数据校验。
    重要 强烈建议不要关闭CRC数据校验功能。如果您关闭此功能,则阿里云不保证上传、下载过程数据的完整性。
oss.EnableCRC
LogLevel设置日志模式。取值如下:
  • oss.LogOff
  • oss.Debug
  • oss.Error
  • oss.Warn
  • oss.Info
oss.SetLogLevel

配置示例如下:

package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)

func main() {
    // 设置连接数为10,每个主机的最大闲置连接数为20,每个主机的最大连接数为20。
    conn := oss.MaxConns(10,20,20)
    // 设置HTTP连接超时时间为20秒,HTTP读取或写入超时时间为60秒。
    time := oss.Timeout(20,60)
    // 设置是否支持将自定义域名作为Endpoint,默认不支持。
    cname := oss.UseCname(true)
    // 设置HTTP的User-Agent头,默认为aliyun-sdk-go。
    userAgent := oss.UserAgent("aliyun-sdk-go")
    // 设置是否开启HTTP重定向,默认开启。
    redirect := oss.RedirectEnabled(true)
    // 设置是否开启SSL证书校验,默认关闭。
    verifySsl := oss.InsecureSkipVerify(false)
    // 设置代理服务器地址和端口。
    //proxy := oss.Proxy("yourProxyHost")
    // 设置代理服务器的主机地址和端口,代理服务器验证的用户名和密码。
    authProxy := oss.AuthProxy("yourProxyHost","yourProxyUserName","yourProxyPassword")
    // 开启CRC加密。
    crc := oss.EnableCRC(true)
    // 设置日志模式。
    logLevel := oss.SetLogLevel(oss.LogOff)  
   
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret",conn,time,cname,userAgent,authProxy,verifySsl,redirect,crc,logLevel)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    fmt.Printf("%#v\n", client)


}