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

Alibaba Cloud SDK:アクセスクレデンシャルの管理

最終更新日:Feb 07, 2025

Alibaba Cloud SDK を使用してクラウド リソースを管理するための API オペレーションを呼び出すときは、有効なクレデンシャル情報を構成する必要があります。Alibaba Cloud クレデンシャルツールは、アクセスクレデンシャルを簡単に取得および管理できる強力な機能を提供します。このトピックでは、クレデンシャルツールを使用して、デフォルトのクレデンシャル、AccessKey ペア、セキュリティトークンサービス (STS) トークンなど、さまざまな種類のクレデンシャルを構成する方法について説明します。また、クレデンシャルツールがデフォルトのクレデンシャルを取得する順序についても説明します。Alibaba Cloud SDK でのクレデンシャルの構成と管理に関する十分な知識を習得できます。これにより、クラウド リソースに対する操作を効率的かつ安全に実行できます。

背景情報

クレデンシャルとは、ユーザーの身元を証明するために使用される一連の情報です。システムにログオンするときは、有効なクレデンシャルを使用して身分認証を完了する必要があります。一般的に使用されるクレデンシャルの種類は次のとおりです。

  1. Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ペア。AccessKey ペアは永続的に有効で、AccessKey ID と AccessKey シークレットで構成されます。

  2. RAM ロールの STS トークン。STS トークンは一時的なクレデンシャルです。STS トークンの有効期間とアクセス許可を指定できます。詳細については、「STS とは」をご参照ください。

  3. ベアラトークン。ID 認証と承認に使用されます。

前提条件

クレデンシャルツールのインストール

  • go get コマンドを実行して、Alibaba Cloud Credentials for Go をインストールします。

$ go get -u github.com/aliyun/credentials-go
  • dep ツールを使用して Go の依存関係を管理する場合は、次のコマンドを実行して Alibaba Cloud Credentials for Go をインストールします。

$ dep ensure -add github.com/aliyun/credentials-go

最新バージョンのクレデンシャルツールを使用して、すべての種類のクレデンシャルがサポートされていることを確認します。

クレデンシャルクライアントの初期化

ビジネス要件に基づいて、次のいずれかの方法を使用してクレデンシャルクライアントを初期化できます。

重要

プロジェクトでプレーンテキストの AccessKey ペアを使用する場合、コード リポジトリの権限管理が不適切なために、AccessKey ペアが漏洩する可能性があります。これにより、AccessKey ペアが属するアカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。 AccessKey ペアは環境変数または構成ファイルに保存することをお勧めします。

方法 1:デフォルトのクレデンシャル プロバイダー チェーンを使用する

クレデンシャル クライアントを初期化する方法を指定しない場合、デフォルトのクレデンシャル プロバイダー チェーンが使用されます。デフォルトのクレデンシャル プロバイダー チェーンの取得方法の詳細については、このトピックの「デフォルトのクレデンシャル プロバイダー チェーン」セクションを参照してください。

package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	// クレデンシャル クライアントを初期化する方法を指定しません。
	credential, err := credentials.NewCredential(nil)
}

呼び出し例

次のサンプルコードは、Elastic Compute Service (ECS) の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、ECS SDK for Go をインストールする必要があります。

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	// デフォルトのクレデンシャルを使用して、クレデンシャル クライアントを初期化します。
	credentialClient, _err := credentials.NewCredential(nil)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// ECS のエンドポイントを指定します。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// SDK クレデンシャル パッケージを使用してクレデンシャルを構成します。
	ecsConfig.Credential = credentialClient
	// ECS SDK クライアントを初期化します。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// DescribeRegions オペレーションを呼び出すリクエストを初期化します。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// ランタイム構成を初期化します。
	runtime := &util.RuntimeOptions{}
	// DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方法 2:AccessKey ペアを使用する

Alibaba Cloud アカウントまたは RAM ユーザーの API オペレーションを呼び出すために使用される AccessKey ペアを作成できます。詳細については、「AccessKey ペアの作成」をご参照ください。その後、AccessKey ペアを使用してクレデンシャル クライアントを初期化できます。

警告

Alibaba Cloud アカウントは、アカウント内のリソースに対するすべての権限を持っています。Alibaba Cloud アカウントの AccessKey ペアの漏洩は、システムに重大な脅威をもたらします。

