使用Go SDK發起MaxCompute請求前,您需要配置訪問憑證,即初始化憑證提供者,阿里雲服務會通過訪問憑證驗證您的身份資訊和存取權限。MaxCompute支援以多種方式配置訪問憑證,您可以根據使用情境對認證和授權的要求,選擇對應的方式。
前提條件
已安裝Go SDK,安裝方法請參見安裝Go SDK。
訪問憑證配置方式對比
訪問憑證配置方式 | 適用情境 | 是否需要提供前置的AK或STS Token | 底層實現所依賴的憑證 | 憑證有效期間 | 憑證輪轉或重新整理方式 |
部署運行在安全、穩定且不易受外部攻擊的環境的應用程式,無需頻繁輪轉憑證就可以長期訪問雲端服務。 | 是 | AK | 長期 | 手動輪轉 | |
部署運行在不可信的環境的應用程式,希望能控制訪問的有效期間、許可權。 | 是 | STS Token | 臨時 | 手動重新整理 | |
需要授權訪問雲端服務,例如跨阿里雲帳號訪問雲端服務的應用程式。 | 是 | STS Token | 臨時 | 自動重新整理 | |
部署運行在阿里雲的ECS執行個體、ECI執行個體、Container ServiceKubernetes版的Worker節點中的應用程式。 | 否 | STS Token | 臨時 | 自動重新整理 | |
需要通過外部系統擷取訪問憑證的應用程式。 | 否 | STS Token | 臨時 | 自動重新整理 | |
如果以上憑證配置方式都不滿足要求時,您可以採用自訂擷取憑證的方式。 | 自訂 | STS Token | 自訂 | 自訂 |
方式一:使用AK
如果您的應用程式部署運行在安全、穩定且不易受外部攻擊的環境中,需要長期訪問您的MaxCompute,且不能頻繁輪轉憑證時,您可以使用阿里雲帳號(主帳號)或RAM使用者的AK(AccessKey ID、AccessKey Secret)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個AK,存在安全性風險和維護複雜度增加的風險。如何擷取AK,請參見CreateAccessKey - 建立主帳號或RAM使用者存取金鑰。
環境變數
添加credentials依賴。
go get github.com/aliyun/credentials-go/credentials使用AK設定環境變數。
macOS X/Linux/Unix系統:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>Windows系統:
set ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
使用環境變數來傳遞憑證資訊。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main() { // 從環境變數中讀取AK資訊: “ALIBABA_CLOUD_ACCESS_KEY_ID” 和 “ALIBABA_CLOUD_ACCESS_KEY_SECRET” credential, err := credentials.NewCredential(nil) if err != nil { return } aliyunAccount := account.NewStsAccountWithCredential(credential) // 擷取具體的endpoint,此處以杭州為例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 預設的MaxCompute專案 defaultProject := "" odpsIns := odps.NewOdps(aliyunAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
設定檔
建立尾碼名為
.ini的檔案,如config.ini。樣本如下:重要該檔案中,索引值對中的值後面不能加註釋。
[odps] access_id = "" access_key = "" endpoint = "" project = ""使用設定檔傳遞配置資訊。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "log" ) func main() { // 設定檔路徑 configPath := "./config.ini" conf, err := odps.NewConfigFromIni(configPath) if err != nil { log.Fatalf("%+v", err) } aliAccount := account.NewAliyunAccount(conf.AccessId, conf.AccessKey) odpsIns := odps.NewOdps(aliAccount, conf.Endpoint) // 設定預設的MaxCompute專案 odpsIns.SetDefaultProjectName(conf.ProjectName) fmt.Printf("odps:%#v\n", odpsIns) }
方式二:使用STS Token
如果您的應用程式需要臨時訪問MaxCompute,您可以使用通過STS服務擷取的臨時身份憑證(AccessKey ID、AccessKey Secret和Security Token)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個STS Token,存在安全性風險和維護複雜度增加的風險。此外,如果您需要多次臨時訪問MaxCompute,需要手動重新整理STS Token。如何擷取STS Token,請參見AssumeRole - 擷取扮演角色的臨時身份憑證。
環境變數
添加credentials依賴。
go get github.com/aliyun/credentials-go/credentials使用AK設定環境變數。
macOS X/Linux/Unix系統:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> export ALIBABA_CLOUD_SECURITY_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>Windows系統:
set ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> set ALIBABA_CLOUD_SECURITY_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
使用環境變數來傳遞憑證資訊。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main() { // 從環境變數中讀取AK資訊: "ALIBABA_CLOUD_ACCESS_KEY_ID","ALIBABA_CLOUD_ACCESS_KEY_SECRET", "ALIBABA_CLOUD_SECURITY_TOKEN" credential, err := credentials.NewCredential(nil) if err != nil { return } aliyunAccount := account.NewStsAccountWithCredential(credential) // 擷取具體的endpoint,此處以杭州為例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 預設的MaxCompute專案 defaultProject := "" odpsIns := odps.NewOdps(aliyunAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
設定檔
建立尾碼名為
.ini的檔案,如config.ini。樣本如下:重要該檔案中,索引值對中的值後面不能加註釋。
[odps] access_id = "" access_key = "" sts_token = "" endpoint = "" project = ""使用設定檔來傳遞配置資訊。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "log" ) func main() { // 設定檔路徑 configPath := "./config.ini" conf, err := odps.NewConfigFromIni(configPath) if err != nil { log.Fatalf("%+v", err) } aliAccount := account.NewAliyunAccount(conf.AccessId, conf.AccessKey) odpsIns := odps.NewOdps(aliAccount, conf.Endpoint) // 設定預設的MaxCompute專案 odpsIns.SetDefaultProjectName(conf.ProjectName) fmt.Printf("odps:%#v\n", odpsIns) }
方式三:使用RAMRoleARN
如果您的應用程式需要授權訪問MaxCompute(例如跨阿里雲帳號訪問OSS),您可以使用RAMRoleARN初始化憑證提供者。該方式底層實現是STS Token。通過指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具會前往STS服務擷取STS Token,並在會話到期前自動重新整理STS Token。此外,您還可以通過為Policy賦值來限制RAM角色到一個更小的許可權集合。需要注意的是,該方式需要您提供一個AK或STS Token,存在安全性風險和維護複雜度增加的風險。如何擷取AK或STS Token,請參見CreateAccessKey - 為RAM使用者建立存取金鑰或AssumeRole - 擷取扮演角色的臨時身份憑證。如何擷取RAMRoleARN,請參見CreateRole - 建立角色。
添加credentials依賴。
go get github.com/aliyun/credentials-go/credentials配置訪問憑證。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" "log" ) func main() { // 先擷取AK資訊 accessKeyId := "" accessKeySecret := "" config := new(credentials.Config). // 所需的憑證類型 SetType("ram_role_arn"). // 雲帳號的Accesskey ID SetAccessKeyId(accessKeyId). // 雲帳號的Accesskey Secret SetAccessKeySecret(accessKeySecret). // RoleArn格式: acs:ram::USER_Id:role/ROLE_NAME SetRoleArn("RoleArn"). // RoleSession名稱 SetRoleSessionName("RoleSessionName"). // 非必需,限制STS Token的許可權 SetPolicy("Policy"). // 非必需, 限制STS Token的有效期間 SetRoleSessionExpiration(3600) credential, err := credentials.NewCredential(config) if err != nil { log.Fatalf("%+v", err) } stsAccount := account.NewStsAccountWithCredential(credential) // 擷取具體的endpoint,此處以杭州為例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 預設的MaxCompute專案 defaultProject := "" odpsIns := odps.NewOdps(stsAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
方式四:使用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配置ECSRAMRole作為訪問憑證。
package main import ( "fmt" "log" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main(){ config := new(credentials.Config). // 憑證類型 SetType("ecs_ram_role"). // “roleName” 為可選值. 如果未設定,將進行自動檢索。強烈建議對其進行設定以減少請求 SetRoleName("RoleName"). // “DisableIMDSv1”為可選值,建議開啟。可以通過設定環境變數來替換它: ALIBABA_CLOUD_IMDSV1_DISABLED SetDisableIMDSv1(true) credential, err := credentials.NewCredential(config) if err != nil { log.Fatalf("%+v", err) } stsAccount := account.NewStsAccountWithCredential(credential) // 擷取具體的endpoint,此處以杭州為例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 預設的MaxCompute專案 defaultProject := "" odpsIns := odps.NewOdps(stsAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
方式五:使用CredentialsURI
如果您的應用程式需要通過外部系統擷取阿里雲憑證,從而實現靈活的憑證管理和無密鑰訪問,您可以使用CredentialsURI初始化憑證提供者。該方式底層實現是STS Token。Credentials工具通過您提供的URI擷取STS Token,完成憑證用戶端初始化。該方式無需您提供一個AK或STS Token,消除了手動維護AK或STS Token的風險。需要注意的是,提供CredentialsURI響應的後端服務需要實現STS Token的自動重新整理邏輯,確保您的應用程式始終能擷取到有效憑證。
為了使Credentials工具正確解析和使用STS Token,URI必須遵循以下響應協議:
響應狀態代碼:200
響應體結構:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2024-10-09T16:39:33Z", "SecurityToken": "SecurityToken" }
添加credentials依賴。
go get github.com/aliyun/credentials-go/credentials配置CredentialsURI作為訪問憑證。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main() { config := new(credentials.Config).SetType("credentials_uri").SetURLCredential("<yourCredentialsURI>") credential, err := credentials.NewCredential(config) if err != nil { return } stsAccount := account.NewStsAccountWithCredential(credential) // 擷取具體的endpoint,此處以杭州為例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 預設的MaxCompute專案 defaultProject := "" odpsIns := odps.NewOdps(stsAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
方式六:自訂訪問憑證
若以上憑證配置方式都不滿足要求,您還可以通過實現Credential Providers介面的方式,來自訂憑證提供方式。
package main
import (
"fmt"
"github.com/aliyun/aliyun-odps-go-sdk/odps"
"github.com/aliyun/aliyun-odps-go-sdk/odps/account"
"github.com/aliyun/credentials-go/credentials"
)
type CustomCredentialProvider struct {
}
func (cp *CustomCredentialProvider) GetType() (*string, error) {
s := "CustomProvider"
return &s, nil
}
func (cp *CustomCredentialProvider) GetCredential() (*credentials.CredentialModel, error) {
accessKeyId := ""
accessKeySecurity := ""
accessKeyToken := ""
return &credentials.CredentialModel{
AccessKeyId: &accessKeyId,
AccessKeySecret: &accessKeyToken,
SecurityToken: &accessKeySecurity,
}, nil
}
func main() {
provider := &CustomCredentialProvider{}
stsAccount := account.NewStsAccountWithProvider(provider)
// 擷取具體的endpoint,此處以杭州為例
endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api"
// 預設的MaxCompute專案
defaultProject := ""
odpsIns := odps.NewOdps(stsAccount, endpoint)
odpsIns.SetDefaultProjectName(defaultProject)
fmt.Printf("odps:%#v\n", odpsIns)
}下一步
配置完訪問憑證後,您可初始化MaxCompute SDK。具體操作,請參見初始化MaxCompute SDK。