すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:Go SDKのアクセス資格情報の設定

最終更新日:Jan 17, 2025

Go SDKを使用してMaxComputeリクエストを送信する前に、アクセス資格情報を設定して資格情報プロバイダーを初期化する必要があります。 Alibaba Cloudサービスは、これらのアクセス資格情報を使用してIDとアクセス権限を認証します。 MaxComputeには、さまざまな認証と承認のニーズに合わせていくつかの設定方法があります。

前提条件

Go SDKがインストールされています。 詳細については、「Go SDKのインストール」をご参照ください。

アクセス資格情報の設定方法の比較

設定方法

シナリオ

事前提供AccessKeyまたはSTSトークンが必要です

基本的な実装

有効期間

資格情報のローテーションまたは更新方法

方法1: AccessKey

安全で安定した、外部攻撃の影響を受けにくい環境に展開されたアプリケーション。 このようなアプリケーションは、頻繁な資格情報のローテーションを必要とせずに、クラウドサービスに長期アクセスできます。

必須

アクセスキー(AccessKey)

長期

手動ローテーション

方法2: STSトークン

信頼できない環境にデプロイされたアプリケーション。 これらのアプリケーションには、制御されたアクセスの有効性と権限が必要です。

必須

STSトークン

一時的

手動更新

方法3: RAMRoleARN

クロスアカウントシナリオなど、承認されたクラウドサービスアクセスを必要とするアプリケーション。

必須

STSトークン

一時的

自動更新

方法4: ECSRAMRole

Alibaba Cloud ECSインスタンス、ECIインスタンス、またはContainer Service for Kubernetesワーカーノードにデプロイされたアプリケーション。

選択可能

STSトークン

一時的

自動更新

方法5: CredentialsURI

外部システムからアクセス資格情報を取得する必要があるアプリケーション。

選択可能

STSトークン

一時的

自動更新

方法6: カスタムアクセス資格情報

または、アクセス資格情報をカスタマイズすることもできます。

Custom

STSトークン

Custom

Custom

方法1: AccessKey

アプリケーションが、外部攻撃の影響を受けにくく、MaxComputeへの長期アクセスを必要とするが、認証情報の頻繁な更新を必要としない安全で安定した環境内でデプロイされ、実行されている場合は、Alibaba CloudアカウントまたはRAMユーザーのAccessKey IDとAccessKey Secretを使用して、認証情報プロバイダーを初期化できます。 ただし、AccessKeyを手動で管理すると、セキュリティリスクが発生し、メンテナンスがさらに複雑になります。 AccessKeyの取得に関するガイダンスについては、「CreateAccessKey」をご参照ください。

環境変数

  1. プロジェクトに資格情報の依存関係を追加します。

    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() {
    	// Read AccessKey information from environment variables: “ALIBABA_CLOUD_ACCESS_KEY_ID” and “ALIBABA_CLOUD_ACCESS_KEY_SECRET”
    	credential, err := credentials.NewCredential(nil)
    	if err != nil {
    		return
    	}
    
    	aliyunAccount := account.NewStsAccountWithCredential(credential)
    	// Get the specific endpoint, using Hangzhou as an example
    	endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api"
            // Default MaxCompute project
    	defaultProject := ""
    
    	odpsIns := odps.NewOdps(aliyunAccount, endpoint)
    	odpsIns.SetDefaultProjectName(defaultProject)
    
    	fmt.Printf("odps:%#v\n", odpsIns)
    }

設定ファイル

  1. で構成ファイルを作成します。. iniconfig.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() {
        // Configuration file path
        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)
        // Set the default MaxCompute project
        odpsIns.SetDefaultProjectName(conf.ProjectName)
    
        fmt.Printf("odps:%#v\n", odpsIns)
    }

方法2: STSトークン

