使用Go SDK發起OSS請求,您需要配置訪問憑證。阿里雲服務會通過訪問憑證驗證您的身份資訊和存取權限。您可以根據使用情境對認證和授權的要求,選擇不同類型的訪問憑證。本文介紹如何配置臨時訪問憑證和長期訪問憑證。
初始化憑證提供者
憑證提供者選型
OSS支援多種方式初始化憑證提供者,您可以根據使用情境對認證和授權的要求,選擇對應的方式初始化憑證提供者。
憑證提供者初始化方式 | 適用情境 | 是否需要提供前置的AK或STS Token | 底層實現基於的憑證 | 憑證有效期間 | 憑證輪轉或重新整理方式 |
部署運行在安全、穩定且不易受外部攻擊的環境的應用程式,無需頻繁輪轉憑證就可以長期訪問雲端服務 | 是 | AK | 長期 | 手動輪轉 | |
部署運行在不可信的環境的應用程式,希望能控制訪問的有效期間、許可權 | 是 | STS Token | 臨時 | 手動重新整理 | |
需要授權訪問雲端服務,例如跨阿里雲帳號訪問雲端服務的應用程式 | 是 | STS Token | 臨時 | 自動重新整理 | |
部署運行在阿里雲的ECS執行個體、ECI執行個體、Container ServiceKubernetes版的Worker節點中的應用程式 | 否 | STS Token | 臨時 | 自動重新整理 | |
部署運行在阿里雲的Container ServiceKubernetes版的Worker節點中的不可信應用程式 | 否 | STS Token | 臨時 | 自動重新整理 | |
如果以上憑證配置方式都不滿足要求時,您可以自訂擷取憑證的方式 | 自訂 | 自訂 | 自訂 | 自訂 |
方式一:使用AK
如果您的應用程式部署運行在安全、穩定且不易受外部攻擊的環境中,需要長期訪問您的OSS,且不能頻繁輪轉憑證時,您可以使用阿里雲主帳號或RAM使用者的AK(Access Key ID、Access Key Secret)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個AK,存在安全性風險和維護複雜度增加的風險。如何擷取AK,請參見CreateAccessKey - 建立主帳號或RAM使用者存取金鑰。
環境變數
阿里雲帳號擁有資源的全部許可權,AK一旦泄露,會給系統帶來巨大風險,不建議使用。推薦使用最小化授權的RAM使用者的AK。
使用AK設定環境變數。
Mac OS X/Linux/Unix
export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
Windows
set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
使用環境變數來傳遞憑證資訊。
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) }
靜態憑證
您可以在代碼中使用變數來引用憑證,這些變數在運行時會被環境變數、設定檔或其他外部資料源中的實際憑證值填充。
以下操作步驟以設定檔為例。
需要安裝go-ini
庫。如果尚未安裝,您可以使用以下命令安裝:
go get -u github.com/go-ini/ini
建立設定檔
config.ini
。[credentials] alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID> alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET>
使用設定檔來傳遞憑證資訊。
package main import ( "log" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" "gopkg.in/ini.v1" ) func main() { // 請根據實際要求設定region,以執行個體華東1(杭州)為例,regionID為cn-hangzhou region := "cn-hangzhou" // 讀取設定檔 cfgFile, err := ini.Load("config.ini") if err != nil { log.Fatalf("Failed to load config file: %v", err) } // 擷取配置資訊 accessKeyID := cfgFile.Section("oss").Key("alibaba_cloud_access_key_id").String() accessKeySecret := cfgFile.Section("oss").Key("alibaba_cloud_access_key_secret").String() // 建立憑證提供者 provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret) // 載入預設配置並設定憑證提供者和地區 cfg := oss.LoadDefaultConfig(). WithCredentialsProvider(provider). WithRegion(region) // 建立OSS用戶端 client := oss.NewClient(cfg) log.Printf("ossclient: %v", client) }
方式二:使用STS Token
如果您的應用程式需要臨時訪問OSS,您可以使用通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個STS Token,存在安全性風險和維護複雜度增加的風險。此外,如果您需要多次臨時訪問OSS,您需要手動重新整理STS Token。如何擷取STS Token,請參見AssumeRole - 擷取扮演角色的臨時身份憑證。
使用臨時身份憑證設定環境變數。
Mac OS X/Linux/Unix
export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> export OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
Windows
set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> set OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
通過環境變數來傳遞憑證資訊。
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) }
方式三:使用RAMRoleARN
如果您的應用程式需要授權訪問OSS,例如跨阿里雲帳號訪問OSS,您可以使用RAMRoleARN初始化憑證提供者。該方式底層實現是STS Token。通過指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具會前往STS服務擷取STS Token,並在會話到期前自動重新整理STS Token。此外,您還可以通過為policy
賦值來限制RAM角色到一個更小的許可權集合。需要注意的是,該方式需要您提供一個AK,存在安全性風險和維護複雜度增加的風險。如何擷取AK,請參見CreateAccessKey - 為RAM使用者建立存取金鑰。如何擷取RAMRoleARN,請參見CreateRole - 建立角色。
添加credentials依賴。
go get github.com/aliyun/credentials-go/credentials
配置訪問憑證。
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 - 建立角色。
添加credentials依賴。
go get github.com/aliyun/credentials-go/credentials
配置訪問憑證。
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許可權隔離。
添加credentials依賴。
go get github.com/aliyun/credentials-go/credentials
配置訪問憑證。
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 支援多種實現方式。
通過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) }
實現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) }