全部產品
Search
文件中心

Object Storage Service:OSS Go SDK V2

更新時間:Jul 18, 2025

Github | OSS Go SDK V2開發人員指南OSS SDK for Go API

快速接入

接入OSS Go SDK V2的流程如下:

環境準備

要求 Go 1.18 及以上版本。

可以通過 go -version 命令查看 Go 版本。如果當前環境沒有 Go 或版本低於 Go 1.18,請安裝Golang

安裝SDK

  • 建立專案目錄並初始化Go模組。

    mkdir oss-go-example && cd oss-go-example && go mod init oss-go-example
  • 執行以下命令擷取遠程程式碼封裝。請根據需求選擇合適的OSS Go SDK V2版本,推薦使用最新的版本,確保本文中的程式碼範例可以正常運行。

    go get github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss
  • 使用以下代碼引入OSS Go SDK V2包。

    import "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"

配置訪問憑證

使用 RAM 使用者的 AccessKey 配置訪問憑證。

  1. RAM 控制台,建立使用永久 AccessKey 訪問的 RAM 使用者,儲存 AccessKey,然後為該使用者授予 AliyunOSSFullAccess 許可權。

  2. 使用 RAM 使用者 AccessKey 配置環境變數。

    Linux

    1. 在命令列介面執行以下命令來將環境變數設定追加到~/.bashrc 檔案中。

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
      1. 執行以下命令使變更生效。

        source ~/.bashrc
      2. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. 在終端中執行以下命令,查看預設Shell類型。

      echo $SHELL
      1. 根據預設Shell類型進行操作。

        Zsh

        1. 執行以下命令來將環境變數設定追加到 ~/.zshrc 檔案中。

          echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
          echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
        2. 執行以下命令使變更生效。

          source ~/.zshrc
        3. 執行以下命令檢查環境變數是否生效。

          echo $OSS_ACCESS_KEY_ID
          echo $OSS_ACCESS_KEY_SECRET

        Bash

        1. 執行以下命令來將環境變數設定追加到 ~/.bash_profile 檔案中。

          echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
          echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
        2. 執行以下命令使變更生效。

          source ~/.bash_profile
        3. 執行以下命令檢查環境變數是否生效。

          echo $OSS_ACCESS_KEY_ID
          echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD

    1. 在CMD中運行以下命令。

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
      1. 運行以下命令,檢查環境變數是否生效。

        echo %OSS_ACCESS_KEY_ID%
        echo %OSS_ACCESS_KEY_SECRET%

    PowerShell

    1. 在PowerShell中運行以下命令。

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
      1. 運行以下命令,檢查環境變數是否生效。

        [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
        [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)

初始化用戶端

使用地區和訪問網域名稱初始化 OSSClient,並運行測試代碼。

package main

import (
	"context"
	"log"
	"strings"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

/*
Go SDK V2 用戶端初始化配置說明:

1. 簽名版本:Go SDK V2 預設使用 V4 簽名,提供更高的安全性
2. Region配置:初始化 Client 時,您需要指定阿里雲通用 Region ID 作為發起請求地區的標識
   本範例程式碼使用華東1(杭州)Region ID:cn-hangzhou
   如需查詢其它 Region ID 請參見:OSS地區和訪問網域名稱
3. Endpoint配置:
   - 可以通過 Endpoint 參數,自訂服務要求的訪問網域名稱
   - 當不指定時,SDK 預設根據 Region 資訊,構造公網訪問網域名稱
   - 例如當 Region 為 'cn-hangzhou' 時,構造出來的訪問網域名稱為:'https://oss-cn-hangzhou.aliyuncs.com'
4. 協議配置:
   - SDK 構造訪問網域名稱時預設採用 HTTPS 協議
   - 如需採用 HTTP 協議,請在指定網域名稱時指定為 HTTP,例如:'http://oss-cn-hangzhou.aliyuncs.com'
*/

func main() {
	// 方式一:只填寫Region(推薦)
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou") // 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou,SDK會根據Region自動構造HTTPS訪問網域名稱

	// 方式二:同時填寫Region和Endpoint
	// cfg := oss.LoadDefaultConfig().
	//     WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
	//     WithRegion("cn-hangzhou").                                // 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
	//     WithEndpoint("https://oss-cn-hangzhou.aliyuncs.com")     // 填寫Bucket所在地區對應的公網Endpoint。以華東1(杭州)為例,Endpoint填寫為'https://oss-cn-hangzhou.aliyuncs.com'

	// 建立OSS用戶端
	client := oss.NewClient(cfg)

	// 定義要上傳的字串內容
	body := strings.NewReader("hi oss")

	// 建立上傳對象的請求
	request := &oss.PutObjectRequest{
		Bucket: oss.Ptr("Your Bucket Name"),      // 儲存空間名稱
		Key:    oss.Ptr("Your Object Key"),       // 對象名稱
		Body:   body,                             // 要上傳的字串內容
	}

	// 發送上傳對象的請求
	result, err := client.PutObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to put object %v", err)
	}

	// 列印上傳對象的結果
	log.Printf("Status: %#v\n", result.Status)
	log.Printf("RequestId: %#v\n", result.ResultCommon.Headers.Get("X-Oss-Request-Id"))
	log.Printf("ETag: %#v\n", *result.ETag)
}

運行後將會輸出上傳檔案成功的結果:

Status: "200 OK"
RequestId: "68746C5FE001B434303B90B6"
ETag: "B22E0DC370A7F7067FACF5F75D7FA385"

用戶端配置

用戶端支援哪些配置?

Region

(必選)請求發送的地區, 必選

WithRegion("cn-hangzhou")

CredentialsProvider

(必選)設定訪問憑證

WithCredentialsProvider(provider)

Endpoint

訪問網域名稱

WithEndpoint("oss-cn-hanghzou.aliyuncs.com")

HttpClient

HTTP用戶端

WithHttpClient(customClient)

RetryMaxAttempts

HTTP請求時的最大嘗試次數, 預設值為 3

WithRetryMaxAttempts(5)

Retryer

HTTP請求時的重試實現

WithRetryer(customRetryer)

ConnectTimeout

建立串連的逾時時間, 預設值為 5 秒

WithConnectTimeout(10 * time.Second)

ReadWriteTimeout

應用讀寫資料的逾時時間, 預設值為 10 秒

WithReadWriteTimeout(30 * time.Second)

InsecureSkipVerify

是否跳過SSL認證校正,預設檢查SSL認證

WithInsecureSkipVerify(true)

EnabledRedirect

是否開啟HTTP重新導向, 預設不開啟

WithEnabledRedirect(true)

ProxyHost

設定Proxy 伺服器

WithProxyHost("http://user:passswd@proxy.example-***.com")

ProxyFromEnvironment

通過環境變數設定Proxy 伺服器

WithProxyFromEnvironment(true)

UploadBandwidthlimit

整體的上傳頻寬節流設定,單位為 KiB/s

WithUploadBandwidthlimit(10*1024)

DownloadBandwidthlimit

整體的下載頻寬節流設定,單位為 KiB/s

WithDownloadBandwidthlimit(10*1024)

SignatureVersion

簽名版本,預設值為v4

WithSignatureVersion(oss.SignatureVersionV1)

LogLevel

設定記錄層級

WithLogLevel(oss.LogInfo)

LogPrinter

設定日誌列印介面

WithLogPrinter(customPrinter)

DisableSSL

不使用https請求,預設使用https

WithDisableSSL(true)

UsePathStyle

使用路徑請求風格,即次層網域請求風格,預設為bucket託管網域名稱

WithUsePathStyle(true)

UseCName

是否使用自訂網域名訪問,預設不使用

WithUseCName(true)

UseDualStackEndpoint

是否使用雙棧網域名稱訪問,預設不使用

WithUseDualStackEndpoint(true)

UseAccelerateEndpoint

是否使用傳輸加速網域名稱訪問,預設不使用

WithUseAccelerateEndpoint(true)

UseInternalEndpoint

是否使用內網網域名稱訪問,預設不使用

WithUseInternalEndpoint(true)

DisableUploadCRC64Check

上傳時關閉CRC64校正,預設開啟CRC64校正

WithDisableUploadCRC64Check(true)

DisableDownloadCRC64Check

下載時關閉CRC64校正,預設開啟CRC64校正

WithDisableDownloadCRC64Check(true)

AdditionalHeaders

指定額外的簽章要求頭,V4簽名下有效

WithAdditionalHeaders([]string{"content-length"})

UserAgent

指定額外的User-Agent資訊

WithUserAgent("user identifier")

使用自訂網域名

使用OSS預設網域名稱訪問時,可能會出現檔案禁止訪問、檔案無法預覽等問題;通過綁定自訂網域名至Bucket預設網域名稱,不僅支援瀏覽器直接預覽檔案,還可結合CDN加速分發。

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	// 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
	// 請填寫您的自訂網域名,例如https://www.example-***.com
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou").
		WithEndpoint("https://www.example-***.com").
		WithUseCName(true) // 請注意,設定true開啟CNAME選項,否則無法使用自訂網域名

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client執行後續操作...
}