アプリケーションが一時的にMaxComputeにアクセスする必要がある場合、STSサービスによって取得された一時的なID認証情報 (AccessKey ID、AccessKey Secret、およびSecurity Token) を使用して認証情報プロバイダーを初期化できます。 この方法を使用する場合、STSトークンを手動で管理する必要があります。これにより、セキュリティリスクが発生し、メンテナンスがさらに複雑になる可能性があります。 さらに、アプリケーションでMaxComputeに繰り返し一時的にアクセスする必要がある場合は、そのたびにSTSトークンを手動で更新する必要があります。 STSトークンの取得の詳細については、「AssumeRole」をご参照ください。

環境変数

  1. プロジェクトに資格情報の依存関係を追加します。

    go get github.com/aliyun/credentials-go/credentials
  2. STSトークンの環境変数を設定します。

    • 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() {
    	// Read AccessKey information from environment variables: "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)
    
    	// Get the specific endpoint, using Hangzhou as an example
    	endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api"
    
    	// Default MaxCompute project
    	defaultProject := ""
    
    	odpsIns := odps.NewOdps(aliyunAccount, endpoint)
    	odpsIns.SetDefaultProjectName(defaultProject)
    
    	fmt.Printf("odps:%#v\n", odpsIns)
    }

設定ファイル

  1. で構成ファイルを作成します。. iniconfig.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() {
        // Configuration file path
        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)
        // Set the default MaxCompute project
        odpsIns.SetDefaultProjectName(conf.ProjectName)
    
        fmt.Printf("odps:%#v\n", odpsIns)
    }

方法3: RAMRoleARN

アプリケーションでMaxComputeへのアクセス許可が必要な場合 (OSSへのクロスAlibaba Cloudアカウントアクセスなど) 、RAMRoleARNを使用して認証情報プロバイダーを初期化できます。 このアプローチの基本的な実装はSTSサービスです。 RAMロールのARNを指定すると、資格情報ツールはSTSサービスを呼び出してSTSトークンを取得し、セッションの有効期限が切れる前にSTSトークンを自動的に更新します。 さらに、ポリシーを割り当てることで、RAMロールをより小さな権限セットに制限できます。 ただし、この方法では、AccessKeyまたはSTSトークンを提供する必要があります。これにより、セキュリティリスクが発生し、メンテナンスが複雑になる可能性があります。 AccessKeyまたはSTSトークンの取得の詳細については、「CreateAccessKey」または「AssumeRole」をご参照ください。 RAMRoleARNの取得の詳細については、「CreateRole」をご参照ください。

  1. プロジェクトに資格情報の依存関係を追加します。

    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() {
            // Obtain AccessKey information
    	accessKeyId := ""
    	accessKeySecret := ""
    	
    	config := new(credentials.Config).
    		// Required credential type
    		SetType("ram_role_arn").
    		// AccessKey ID of the cloud account
    		SetAccessKeyId(accessKeyId).
    		// AccessKey Secret of the cloud account
    		SetAccessKeySecret(accessKeySecret).
    		// RoleArn format: acs:ram::USER_Id:role/ROLE_NAME
    		SetRoleArn("RoleArn").
    		// RoleSession name
    		SetRoleSessionName("RoleSessionName").
    		// Optional, restrict the permissions of the STS token
    		SetPolicy("Policy").
    		// Optional, restrict the validity period of the STS token
    		SetRoleSessionExpiration(3600)
    
    	credential, err := credentials.NewCredential(config)
    	if err != nil {
    		log.Fatalf("%+v", err)
    	}
    
    	stsAccount := account.NewStsAccountWithCredential(credential)
    
    	// Get the specific endpoint, using Hangzhou as an example
    	endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api"
    	// Default MaxCompute project
    	defaultProject := ""
    
    	odpsIns := odps.NewOdps(stsAccount, endpoint)
    	odpsIns.SetDefaultProjectName(defaultProject)
    
    	fmt.Printf("odps:%#v\n", odpsIns)
    }

方法4: ECSRAMRole