したがって、最小権限の原則に基づいて権限が付与されている RAM ユーザーの AccessKey ペアを使用して、クレデンシャル クライアントを初期化することをお勧めします。

import (
	"fmt"
	"os"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := new(credentials.Config).
		SetType("access_key").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))

	akCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	accessKeyId, err := akCredential.GetAccessKeyId()
	accessSecret, err := akCredential.GetAccessKeySecret()
	credentialType := akCredential.GetType()
	fmt.Println(accessKeyId, accessSecret, credentialType)
}

呼び出し例

クレデンシャルツールを使用して AccessKey ペアを読み取り、AccessKey ペアをクレデンシャルとして使用して、Alibaba Cloud サービスの API オペレーションを呼び出すことができます。

次のサンプルコードは、ECS の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、ECS SDK for Go をインストールする必要があります。

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	// AccessKey ペアと RAM ロールを使用して、クレデンシャル クライアントを初期化します。
	credentialsConfig := new(credentials.Config).
		// クレデンシャルの種類を指定します。
		SetType("access_key").
		// AccessKey ID を指定します。
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// AccessKey シークレットを指定します。
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// ECS のエンドポイントを指定します。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// SDK クレデンシャル パッケージを使用してクレデンシャルを構成します。
	ecsConfig.Credential = credentialClient
	// ECS SDK クライアントを初期化します。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// DescribeRegions オペレーションを呼び出すリクエストを初期化します。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// ランタイム構成を初期化します。
	runtime := &util.RuntimeOptions{}
	// DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方法 3:STS トークンを使用する

RAM ユーザーとして STS の AssumeRole オペレーションを呼び出して、STS トークンを取得できます。STS トークンの最大有効期間を指定できます。次の例は、STS トークンを使用してクレデンシャル クライアントを初期化する方法を示しています。この例では、STS トークンの取得方法は示していません。

package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	config := new(credentials.Config).
		SetType("sts").
		// 環境変数から AccessKey ID を取得します。
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// 環境変数から AccessKey シークレットを取得します。
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// 環境変数から STS トークンを取得します。
		SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))

	stsCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	credential, err := stsCredential.GetCredential()
	accessKeyId := credential.AccessKeyId
	accessKeySecret := credential.AccessKeySecret
	securityToken := credential.SecurityToken
	credentialType := credential.Type
	fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}

呼び出し例

クレデンシャルツールを使用して STS トークンを読み取り、STS トークンをクレデンシャルとして使用して、Alibaba Cloud サービスの API オペレーションを呼び出すことができます。

次のサンプルコードは、ECS の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、ECS SDK for GoSTS SDK for Go をインストールする必要があります。

package main