逾時控制

package main

import (
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou").             // 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
		WithConnectTimeout(10 * time.Second).  // 設定連線逾時時間,預設值為5秒
		WithReadWriteTimeout(30 * time.Second) // 設定讀寫逾時時間,預設值為10秒

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client執行後續操作...
}

最大錯誤重試次數

請求異常時,OSSClient 預設重試 3 次。

高並發或網路不穩定時,使用 WithRetryMaxAttempts 增加重試次數。這能提升請求成功率。

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou"). // 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
		WithRetryMaxAttempts(5)    // 設定最大重試次數,預設值為3

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client執行後續操作...
}

HTTP/HTTPS 協議

使用 WithDisableSSL(true) 設定不使用HTTPS協議。

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou"). // 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
		WithDisableSSL(true)       // 設定不使用HTTPS協議。預設使用HTTPS

	// 建立OSS用戶端
	client := oss.NewClient(cfg)

	// 使用client執行後續操作...
}

Proxy 伺服器

企業安全性原則通常限制直接存取公網。使用 WithProxyHost 配置Proxy 伺服器訪問 OSS。

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou").                                 // 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
		WithUserAgent("aliyun-sdk-go").                            // 設定使用者代理程式,指HTTP的User-Agent頭
		WithProxyHost("http://user:passswd@proxy.example-***.com") // 設定Proxy 伺服器IP,如"http://user:passswd@proxy.example-***.com")

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client執行後續操作...
}

