全部產品
Search
文件中心

Object Storage Service:Go配置訪問憑證

更新時間:Mar 30, 2025

使用Go SDK V2發起OSS請求,您需要配置訪問憑證。阿里雲服務會通過訪問憑證驗證您的身份資訊和存取權限。您可以根據使用情境對認證和授權的要求,選擇不同類型的訪問憑證。本文介紹如何配置臨時訪問憑證和長期訪問憑證。

注意事項

  • 如果您希望擷取關於OSS支援的Region與Endpoint的對應關係,請參見OSS地區和訪問網域名稱

  • 如果您希望建立RAM使用者的AccessKey,請參見建立AccessKey

  • 請您使用OSS Go SDK V2的最新版本,確保本文中的程式碼範例可以正常運行。

憑證提供者選型

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)
}

常見問題

在使用通過STS服務擷取的臨時身份憑證去初始化憑證提供者時,誤使用RAM使用者的AK

當您使用通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token)初始化訪問憑證時,請勿混淆STS服務返回的AK與RAM使用者的AK,STS對應的AK是以STS開頭,樣本如下:

image

如何查看RAM使用者的AK?是否可以查看舊的AccessKey Secret?

  1. 如需查看RAM使用者的AK,請直接參考文檔查看RAM使用者的AccessKey資訊

  2. RAM使用者的AccessKey Secret僅在建立時顯示,之後無法查看,若您已經遺忘了的話無法找回。您可以直接存取RAM控制台選擇具體使用者,並建立新的AccessKey進行輪換。詳細請參見建立AccessKey

使用RAM使用者的AK進行上傳檔案時,報錯AccessDenied如何排查?

上傳檔案時出現AccessDenied的問題,通常是因為使用了錯誤的AK資訊或沒有給RAM使用者添加上傳檔案的許可權,您可以按照以下步驟檢查:

  1. 檢查您使用的RAM使用者的AK是否正確,請直接參考文檔查看RAM使用者的AccessKey資訊

  2. RAM使用者的AccessKey Secret僅在建立時顯示,之後無法查看,若您已經遺忘了的話無法找回。您可以直接存取RAM控制台選擇具體使用者,並建立新的AccessKey進行輪換。詳細請參見建立AccessKey

  3. 登入RAM控制台選擇具體使用者,給RAM使用者添加上傳檔案到OSS的許可權。

在使用外網Endpoint訪問OSS時,報錯無法串連該如何排查?

出現外網Endpoint無法串連的問題,通常是因為使用了錯誤的Endpoint地址或Bucket所在地區與請求的Endpoint不匹配。請您按照以下步驟檢查:

  1. 確認Bucket所在地區:登入阿里雲控制台,找到您的Bucket,確認其所在地區。

  2. 使用正確的Endpoint:根據Bucket所在地區,使用對應的外網Endpoint。例如,如果Bucket位於華東1(杭州),則應使用oss-cn-hangzhou.aliyuncs.com。各地區的Endpoint資訊請參見OSS地區和訪問網域名稱

  3. 檢查網路連接:確保您的網路環境可以正常訪問互連網,避免因網路問題導致串連失敗。

如果遇到報錯問題該如何查詢具體的錯誤類型?

關於錯誤類型的查詢,OSS文檔提供了EC錯誤碼供您參閱,例如關於認證方面的常見報錯問題,請參見02-AUTH