import (
	"os"

	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	// STS クライアントを作成し、AssumeRole オペレーションを呼び出して STS トークンを取得します。
	stsConfig := &openapi.Config{}
	stsConfig.SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
	stsConfig.SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	stsConfig.SetEndpoint("sts.cn-hangzhou.aliyuncs.com")
	client, _err := sts20150401.NewClient(stsConfig)
	if _err != nil {
		panic(_err)
	}
	assumeRoleRequest := &sts20150401.AssumeRoleRequest{}
	// 引き受ける RAM ロールの Alibaba Cloud Resource Name (ARN) を指定します。例:acs:ram::123456789012****:role/adminrole。ALIBABA_CLOUD_ROLE_ARN 環境変数から値を取得できます。
	assumeRoleRequest.SetRoleArn("<RoleArn>")
	// ロールセッション名を指定します。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から値を取得できます。
	assumeRoleRequest.SetRoleSessionName("<RoleSessionName>")
	assumeRoleRequest.SetDurationSeconds(3600)
	result, _err := client.AssumeRole(assumeRoleRequest)
	if _err != nil {
		panic(_err)
	}
	assumeRoleResponseBodyCredentials := result.Body.Credentials

	// STS トークンを使用して、クレデンシャル クライアントを初期化します。
	credentialsConfig := new(credentials.Config).
		// クレデンシャルの種類。
		SetType("sts").
		SetAccessKeyId(*assumeRoleResponseBodyCredentials.AccessKeyId).
		SetAccessKeySecret(*assumeRoleResponseBodyCredentials.AccessKeySecret).
		SetSecurityToken(*assumeRoleResponseBodyCredentials.SecurityToken)

	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// ECS のエンドポイントを指定します。
	ecsConfig.Endpoint = tea.String("ecs.cn-hangzhou.aliyuncs.com")
	// SDK クレデンシャル パッケージを使用してクレデンシャルを構成します。
	ecsConfig.Credential = credentialClient
	// ECS SDK クライアントを初期化します。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// DescribeRegions オペレーションを呼び出すリクエストを初期化します。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// ランタイム構成を初期化します。
	runtime := &util.RuntimeOptions{}
	// DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方法 4:AccessKey ペアと RAM ロールを使用する

この方法の基本ロジックは、STS トークンを使用してクレデンシャル クライアントを初期化することです。RAM ロールの ARN を指定すると、クレデンシャルツールは STS から STS トークンを取得できます。 SetPolicy メソッドを使用して、RAM ロールの権限を制限することもできます。

package main

import (
	"fmt"
	"os"

	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := new(credentials.Config).
		SetType("ram_role_arn").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// 引き受ける RAM ロールの ARN を指定します。例:acs:ram::123456789012****:role/adminrole。ALIBABA_CLOUD_ROLE_ARN 環境変数から値を取得できます。
		SetRoleArn("<RoleArn>").
		// ロールセッション名を指定します。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から値を取得できます。
		SetRoleSessionName("<RoleSessionName>").
		// オプション。RAM ロールの制限付き権限を指定します。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
		SetPolicy("<Policy>").
		// オプション。セッションの有効期間を指定します。
		SetRoleSessionExpiration(3600).
		// オプション。外部 ID。このパラメーターは外部機関によって提供され、混乱した代理人の問題を防ぐために使用されます。
		SetExternalId("ExternalId").
		// オプション。STS のエンドポイント。デフォルト値は sts.aliyuncs.com です。ネットワーク接続を確保するために、地理的に最も近いリージョンの STS エンドポイントを使用することをお勧めします。
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")

	arnCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}

	credential, err := arnCredential.GetCredential()
	accessKeyId := credential.AccessKeyId
	accessKeySecret := credential.AccessKeySecret
	securityToken := credential.SecurityToken
	credentialType := credential.Type
	fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}
説明

詳細については、「外部 ID を使用して混乱した代理人の問題を防ぐ」をご参照ください。

呼び出し例

次のサンプルコードは、Elastic Compute Service (ECS) の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、ECS SDK for Go をインストールする必要があります。

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	// RAM ロールの ARN を使用して、クレデンシャル クライアントを初期化します。
	credentialsConfig := new(credentials.Config).
		// クレデンシャルの種類を指定します。
		SetType("ram_role_arn").
		// AccessKey ID を指定します。
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// AccessKey シークレットを指定します。
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// 引き受ける RAM ロールの ARN を指定します。例:acs:ram::123456789012****:role/adminrole。ALIBABA_CLOUD_ROLE_ARN 環境変数から値を取得できます。
		SetRoleArn("<RoleArn>").
		// ロールセッション名を指定します。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から値を取得できます。
		SetRoleSessionName("<RoleSessionName>").
		// オプション。RAM ロールの制限付き権限を指定します。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
		SetPolicy("<Policy>").
		// オプション。セッションの有効期間を指定します。
		SetRoleSessionExpiration(3600).
		// オプション。STS のエンドポイント。デフォルト値は sts.aliyuncs.com です。ネットワーク接続を確保するために、地理的に最も近いリージョンの STS エンドポイントを使用することをお勧めします。
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// ECS のエンドポイントを指定します。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// SDK クレデンシャル パッケージを使用してクレデンシャルを構成します。
	ecsConfig.Credential = credentialClient
	// ECS SDK クライアントを初期化します。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// DescribeRegions オペレーションを呼び出すリクエストを初期化します。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// ランタイム構成を初期化します。
	runtime := &util.RuntimeOptions{}
	// DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方法 5:ECS インスタンスの RAM ロールを使用する

ECS インスタンスまたはエラスティックコンテナインスタンスに RAM ロールを割り当てることができます。ECS インスタンスまたはエラスティックコンテナインスタンスでクレデンシャルツールを使用すると、ツールはインスタンスに割り当てられた RAM ロールを自動的に取得し、メタデータサーバーにアクセスして RAM ロールの STS トークンを取得します。その後、STS トークンを使用してクレデンシャル クライアントを初期化できます。