使用內網網域名稱

當您的應用部署在阿里雲的ECS執行個體上,並且需要頻繁訪問同地區的OSS資源時,使用內網網域名稱可以降低流量成本並提高訪問速度。

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() 
	// 方式一:填寫Region並設定WithUseInternalEndpoint為true
	// 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou").
		WithUseInternalEndpoint(true)

	// 方式二:直接填寫Region和Endpoint
	// 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
	// 填寫Bucket所在地區對應的內網Endpoint,以華東1(杭州)為例,Endpoint填寫為'https://oss-cn-hangzhou-internal.aliyuncs.com'。如需指定為http協議,請在指定網域名稱時填寫為'http://oss-cn-hangzhou-internal.aliyuncs.com'
	// cfg := oss.LoadDefaultConfig().
	// 	WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
	// 	WithRegion("cn-hangzhou").
	// 	WithEndpoint("https://oss-cn-hangzhou-internal.aliyuncs.com")

	// 建立OSS用戶端
	client := oss.NewClient(cfg)

	// 使用client執行後續操作...

}

使用傳輸加速網域名稱

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	// 方式一:填寫Region並設定WithUseAccelerateEndpoint為true
	// 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou").
		WithUseAccelerateEndpoint(true)

	// 方式二:直接填寫Region和Endpoint
	// 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
	// 填寫Bucket所在地區對應的傳輸加速Endpoint,以華東1(杭州)為例,Endpoint填寫為'https://oss-accelerate.aliyuncs.com'。如需指定為http協議,請在指定網域名稱時填寫為'http://oss-accelerate.aliyuncs.com'
	// cfg := oss.LoadDefaultConfig().
	// 	WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
	// 	WithRegion("cn-hangzhou").
	// 	WithEndpoint("https://oss-accelerate.aliyuncs.com").

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client執行後續操作...
}

使用專有域

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	// 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
	// 請填寫您的專有域,例如:https://service.corp.example.com
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou").
		WithEndpoint("https://service.corp.example.com")

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client執行後續操作...
}

使用金融雲網域名稱

以下是使用金融雲網域名稱配置OSSClient的範例程式碼。

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	// 填寫Region和Endpoint
        // 填寫Bucket所在地區。以華東1 金融云為例,Region填寫為cn-hangzhou-finance
	// 填寫Bucket所在地區對應的內網Endpoint。以華東1 金融云為例,Endpoint填寫為'https://oss-cn-hzjbp-a-internal.aliyuncs.com',
        // 如需指定為http協議,請在指定網域名稱時填寫為'http://oss-cn-hzjbp-a-internal.aliyuncs.com'
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou-finance").
		WithEndpoint("https://oss-cn-hzjbp-a-internal.aliyuncs.com")

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client執行後續操作...
}

使用政務雲網域名稱

以下是使用政務雲網域名稱配置OSSClient的範例程式碼。

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	// 填寫Region和Endpoint
        // 填寫Bucket所在地區。以華北2 阿里政務雲1為例,Region填寫為cn-north-2-gov-1
	// 填寫Bucket所在地區對應的內網Endpoint。以華北2 阿里政務雲1為例,Endpoint填寫為'https://oss-cn-north-2-gov-1-internal.aliyuncs.com',
        // 如需指定為http協議,請在指定網域名稱時填寫為'http://oss-cn-north-2-gov-1-internal.aliyuncs.com'
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-north-2-gov-1").
		WithEndpoint("https://oss-cn-north-2-gov-1-internal.aliyuncs.com")

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client執行後續操作...
}

訪問雲盒Bucket

package main

import (
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	// 方式一:自動檢測雲盒ID
	// 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
	// 填寫Endpoint為雲盒bucket的資料網域名稱,例如:http://cb-xxxxxx.cn-hangzhou.oss-cloudbox.aliyuncs.com
	// 設定WithEnableAutoDetectCloudBoxId為true,自動檢測雲盒ID
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithEndpoint("http://cb-xxxxxx.cn-hangzhou.oss-cloudbox.aliyuncs.com").
		WithEnableAutoDetectCloudBoxId(true)

	// 方式二:手動設定雲盒ID
	// 填寫Bucket所在地區,以華東1(杭州)為例,Region填寫為cn-hangzhou
	// 填寫Endpoint為雲盒bucket的資料網域名稱,例如:http://cb-xxxxxx.cn-hangzhou.oss-cloudbox.aliyuncs.com
	// 手動填寫雲盒ID,例如:cb-xxxxxx
	// cfg := oss.LoadDefaultConfig().
	// 	WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
	// 	WithEndpoint("http://cb-xxxxxx.cn-hangzhou.oss-cloudbox.aliyuncs.com").
	// 	WithCloudBoxId("cb-xxxxxx")

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client執行後續操作...
}

