全部產品
Search
文件中心

MaxCompute:配置訪問憑證

更新時間:Oct 25, 2024

使用Go SDK發起MaxCompute請求前,您需要配置訪問憑證,即初始化憑證提供者,阿里雲服務會通過訪問憑證驗證您的身份資訊和存取權限。MaxCompute支援以多種方式配置訪問憑證,您可以根據使用情境對認證和授權的要求,選擇對應的方式。

前提條件

已安裝Go SDK,安裝方法請參見安裝Go SDK

訪問憑證配置方式對比

訪問憑證配置方式

適用情境

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

底層實現所依賴的憑證

憑證有效期間

憑證輪轉或重新整理方式

方式一:使用AK

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

AK

長期

手動輪轉

方式二:使用STS Token

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

STS Token

臨時

手動重新整理

方式三:使用RAMRoleARN

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

STS Token

臨時

自動重新整理

方式四:使用ECSRAMRole

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

STS Token

臨時

自動重新整理

方式五:使用CredentialsURI

需要通過外部系統擷取訪問憑證的應用程式。

STS Token

臨時

自動重新整理

方式六:自訂訪問憑證

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

自訂

STS Token

自訂

自訂

方式一:使用AK

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

環境變數

  1. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  2. 使用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>
  3. 使用環境變數來傳遞憑證資訊。

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

設定檔

  1. 建立尾碼名為.ini的檔案,如config.ini。樣本如下:

    重要

    該檔案中,索引值對中的值後面不能加註釋。

    [odps]
    access_id = ""
    access_key = ""
    endpoint = ""
    project = ""
  2. 使用設定檔傳遞配置資訊。

    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 - 擷取扮演角色的臨時身份憑證

環境變數

  1. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  2. 使用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>
  3. 使用環境變數來傳遞憑證資訊。

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

設定檔

  1. 建立尾碼名為.ini的檔案,如config.ini。樣本如下:

    重要

    該檔案中,索引值對中的值後面不能加註釋。

    [odps]
    access_id = ""
    access_key = ""
    sts_token = ""
    endpoint = ""
    project = ""
  2. 使用設定檔來傳遞配置資訊。

    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 - 建立角色

  1. 添加credentials依賴。

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

    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 - 建立角色

  1. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  2. 配置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的自動重新整理邏輯,確保您的應用程式始終能擷取到有效憑證。

  1. 為了使Credentials工具正確解析和使用STS Token,URI必須遵循以下響應協議:

    • 響應狀態代碼:200

    • 響應體結構:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2024-10-09T16:39:33Z",
          "SecurityToken": "SecurityToken"
      }
  2. 添加credentials依賴。

    go get github.com/aliyun/credentials-go/credentials
  3. 配置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