インスタンスメタデータには、通常モードまたはセキュリティ強化モードでアクセスできます。デフォルトでは、クレデンシャルツールは、インスタンスメタデータサービスバージョン 2 (IMDSv2) を使用して、セキュリティ強化モードでアクセスクレデンシャルを取得します。セキュリティ強化モードで例外が発生した場合、DisableIMDSv1 パラメーターを構成して、例外処理ロジックを指定できます。 DisableIMDSv1 パラメーターの有効な値:

  1. パラメーターがデフォルト値の false に設定されている場合、アクセスクレデンシャルは通常モードで取得されます。

  2. true:例外がスローされ、クレデンシャルツールはセキュリティ強化モードでアクセスクレデンシャルの取得を続行します。

メタデータサーバーの構成によって、サーバーがセキュリティ強化モードをサポートするかどうかが決まります。

説明
package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
)

func _main(args []*string) {
	// ECS インスタンスの RAM ロールを使用して、クレデンシャル クライアントを初期化します。
	credentialsConfig := new(credentials.Config).
		// クレデンシャルの種類を指定します。
		SetType("ecs_ram_role").
		// オプション。ALIBABA_CLOUD_ECS_METADATA 環境変数を指定して、ECS インスタンスの RAM ロールの名前を指定します。このパラメーターを指定しない場合、値は自動的に取得されます。リクエスト数を減らすために、このパラメーターを指定することをお勧めします。
		SetRoleName("<RoleName>")
		// true の値は、セキュリティ強化モードが強制的に使用されることを指定します。デフォルト値は false で、システムが最初にセキュリティ強化モードでアクセスクレデンシャルを取得しようとすることを指定します。アクセスクレデンシャルの取得に失敗した場合、通常モード (IMDSv1) が使用されます。
	// credentialsConfig.SetDisableIMDSv1(true)
	credentialClient, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	credential, err := credentialClient.GetCredential()
	accessKeyId := credential.AccessKeyId
	accessKeySecret := credential.AccessKeySecret
	securityToken := credential.SecurityToken
	credentialType := credential.Type
	fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}

呼び出し例

次のサンプルコードは、Elastic Compute Service (ECS) の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、ECS SDK for Go をインストールする必要があります。

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
)

func _main(args []*string) {
	// ECS インスタンスの RAM ロールを使用して、クレデンシャル クライアントを初期化します。
	credentialsConfig := new(credentials.Config).
		// クレデンシャルの種類を指定します。
		SetType("ecs_ram_role").
		// オプション。ALIBABA_CLOUD_ECS_METADATA 環境変数を指定して、ECS インスタンスの RAM ロールの名前を指定します。このパラメーターを指定しない場合、値は自動的に取得されます。リクエスト数を減らすために、このパラメーターを指定することをお勧めします。
		SetRoleName("<RoleName>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// ECS のエンドポイントを指定します。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// SDK クレデンシャル パッケージを使用してクレデンシャルを構成します。
	ecsConfig.Credential = credentialClient
	// ECS SDK クライアントを初期化します。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// DescribeRegions オペレーションを呼び出すリクエストを初期化します。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// ランタイム構成を初期化します。
	runtime := &util.RuntimeOptions{}
	// DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方法 6:OIDC IdP の RAM ロールを使用する

Container Service for Kubernetes クラスタのワーカーノードに RAM ロールをアタッチした後、ワーカーノード上のポッド内のアプリケーションは、ECS インスタンス上のアプリケーションと同じ方法でメタデータサーバーを使用して STS トークンを取得できます。ただし、信頼されていないアプリケーション (顧客が送信したアプリケーションや、コードを利用できないアプリケーションなど) がワーカーノードにデプロイされている場合、アプリケーションがメタデータサーバーを使用して、ワーカーノードにアタッチされている RAM ロールのセキュリティトークンを取得することを望まない場合があります。クラウド リソースのセキュリティを確保し、信頼されていないアプリケーションが必要な STS トークンを安全に取得できるようにするには、サービスアカウントの RAM ロール (RRSA) 機能を使用して、アプリケーションに最小限必要な権限を付与します。この場合、ACK クラスタはサービスアカウント OpenID Connect (OIDC) トークンファイルを作成し、トークンファイルをポッドに関連付け、関連する環境変数をポッドに挿入します。次に、クレデンシャルツールは環境変数を使用して、STS の AssumeRoleWithOIDC オペレーションを呼び出し、RAM ロールの STS トークンを取得します。RRSA 機能の詳細については、「RRSA を使用して異なるポッドに異なるクラウドサービスへのアクセスを承認する」をご参照ください。

次の環境変数がポッドに挿入されます。

ALIBABA_CLOUD_ROLE_ARN:RAM ロールの ARN。

ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC ID プロバイダー (IdP) の ARN。

ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC トークンファイルのパス。

package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	config := new(credentials.Config).
		SetType("oidc_role_arn").
		// ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を指定して、OIDC IdP の ARN を指定します。
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を指定して、OIDC トークンファイルのパスを指定します。
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// ALIBABA_CLOUD_ROLE_ARN 環境変数を指定して、RAM ロールの ARN を指定します。
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// ロールセッション名を指定します。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から値を取得できます。
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// オプション。RAM ロールの制限付き権限を指定します。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
		SetPolicy("<Policy>").
		// オプション。セッションの有効期間を指定します。
		SetRoleSessionExpiration(3600).
		// オプション。STS のエンドポイント。デフォルト値は sts.aliyuncs.com です。ネットワーク接続を確保するために、地理的に最も近いリージョンの STS エンドポイントを使用することをお勧めします。
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	oidcCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	credential, err := oidcCredential.GetCredential()
	accessKeyId := credential.AccessKeyId
	accessKeySecret := credential.AccessKeySecret
	securityToken := credential.SecurityToken
	credentialType := credential.Type
	fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}

呼び出し例

次のサンプルコードは、Elastic Compute Service (ECS) の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、ECS SDK for Go をインストールする必要があります。

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
	"os"
)