自訂HTTPClient

當常用配置參數無法滿足情境需求時,使用WithHTTPClient替換預設的HTTP用戶端。

package main

import (
	"crypto/tls"
	"net/http"
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/transport"
)

func main() {
	// 常用逾時或其它設定
	transConfig := transport.Config{
		// 連線逾時, 預設值 5秒
		ConnectTimeout: oss.Ptr(10 * time.Second),
		// 應用讀寫資料的逾時時間, 預設值 10秒
		ReadWriteTimeout: oss.Ptr(20 * time.Second),
		// 串連空閑逾時時間, 預設值 50 秒
		IdleConnectionTimeout: oss.Ptr(40 * time.Second),
		// 網路連接的保持期限, 預設值 30 秒
		KeepAliveTimeout: oss.Ptr(40 * time.Second),
		// 是否開啟啟HTTP重新導向,預設不啟用
		EnabledRedirect: oss.Ptr(true),
	}

	// http.Transport 設定
	var transports []func(*http.Transport)
	// 最大串連數,預設值 100
	transports = append(transports, transport.MaxConnections(200))
	// 如果請求有“Expect: 100-Continue”標題,則此設定表示完全寫入請求標題後等待伺服器第一個響應標題的最長時間,預設 1秒
	transports = append(transports, transport.ExpectContinueTimeout(2*time.Second))
	// TLS的最低版本,預設值 TLS 1.2
	transports = append(transports, transport.TLSMinVersion(tls.VersionTLS13))
	// 是否跳過認證檢查,預設不跳過
	transports = append(transports, transport.InsecureSkipVerify(true))
	// 更多Transport參數設定,請參考 https://pkg.go.dev/net/http#Transport
	// 建立自訂HTTP Client
	customClient := transport.NewHttpClient(&transConfig, transports...)

	cfg := oss.LoadDefaultConfig().
		WithHttpClient(customClient).
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou")

	// 建立OSS用戶端
	client := oss.NewClient(cfg)
	// 使用client進行後續操作...
}

訪問憑證配置

OSS 提供多種憑證初始化方式。請根據您的認證和授權需求選擇合適的初始化方式。

如何選擇訪問憑證?

憑證提供者初始化方式

適用情境

是否需要提供前置的AK或STS Token

底層實現基於的憑證

憑證有效期間

憑證輪轉或重新整理方式

使用RAM使用者的AK

部署運行在安全、穩定且不易受外部攻擊的環境的應用程式,無需頻繁輪轉憑證就可以長期訪問雲端服務

AK

長期

手動輪轉

使用STS臨時訪問憑證

部署運行在不可信的環境的應用程式,希望能控制訪問的有效期間、許可權

STS Token

臨時

手動重新整理

使用RAMRoleARN

需要授權訪問雲端服務,例如跨阿里雲帳號訪問雲端服務的應用程式

STS Token

臨時

自動重新整理

使用ECSRAMRole

部署運行在阿里雲的ECS執行個體、ECI執行個體、Container ServiceKubernetes版的Worker節點中的應用程式

STS Token

臨時

自動重新整理

使用OIDCRoleARN

部署運行在阿里雲的Container ServiceKubernetes版的Worker節點中的不可信應用程式

STS Token

臨時

自動重新整理

自訂憑證提供者

如果以上憑證配置方式都不滿足要求時,您可以自訂擷取憑證的方式

自訂

自訂

自訂

自訂

使用預設憑據鏈

當您初始化憑據用戶端,且不傳入任何參數時,將會嘗試按照預設憑據鏈順序尋找相關憑據資訊

自訂

自訂

自訂

自訂

使用RAM使用者的AK

如果您的應用程式部署運行在安全、穩定且不易受外部攻擊的環境中,需要長期訪問您的OSS,且不能頻繁輪轉憑證時,您可以使用阿里雲主帳號或RAM使用者的AK(Access Key ID、Access Key Secret)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個AK,存在安全性風險和維護複雜度增加的風險。

警告
  • 阿里雲帳號擁有資源的全部許可權,AK一旦泄露,會給系統帶來巨大風險,不建議使用。推薦使用最小化授權的RAM使用者的AK。

  • 如需建立RAM使用者的AK,請直接存取建立AccessKey。RAM使用者的Access Key ID、Access Key Secret資訊僅在建立時顯示,請及時儲存,如若遺忘請考慮建立新的AK進行輪換。