アプリケーションがECSインスタンス、ECIインスタンス、またはContainer Service for Kubernetesワーカーノードで実行されている場合、ECSRAMRoleを使用して認証情報プロバイダーを初期化することをお勧めします。 このアプローチの基本的な実装はSTSトークンです。 この方法では、AccessKeyまたはSTSトークンを必要としないため、AccessKeyまたはSTSトークンを手動で管理することに関連するリスクが排除されます。 ECSRAMRoleの取得方法の詳細については、「CreateRole」をご参照ください。

  1. プロジェクトに資格情報の依存関係を追加します。

    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).
    		// Credential type
    		SetType("ecs_ram_role").
    		// "roleName" is optional. If not set, it will be automatically search. We recommended to set it for reducing requests
    		SetRoleName("RoleName").
    		// "DisableIMDSv1" is optional and recommended to be enabled. It can be replaced by configuring the environment variable: ALIBABA_CLOUD_IMDSV1_DISABLED
    		SetDisableIMDSv1(true)
    
    	credential, err := credentials.NewCredential(config)
    	if err != nil {
    		log.Fatalf("%+v", err)
    	}
    
    	stsAccount := account.NewStsAccountWithCredential(credential)
    
    	// Get the specific endpoint, using Hangzhou as an example
    	endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api"
    
    	// Default MaxCompute project
    	defaultProject := ""
    
    	odpsIns := odps.NewOdps(stsAccount, endpoint)
    	odpsIns.SetDefaultProjectName(defaultProject)
    
    	fmt.Printf("odps:%#v\n", odpsIns)
    }

方法5: CredentialsURI

アプリケーションが外部システムを介してAlibaba Cloudの資格情報を取得し、柔軟な資格情報管理とキーレスアクセスを実現する必要がある場合は、CredentialsURIを使用して資格情報プロバイダーを初期化できます。 このメソッドの基本的な実装は、STSトークンに基づいています。 資格情報ツールは、指定したURIを介してSTSトークンを取得し、資格情報クライアントの初期化を完了します。 この方法では、AccessKeyまたはSTSトークンを提供する必要がないため、AccessKeyまたはSTSトークンを手動で管理することに関連するリスクが排除されます。 CredentialsURIに応答するバックエンドサービスは、STSトークンの自動更新ロジックを実装して、アプリケーションが常に有効な資格情報を取得できるようにする必要があります。

  1. CredentialsツールがSTSトークンを正しく解析して利用するには、URIが次の応答プロトコルに従う必要があります。

    • 応答ステータスコード: 200

    • レスポンスボディの構造:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2024-10-09T16:39:33Z",
          "SecurityToken": "SecurityToken"
      }
  2. プロジェクトに資格情報の依存関係を追加します。

    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)
    	
    	// Get the specific endpoint, using Hangzhou as an example
    	endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api"
    
    	// Default MaxCompute project
    	defaultProject := ""
    
    	odpsIns := odps.NewOdps(stsAccount, endpoint)
    	odpsIns.SetDefaultProjectName(defaultProject)
    
    	fmt.Printf("odps:%#v\n", odpsIns)
    }

方法6: アクセス資格情報のカスタム化

上記の資格情報の構成方法のいずれも要件を満たしていない場合は、CredentialProviderインターフェイスを実装して資格情報のプロビジョニング方法をカスタマイズすることもできます。 これにより、資格情報をアプリケーションに提供する方法について独自のロジックを定義でき、資格情報管理の柔軟性と制御性を高めます。

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)

	// Get the specific endpoint, using Hangzhou as an example
	endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api"

	// Default MaxCompute project
	defaultProject := ""

	odpsIns := odps.NewOdps(stsAccount, endpoint)
	odpsIns.SetDefaultProjectName(defaultProject)

	fmt.Printf("odps:%#v\n", odpsIns)
}

次に何をする?

アクセス資格情報を設定した後、MaxCompute SDKを初期化できます。 詳細な手順については、「MaxCompute SDKの初期化」をご参照ください。