func _main(args []*string) {
	// OIDC ID プロバイダー (IdP) の RAM ロールを使用して、クレデンシャル クライアントを初期化します。
	credentialsConfig := new(credentials.Config).
		// クレデンシャルの種類を指定します。
		SetType("oidc_role_arn").
		// ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を指定して、OIDC IdP の ARN を指定します。
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を指定して、OIDC トークンファイルのパスを指定します。
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// ALIBABA_CLOUD_ROLE_ARN 環境変数を指定して、RAM ロールの ARN を指定します。
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// ロールセッション名を指定します。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数から値を取得できます。
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// オプション。RAM ロールの制限付き権限を指定します。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
		SetPolicy("<Policy>").
		// セッションの有効期間を指定します。
		SetRoleSessionExpiration(3600)
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// ECS のエンドポイントを指定します。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// SDK クレデンシャル パッケージを使用してクレデンシャルを構成します。
	ecsConfig.Credential = credentialClient
	// ECS SDK クライアントを初期化します。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// DescribeRegions オペレーションを呼び出すリクエストを初期化します。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// ランタイム構成を初期化します。
	runtime := &util.RuntimeOptions{}
	// DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方法 7:クレデンシャル URI を使用する

この方法の基本ロジックは、STS トークンを使用してクレデンシャル クライアントを初期化することです。クレデンシャルツールは、提供された Uniform Resource Identifier (URI) を使用して STS トークンを取得します。次に、STS トークンを使用してクレデンシャル クライアントが初期化されます。

package main

import (
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := new(credentials.Config).
		SetType("credentials_uri").
                // ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を指定して、http://local_or_remote_uri/ 形式のクレデンシャルの URI を指定します。
		SetCredentialsUri("<CredentialsUri>")

	uriCredential, err := credentials.NewCredential(config)
}

呼び出し例

Alibaba Cloud サービスの API オペレーションを呼び出すには、クレデンシャルのローカルまたはリモート URI を指定し、Alibaba Cloud クレデンシャルを使用して、ローカルまたはリモート URI に基づいてアクセストークンを取得し、自動的に更新できます。

次のサンプルコードは、ECS の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、ECS SDK for Go をインストールする必要があります。

package main

import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	config := new(credentials.Config).
		SetType("credentials_uri").
		// ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を指定して、http://local_or_remote_uri/ 形式のクレデンシャルの URI を指定します。
		SetCredentialsUri("<CredentialsUri>")

	uriCredential, _err := credentials.NewCredential(config)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// ECS のエンドポイントを指定します。
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// SDK クレデンシャル パッケージを使用してクレデンシャルを構成します。
	ecsConfig.Credential = uriCredential
	// ECS SDK クライアントを初期化します。
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// DescribeRegions オペレーションを呼び出すリクエストを初期化します。
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// ランタイム構成を初期化します。
	runtime := &util.RuntimeOptions{}
	// DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

方法 8:ベアラトークンを使用する

Cloud Call Center のみ、ベアラトークンを使用してクレデンシャル クライアントを初期化できます。

package main

import (
	"fmt"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := new(credentials.Config).
		SetType("bearer").
		// ベアラトークンを入力します。
		SetBearerToken("<BearerToken>")
	bearerCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	bearerToken := bearerCredential.GetBearerToken()
	credentialType := bearerCredential.GetType()
	fmt.Println(bearerToken, credentialType)
}

呼び出し例

次のサンプルコードは、Cloud Call Center の GetInstance オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、Cloud Call Center SDK for Go をインストールする必要があります。

package main

import (
	ccc20200701 "github.com/alibabacloud-go/ccc-20200701/v2/client"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
)

func _main() (_err error) {
	// ベアラトークンを使用して、クレデンシャル クライアントを初期化します。
	credentialsConfig := new(credentials.Config).
		// クレデンシャルの種類を指定します。
		SetType("bearer").
		SetBearerToken("<BearerToken>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		return _err
	}

	// クレデンシャル クライアントを使用して、Cloud Call Center SDK クライアントを初期化します。
	config := &openapi.Config{}
	config.Endpoint = tea.String("ccc.cn-shanghai.aliyuncs.com") // Cloud Call Center のエンドポイントを指定します。
	config.Credential = credentialClient                         // SDK クレデンシャル パッケージを使用してクレデンシャルを構成します。
	cccClient, _err := ccc20200701.NewClient(config)
	if _err != nil {
		return _err
	}
	getInstanceRequest := &ccc20200701.GetInstanceRequest{
		InstanceId: tea.String("ccc-test"),
	}
	runtime := &util.RuntimeOptions{}
	response, _err := cccClient.GetInstanceWithOptions(getInstanceRequest, runtime)
	if _err != nil {
		return _err
	}
	panic(response.Body.String())
}

func main() {
	err := _main()
	if err != nil {
		panic(err)
	}
}

デフォルトのクレデンシャル プロバイダー チェーン

開発環境と本番環境で異なる種類のクレデンシャルを使用する場合、通常はコードから環境情報を取得し、コードブランチを作成して開発環境と本番環境の異なるクレデンシャルを取得する必要があります。クレデンシャルツールのデフォルトのクレデンシャル プロバイダー チェーンを使用すると、アプリケーションとは無関係な構成に基づいて、同じコードを使用して異なる環境のクレデンシャルを取得できます。初期化方法を指定せずに NewCredential() を使用してクレデンシャル クライアントを初期化する場合、クレデンシャルツールは次の順序でクレデンシャル情報を取得します。

1. 環境変数からクレデンシャル情報を取得する

前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは環境変数からクレデンシャル情報を取得します。

  • ALIBABA_CLOUD_ACCESS_KEY_ID (AccessKey ID) と ALIBABA_CLOUD_ACCESS_KEY_SECRET (AccessKey シークレット) システム環境変数が指定されている場合、クレデンシャルツールは指定された AccessKey ペアをデフォルトのクレデンシャルとして使用します。

  • ALIBABA_CLOUD_ACCESS_KEY_ID (AccessKey ID)、ALIBABA_CLOUD_ACCESS_KEY_SECRET (AccessKey シークレット)、ALIBABA_CLOUD_SECURITY_TOKEN (STS トークン) システム環境変数が指定されている場合、クレデンシャルツールは指定された STS トークンをデフォルトのクレデンシャルとして使用します。

2. OIDC IdP の RAM ロールを使用してクレデンシャル情報を取得する

前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは次の環境変数の値を取得します。

ALIBABA_CLOUD_ROLE_ARN:RAM ロールの ARN。

ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC IdP の ARN。

ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC トークンファイルのパス。

上記の 3 つの環境変数が指定されている場合、クレデンシャルツールは環境変数を使用して STS の AssumeRoleWithOIDC オペレーションを呼び出し、STS トークンをデフォルトのクレデンシャルとして取得します。

3. config.json ファイルからクレデンシャル情報を取得する

前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは config.json ファイルからクレデンシャル情報を取得します。構成ファイルのパスは、オペレーティングシステムによって異なります。

Linux:~/.aliyun/config.json

Windows:C:\Users\USER_NAME\.aliyun\config.json

config.json ファイルが存在する場合、アプリケーションは config.json ファイルの current パラメーターで指定されたクレデンシャル情報を使用してクレデンシャル クライアントを初期化します。 ALIBABA_CLOUD_PROFILE 環境変数を指定してクレデンシャル情報を指定することもできます。たとえば、ALIBABA_CLOUD_PROFILE 環境変数を client1 に設定できます。

config.json ファイルの mode パラメーターは、クレデンシャル情報を取得するために使用される方法を指定します。有効な値:

  • AK:RAM ユーザーの AccessKey ペアを使用してクレデンシャル情報を取得します。

  • RamRoleArn:RAM ロールの ARN を使用してクレデンシャル情報を取得します。

  • EcsRamRole:ECS インスタンスにアタッチされている RAM ロールを使用してクレデンシャル情報を取得します。

  • OIDC:OIDC IdP の ARN と OIDC トークンファイルを使用してクレデンシャル情報を取得します。

  • ChainableRamRoleArn:ロールチェーンを使用して、別の JSON ファイルでアクセスクレデンシャルを指定してクレデンシャル情報を取得します。

構成例:

{
	"current": "default",
	"profiles": [
		{
			"name": "default",
			"mode": "AK",
			"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
			"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
		},
		{
			"name":"client1",
			"mode":"RamRoleArn",
			"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
			"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
			"ram_role_arn":"<ROLE_ARN>",
			"ram_session_name":"<ROLE_SESSION_NAME>",
			"expired_seconds":3600
		},
		{
			"name":"client2",
			"mode":"EcsRamRole",
			"ram_role_name":"<RAM_ROLE_ARN>"
		},
		{
			"name":"client3",
			"mode":"OIDC",
			"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
			"oidc_token_file":"<OIDC_TOKEN_FILE>",
			"ram_role_arn":"<ROLE_ARN>",
			"ram_session_name":"<ROLE_SESSION_NAME>",
			"expired_seconds":3600
		},
		{
			"name":"client4",
			"mode":"ChainableRamRoleArn",
			"source_profile":"<PROFILE_NAME>",
			"ram_role_arn":"<ROLE_ARN>",
			"ram_session_name":"<ROLE_SESSION_NAME>",
			"expired_seconds":3600
		}
	]
}

4. ECS インスタンスの RAM ロールを使用してクレデンシャル情報を取得する

前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは、ECS インスタンスの RAM ロール名を指定する ALIBABA_CLOUD_ECS_METADATA 環境変数の値を取得します。RAM ロールが存在する場合、アプリケーションはセキュリティ強化モードで ECS のメタデータサーバーを使用して、RAM ロールの STS トークンをデフォルトのクレデンシャルとして取得します。セキュリティ強化モードで例外が発生した場合、クレデンシャルツールは通常モードでアクセスクレデンシャルを取得します。 ALIBABA_CLOUD_IMDSV1_DISABLED 環境変数を構成して、例外処理ロジックを指定することもできます。環境変数の有効な値:

  1. false:クレデンシャルツールは通常モードでアクセスクレデンシャルの取得を続行します。

  2. true:例外がスローされ、クレデンシャルツールはセキュリティ強化モードでアクセスクレデンシャルの取得を続行します。

メタデータサーバーの構成によって、サーバーがセキュリティ強化モードをサポートするかどうかが決まります。

5. URI に基づいてクレデンシャル情報を取得する

前の手順でクレデンシャルが見つからない場合、クレデンシャルツールは、クレデンシャルの URI を指定する ALIBABA_CLOUD_CREDENTIALS_URI 環境変数の値を取得します。クレデンシャルの URI が存在する場合、アプリケーションはクレデンシャルの URI を使用して STS トークンをデフォルトのクレデンシャルとして取得します。

クレデンシャルを切り替える

次の方法を使用して、異なるクレデンシャルを使用してアプリケーションで異なる API オペレーションを呼び出すことができます。

複数のクレデンシャル クライアントを使用する

複数のクレデンシャル クライアントを初期化して、異なるクレデンシャルを異なるリクエスト クライアントに渡します。

package main

import (
	credentials "github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	config1 := new(credentials.Config).
		SetType("access_key").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	akCredential, err1 := credentials.NewCredential(config1)

	config2 := new(credentials.Config).
		SetType("sts").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))

	akCredential, err2 := credentials.NewCredential(config2)
}

参考資料