環境變數

  1. 使用RAM使用者AccessKey配置環境變數。

    Linux

    1. 在命令列介面執行以下命令來將環境變數設定追加到~/.bashrc 檔案中。

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
      1. 執行以下命令使變更生效。

        source ~/.bashrc
      2. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. 在終端中執行以下命令,查看預設Shell類型。

      echo $SHELL
      1. 根據預設Shell類型進行操作。

        Zsh

        1. 執行以下命令來將環境變數設定追加到 ~/.zshrc 檔案中。

          echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
          echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
        2. 執行以下命令使變更生效。

          source ~/.zshrc
        3. 執行以下命令檢查環境變數是否生效。

          echo $OSS_ACCESS_KEY_ID
          echo $OSS_ACCESS_KEY_SECRET

        Bash

        1. 執行以下命令來將環境變數設定追加到 ~/.bash_profile 檔案中。

          echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
          echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
        2. 執行以下命令使變更生效。

          source ~/.bash_profile
        3. 執行以下命令檢查環境變數是否生效。

          echo $OSS_ACCESS_KEY_ID
          echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD

    1. 在CMD中運行以下命令。

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
      1. 運行以下命令,檢查環境變數是否生效。

        echo %OSS_ACCESS_KEY_ID%
        echo %OSS_ACCESS_KEY_SECRET%

    PowerShell

    1. 在PowerShell中運行以下命令。

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
      1. 運行以下命令,檢查環境變數是否生效。

        [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
        [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. 參考上述方式修改系統內容變數後,請重啟或重新整理您的編譯運行環境,包括IDE、命令列介面、其他傳統型應用程式及後台服務,以確保最新的系統內容變數成功載入。

  3. 使用環境變數來傳遞憑證資訊。

    package main
    
    import (
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    func main() {
    	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
    	region := "cn-hangzhou"
    
    	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET
    	provider := credentials.NewEnvironmentVariableCredentialsProvider()
    
    	// 載入預設配置並設定憑證提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 建立OSS用戶端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

靜態憑證

以下範例程式碼展示了如何對訪問憑據直接進行寫入程式碼,顯式設定要使用的存取金鑰。

警告

請勿將訪問憑據嵌入到生產環境的應用程式中,此方法僅用於測試目的。

package main

import (
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
	region := "cn-hangzhou"

	// 填寫RAM使用者的Access Key ID和Access Key Secret
	accessKeyID := "yourAccessKeyID"
	accessKeySecret := "yourAccessKeySecret"

	// 使用NewStaticCredentialsProvider方法直接設定AK和SK
	provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret)

	// 載入預設配置並設定憑證提供者和地區
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(provider).
		WithRegion(region)

	// 建立OSS用戶端
	client := oss.NewClient(cfg)

	log.Printf("ossclient: %v", client)
}

使用STS臨時訪問憑證

如果您的應用程式需要臨時訪問OSS,您可以使用通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個STS Token,存在安全性風險和維護複雜度增加的風險。此外,如果您需要多次臨時訪問OSS,您需要手動重新整理STS Token。

重要

環境變數

  1. 使用臨時身份憑證設定環境變數。

    Mac OS X/Linux/Unix

    警告
    • 請注意,此處使用的是通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token),而非RAM使用者的Access Key和Access Key Secret。

    • 請注意區分STS服務擷取的Access Key ID以STS開頭,例如“STS.****************”。

    export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>

    Windows

    警告
    • 請注意,此處使用的是通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token),而非RAM使用者的AK(Access Key ID、Access Key Secret)。

    • 請注意區分STS服務擷取的Access Key ID以STS開頭,例如“STS.****************”。

    set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
  2. 通過環境變數來傳遞憑證資訊。

    package main
    
    import (
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    func main() {
    	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
    	region := "cn-hangzhou"
    
    	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET,OSS_SESSION_TOKEN
    	provider := credentials.NewEnvironmentVariableCredentialsProvider()
    
    	// 載入預設配置並設定憑證提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 建立OSS用戶端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

靜態憑證

您可以在應用程式中對憑據直接進行寫入程式碼,顯式設定要使用的臨時存取金鑰。

警告

請勿將訪問憑據嵌入到生產環境的應用程式中,此方法僅用於測試目的。

package main

import (
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
	region := "cn-hangzhou"

	// 請設定為您通過STS服務擷取的臨時身份憑證Access Key ID、Access Key Secret和Security Token,而非RAM使用者的身份憑證資訊
        // 請注意區分STS服務擷取的Access Key ID是以STS開頭,如下所示
	accessKeyID := "STS.****************"
	accessKeySecret := "yourAccessKeySecret"
	// 填寫擷取的STS安全性權杖(SecurityToken)
	stsToken := "yourSecurityToken"

	// 使用NewStaticCredentialsProvider方法直接設定AK、SK和STS Token
	provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret, stsToken)

	// 載入預設配置並設定憑證提供者和地區
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(provider).
		WithRegion(region)

	// 建立OSS用戶端
	client := oss.NewClient(cfg)

	log.Printf("ossclient: %v", client)
}

使用RAMRoleARN

如果您的應用程式需要授權訪問OSS,例如跨阿里雲帳號訪問OSS,您可以使用RAMRoleARN初始化憑證提供者。該方式底層實現是STS Token。通過指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具會前往STS服務擷取STS Token,並在會話到期前調用AssumeRole介面申請新的STS Token。此外,您還可以通過為policy賦值來限制RAM角色到一個更小的許可權集合。

重要
  • 阿里雲帳號擁有資源的全部許可權,AK一旦泄露,會給系統帶來巨大風險,不建議使用。推薦使用最小化授權的RAM使用者的AK。

  • 如需建立RAM使用者的AK,請直接存取建立AccessKey。RAM使用者的Access Key ID、Access Key Secret資訊僅在建立時顯示,請及時儲存,如若遺忘請考慮建立新的AK進行輪換。

  • 如需擷取RAMRoleARN,請直接存取CreateRole - 建立角色

  1. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  2. 配置訪問憑證。

    package main
    
    import (
    	"context"
    	"log"
    	"os"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	openapicred "github.com/aliyun/credentials-go/credentials"
    )
    
    func main() {
    	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
    	region := "cn-hangzhou"
    
    	config := new(openapicred.Config).
    		// 填寫Credential類型,固定值為ram_role_arn
    		SetType("ram_role_arn").
    		// 從環境變數中擷取RAM使用者的存取金鑰(AccessKeyId和AccessKeySecret)
    		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
    		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
    		// 以下操作預設直接填入參數數值,您也可以通過添加環境變數,並使用os.Getenv("<變數名稱>")的方式來set對應參數
    		// 從環境變數中擷取RAM角色的ARN資訊,即需要扮演的角色ID,格式為acs:ram::$accountID:role/$roleName
    		SetRoleArn("ALIBABA_CLOUD_ROLE_ARN"). // RoleArn預設環境變數正式名稱ALIBABA_CLOUD_ROLE_ARN
    		// 自訂角色會話名稱,用於區分不同的令牌
    		SetRoleSessionName("ALIBABA_CLOUD_ROLE_SESSION_NAME"). // RoleSessionName預設環境變數正式名稱ALIBABA_CLOUD_ROLE_SESSION_NAME
    		//(可選)限制STS Token許可權
    		SetPolicy("Policy").
    		//(可選)限制STS Token的有效時間
    		SetRoleSessionExpiration(3600)
    
    	arnCredential, gerr := openapicred.NewCredential(config)
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		if gerr != nil {
    			return credentials.Credentials{}, gerr
    		}
    		cred, err := arnCredential.GetCredential()
    		if err != nil {
    			return credentials.Credentials{}, err
    		}
    		return credentials.Credentials{
    			AccessKeyID:     *cred.AccessKeyId,
    			AccessKeySecret: *cred.AccessKeySecret,
    			SecurityToken:   *cred.SecurityToken,
    		}, nil
    	})
    
    	// 載入預設配置並設定憑證提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 建立OSS用戶端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

使用ECSRAMRole

如果您的應用程式運行在ECS執行個體、ECI執行個體、Container ServiceKubernetes版的Worker節點中,建議您使用ECSRAMRole初始化憑證提供者。該方式底層實現是STS Token。ECSRAMRole允許您將一個角色關聯到ECS執行個體、ECI執行個體或Container Service Kubernetes 版的Worker節點,實現在執行個體內部自動重新整理STS Token。該方式無需您提供一個AK或STS Token,消除了手動維護AK或STS Token的風險。如何擷取ECSRAMRole,請參見CreateRole - 建立角色

  1. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  2. 配置訪問憑證。

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	openapicred "github.com/aliyun/credentials-go/credentials"
    )
    
    func main() {
    	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
    	region := "cn-hangzhou"
    
    	config := new(openapicred.Config).
    		// 指定Credential類型,固定值為ecs_ram_role
    		SetType("ecs_ram_role").
    		// (可選項)指定角色名稱。如果不指定,OSS會自動擷取角色。強烈建議指定角色名稱,以降低請求次數
    		SetRoleName("RoleName")
    
    	arnCredential, gerr := openapicred.NewCredential(config)
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		if gerr != nil {
    			return credentials.Credentials{}, gerr
    		}
    		cred, err := arnCredential.GetCredential()
    		if err != nil {
    			return credentials.Credentials{}, err
    		}
    		return credentials.Credentials{
    			AccessKeyID:     *cred.AccessKeyId,
    			AccessKeySecret: *cred.AccessKeySecret,
    			SecurityToken:   *cred.SecurityToken,
    		}, nil
    	})
    
    	// 載入預設配置並設定憑證提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 建立OSS用戶端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

使用OIDCRoleARN

Container ServiceKubernetes版中設定了Worker節點RAM角色後,對應節點內的Pod中的應用也就可以像ECS上部署的應用一樣,通過中繼資料服務(Meta Data Server)擷取關聯角色的STS Token。但如果容器叢集上部署的是不可信的應用(比如部署您的客戶提交的應用,代碼也沒有對您開放),您可能並不希望它們能通過中繼資料服務擷取Worker節點關聯執行個體RAM角色的STS Token。為了避免影響雲上資源的安全,同時又能讓這些不可信的應用安全地擷取所需的STS Token,實現應用層級的許可權最小化,您可以使用RRSA(RAM Roles for Service Account)功能。該方式底層實現是STS Token。阿里雲容器叢集會為不同的應用Pod建立和掛載相應的服務賬戶OIDC Token檔案,並將相關配置資訊注入到環境變數中,Credentials工具通過擷取環境變數的配置資訊,調用STS服務的AssumeRoleWithOIDC介面換取綁定角色的STS Token。該方式無需您提供一個AK或STS Token,消除了手動維護AK或STS Token的風險。詳情請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離

  1. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  2. 配置訪問憑證。

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    	openapicred "github.com/aliyun/credentials-go/credentials"
    )
    
    func main() {
    	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
    	region := "cn-hangzhou"
    
    	config := new(openapicred.Config).
    		// 指定Credential類型,固定值為oidc_role_arn
    		SetType("oidc_role_arn").
    		// 指定 OIDC 提供者的 ARN(Amazon Resource Name),格式為 acs:ram::account-id:oidc-provider/provider-name
    		SetOIDCProviderArn("OIDCProviderArn").
    		// 指定 OIDC 令牌的檔案路徑,用於儲存 OIDC 令牌
    		SetOIDCTokenFilePath("OIDCTokenFilePath").
    		// 自訂角色會話名稱,用於區分不同的令牌
    		SetRoleSessionName("RoleSessionName"). // RoleSessionName預設環境變數正式名稱ALIBABA_CLOUD_ROLE_SESSION_NAME
    		// (可選)指定訪問角色時要使用的策略
    		SetPolicy("Policy").
    		// 填寫角色的ARN資訊,即需要扮演的角色ID。格式為acs:ram::113511544585****:oidc-provider/TestOidcProvider
    		SetRoleArn("RoleArn").
    		// 設定會話有效期間
    		SetSessionExpiration(3600)
    
    	arnCredential, gerr := openapicred.NewCredential(config)
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		if gerr != nil {
    			return credentials.Credentials{}, gerr
    		}
    		cred, err := arnCredential.GetCredential()
    		if err != nil {
    			return credentials.Credentials{}, err
    		}
    		return credentials.Credentials{
    			AccessKeyID:     *cred.AccessKeyId,
    			AccessKeySecret: *cred.AccessKeySecret,
    			SecurityToken:   *cred.SecurityToken,
    		}, nil
    	})
    
    	// 載入預設配置並設定憑證提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 建立OSS用戶端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

自訂憑證提供者

當以上憑證配置方式不滿足要求時,您可以自訂擷取憑證的方式。SDK 支援多種實現方式。

  1. 通過credentials.CredentialsProviderFunc介面

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    func main() {
    	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
    	region := "cn-hangzhou"
    
    	// 建立自訂憑證提供者
    	provider := credentials.CredentialsProviderFunc(func(ctx context.Context) (credentials.Credentials, error) {
    		// 返回長期憑證
    		return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret"}, nil
    		// 返回臨時憑證
    		//return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret",    SecurityToken: "token"}, nil
    	})
    
    	// 載入預設配置並設定憑證提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 建立OSS用戶端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    
  2. 實現credentials.CredentialsProvider介面

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    type CustomerCredentialsProvider struct {
    	// TODO
    }
    
    func NewCustomerCredentialsProvider() CustomerCredentialsProvider {
    	return CustomerCredentialsProvider{}
    }
    
    func (s CustomerCredentialsProvider) GetCredentials(_ context.Context) (credentials.Credentials, error) {
    	// 返回長期憑證
    	return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret"}, nil
    	// 返回臨時憑證
    	//return credentials.Credentials{AccessKeyID: "id", AccessKeySecret: "secret",    SecurityToken: "token"}, nil
    }
    
    func main() {
    	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
    	region := "cn-hangzhou"
    
    	// 建立自訂憑證提供者
    	provider := NewCustomerCredentialsProvider()
    
    	// 載入預設配置並設定憑證提供者和region
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(provider).
    		WithRegion(region)
    
    	// 建立OSS用戶端
    	client := oss.NewClient(cfg)
    	log.Printf("ossclient: %v", client)
    }
    

使用預設憑據鏈

當您在初始化憑據用戶端不傳入任何參數時,Credentials會使用預設憑據鏈方式初始化用戶端。預設憑據的讀取邏輯請參見預設憑據鏈

package main

import (
	"context"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	osscred "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	// 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou
	region := "cn-hangzhou"
	// 傳nil,則會走預設憑證鏈模式,會自動擷取憑證
	arnCredential, gerr := credentials.NewCredential(nil)
	provider := osscred.CredentialsProviderFunc(func(ctx context.Context) (osscred.Credentials, error) {
		if gerr != nil {
			return osscred.Credentials{}, gerr
		}
		cred, err := arnCredential.GetCredential()
		if err != nil {
			return osscred.Credentials{}, err
		}

		return osscred.Credentials{
			AccessKeyID:     *cred.AccessKeyId,
			AccessKeySecret: *cred.AccessKeySecret,
			SecurityToken:   *cred.SecurityToken,
		}, nil
	})

	// 載入預設配置並設定憑證提供者和region
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(provider).
		WithRegion(region)

	// 建立ossClient
	client := oss.NewClient(cfg)
	log.Printf("ossclient: %v", client)
}

錯誤排查

使用Go SDK V2訪問OSS出現錯誤時,OSS會返回HTTP Code、Message、RequestId、EC錯誤碼等資訊,其中EC碼對應一個具體的錯誤原因,可以使用EC碼自助進行錯誤排查。

  1. 例如,當您使用以下代碼下載一個並不存在的檔案時。

    package main
    
    import (
    	"context"
    	"flag"
    	"io"
    	"log"
    	"os"
    
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
    	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
    )
    
    // 定義全域變數
    var (
    	region     string // 儲存地區
    	bucketName string // 儲存空間名稱
    	objectName string // 對象名稱
    )
    
    // init函數用於初始化命令列參數
    func init() {
    	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
    	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
    	flag.StringVar(&objectName, "object", "", "The name of the object.")
    }
    
    func main() {
    	// 解析命令列參數
    	flag.Parse()
    
    	// 檢查bucket名稱是否為空白
    	if len(bucketName) == 0 {
    		flag.PrintDefaults()
    		log.Fatalf("invalid parameters, bucket name required")
    	}
    
    	// 檢查region是否為空白
    	if len(region) == 0 {
    		flag.PrintDefaults()
    		log.Fatalf("invalid parameters, region required")
    	}
    
    	// 檢查object名稱是否為空白
    	if len(objectName) == 0 {
    		flag.PrintDefaults()
    		log.Fatalf("invalid parameters, object name required")
    	}
    
    	// 定義輸出檔案路徑
    	outputFile := "downloaded.txt" // 替換為你希望儲存的檔案路徑
    
    	// 載入預設配置並設定憑證提供者和地區
    	cfg := oss.LoadDefaultConfig().
    		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
    		WithRegion(region)
    
    	// 建立OSS用戶端
    	client := oss.NewClient(cfg)
    
    	// 建立擷取對象的請求
    	request := &oss.GetObjectRequest{
    		Bucket: oss.Ptr(bucketName), // 儲存空間名稱
    		Key:    oss.Ptr(objectName), // 對象名稱
    	}
    
    	// 執行擷取對象的操作並處理結果
    	result, err := client.GetObject(context.TODO(), request)
    	if err != nil {
    		log.Fatalf("failed to get object %v", err)
    	}
    	defer result.Body.Close() // 確保在函數結束時關閉響應體
    
    	// 一次性讀取整個檔案內容
    	data, err := io.ReadAll(result.Body)
    	if err != nil {
    		log.Fatalf("failed to read object %v", err)
    	}
    
    	// 將內容寫入到檔案
    	err = os.WriteFile(outputFile, data, 0644)
    	if err != nil {
    		log.Fatalf("failed to write to output file %v", err)
    	}
    
    	log.Printf("file downloaded successfully to %s", outputFile)
    }
    
  2. 返回樣本如下,返回結果中包含'EC': '0026-00000001',作為該錯誤原因的唯一標識。

  3. 通過以上錯誤請求樣本返回的EC錯誤碼尋找問題原因及對應解決方案的操作步驟如下。

    1. 開啟OpenAPI問題自助診斷平台

    2. 在搜尋方塊中,輸入EC錯誤碼,例如0026-00000001。

    3. 在搜尋結果中尋找問題原因及對應解決方案。

範例程式碼

OSS Go SDK V2提供豐富的範例程式碼供參考或直接使用。

樣本內容

GitHub樣本檔案

建立儲存空間

put_bucket.go

列舉儲存空間

list_buckets.go

判斷儲存空間是否存在

is_bucket_exist.go

擷取儲存空間的地區

get_bucket_location.go

擷取儲存空間的資訊

get_bucket_info.go

擷取儲存空間的儲存容量

get_bucket_stat.go

資源群組

刪除儲存空間

delete_bucket.go

儲存空間標籤

要求者付費模式

簡單上傳(Go SDK V2)

put_object.go

追加上傳

分區上傳

表單上傳

post_object.go

使用預簽名URL上傳

presign.go

檔案上傳管理器

-

簡單下載

類檔案唯讀

open_file.go

使用預簽名URL下載

presign.go

檔案下載管理員

-

拷貝對象

copy_object.go

分區拷貝

upload_part_copy.go

檔案拷貝管理器

-

判斷檔案是否存在

is_object_exist.go

列舉檔案

list_objects_v2.go

刪除檔案

查詢檔案

select_object.go

解凍檔案

restore_object.go

管理檔案中繼資料

轉換檔儲存類型

copy_object.go

重新命名檔案

copy_object.go

管理軟連結

管理儲存空間讀寫權限

管理檔案存取權限

Bucket Policy

管理版本控制

防盜鏈

跨域資源共用

合規保留原則

服務端加密

用戶端加密

encryption_client.go

資料複製

put_bucket_replication.go

訪問跟蹤

put_bucket_access_monitor.go

生命週期管理

儲存空間清單

靜態網站託管(鏡像回源)

put_bucket_website.go

日誌轉存

歸檔直讀

標量檢索

向量檢索

綁定自訂網域名

傳輸加速

同步處理

process_object.go

非同步處理

async_process_object.go

OSS全域阻止公用訪問

put_public_access_block.go

Bucket層級阻止公用訪問

put_bucket_public_access_block.go

存取點層級阻止公用訪問

put_access_point_public_access_block.go

資源集區QoS管理

-