Alibaba Cloud SDK を使用する際、AccessKey ペアや Security Token Service (STS) トークンなどの認証情報は、Credentials ツールによって管理されます。このトピックでは、Credentials ツールがサポートする認証情報タイプと、その設定方法について説明します。
背景情報
認証情報とは、ユーザーが自身の ID を証明するために提供する一連の情報です。ユーザーがシステムにログインする際には、認証されるために正しい認証情報を提供する必要があります。一般的な認証情報タイプには、以下が含まれます。
Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの永続的な AccessKey (AK)。AK は、AccessKey ID と AccessKey Secret から構成されるキーペアです。
Alibaba Cloud RAM ロールのための一時的な Security Token Service (STS) トークン。これは、カスタムの生存時間 (TTL) とアクセス権限を持つ一時的な ID 認証情報です。詳細については、「STS とは」をご参照ください。
Bearer トークン。これは認証と権限付与のためのトークンタイプです。
前提条件
Credentials ツールを使用するには、Go バージョン 1.10.x 以降が必要です。
Alibaba Cloud SDK for Go V2.0 を使用します。詳細については、「IDE で Alibaba Cloud SDK for Go を使用する」をご参照ください。
Credentials ツールのインストール
すでに Credentials ツールをインストールしている場合は、このステップをスキップできます。すべての認証情報タイプがサポートされるように、最新バージョンの Credentials 依存関係パッケージを使用することを推奨します。公開されているすべてのバージョン情報は Credentials で確認できます。
Credentials ツールは、以下のいずれかの方法でインストールできます。
方法 1:
go getコマンドを実行して、ツールをダウンロードしてインストールできます。$ go get -u github.com/aliyun/credentials-go方法 2:
depを使用して依存関係パッケージを管理する場合は、次のコマンドを実行できます。dep ensure -add github.com/aliyun/credentials-go
Credentials ツールの設定パラメーター
Credentials ツールの構成パラメーターは、Config 構造体の github.com/aliyun/credentials-go/credentials パッケージで定義されています。認証情報タイプは、必須パラメーターの type によって指定されます。認証情報タイプを決定した後、そのタイプに適したパラメーターを選択できます。次の表では、type の有効な値と、各認証情報タイプでサポートされているパラメーターについて説明します。表では、√ は必須パラメーター、- はオプションのパラメーター、× はサポートされていないパラメーターを示します。
次の表に記載されていない認証情報タイプとパラメーターは、使用が推奨されなくなりました。
タイプ | access_key | sts | ram_role_arn | ecs_ram_role | oidc_role_arn | credentials_uri | bearer |
AccessKeyId:アクセス認証情報の ID。 | √ | √ | √ | × | × | × | × |
AccessKeySecret:アクセス認証情報のシークレット。 | √ | √ | √ | × | × | × | × |
SecurityToken:STS トークン。 | × | √ | - | × | × | × | × |
RoleArn:RAM ロールの Alibaba Cloud リソースネーム (ARN)。 | × | × | √ | × | √ | × | × |
RoleSessionName: カスタムのセッション名です。デフォルトのフォーマットは | × | × | - | × | - | × | × |
RoleName:RAM ロールの名前。 | × | × | × | - | × | × | × |
DisableIMDSv1: セキュアモードを強制するかどうかを指定します。デフォルト値は | × | × | × | - | × | × | × |
BearerToken:Bearer トークン。 | × | × | × | × | × | × | √ |
Policy:カスタム権限ポリシー。 | × | × | - | × | - | × | × |
RoleSessionExpiration:セッションの有効期限。デフォルト値は 3600 秒です。 | × | × | - | × | - | × | × |
OIDCProviderArn:OIDC IdP の ARN。 | × | × | × | × | √ | × | × |
OIDCTokenFilePath:OIDC トークンのファイルパス。 | × | × | × | × | √ | × | × |
ExternalId:ロールの外部 ID。このパラメーターは、Confused Deputy 問題を防ぐために使用されます。詳細については、「外部 ID を使用して Confused Deputy 問題を防ぐ」をご参照ください。 | × | × | - | × | × | × | × |
Url:認証情報の URI。このパラメーターには SetURLCredential(v string) を使用して値を割り当てる必要があります。 | × | × | × | × | × | √ | × |
STSEndpoint: STS のエンドポイントです。 VPC エンドポイントとパブリックネットワークエンドポイントがサポートされています。 有効な値のリストについては、「エンドポイント」をご参照ください。 デフォルト値は | × | × | - | × | - | × | × |
Timeout:HTTP リクエストの読み取りタイムアウト。デフォルト値は 5000 ミリ秒です。 | × | × | - | - | - | - | × |
ConnectTimeout:HTTP リクエストの接続タイムアウト。デフォルト値は 10000 ミリ秒です。 | × | × | - | - | - | - | × |
認証情報クライアントの初期化
以下のセクションでは、Credentials ツールを使用する方法を示すコード例を提供します。要件に応じてメソッドを選択できます。
AccessKey ペアは環境変数または設定ファイルに保存することを推奨します。
Credentials ツールを使用する際は、シングルトンパターンを使用することを推奨します。この方法により、組み込みの認証情報キャッシュ機能が有効になります。これにより、複数の API 呼び出しによるスロットリング問題を防ぎ、複数のインスタンスを作成することによるリソースの無駄を避けることができます。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。
方法 1:デフォルトの認証情報プロバイダーチェーンを使用する
パラメーターを渡さずに認証情報クライアントを初期化すると、Credentials ツールはデフォルトの認証情報プロバイダーチェーンを使用してクライアントを初期化します。デフォルトの認証情報の読み取りロジックの詳細については、「デフォルトの認証情報プロバイダーチェーン」をご参照ください。
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
// パラメーターを指定しないか、nil を渡します。
credential, err := credentials.NewCredential(nil)
config := &openapi.Config{}
config.Credential = credential
// config を使用してクラウドプロダクトクライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}API 呼び出しの例
方法 2:AK を使用する
Credentials ツールは、ご利用の AccessKey をアクセス認証情報として使用します。
Alibaba Cloud アカウントは、すべてのリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩すると、ご利用のシステムに重大なセキュリティ上の脅威をもたらします。Alibaba Cloud アカウントの AccessKey ペアの使用は推奨しません。
最小限の必要な権限が付与された RAM ユーザーの AccessKey ペアを使用することを推奨します。
import (
"fmt"
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"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
}
config := &openapi.Config{}
config.Credential = akCredential
// config を使用してクラウドプロダクトクライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}API 呼び出しの例
方法 3:STS トークンを使用する
Credentials ツールは、提供された静的な STS トークン をアクセス認証情報として使用します。
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"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 Secret を取得します。
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
}
config := &openapi.Config{}
config.Credential = stsCredential
// config を使用してクラウドプロダクトクライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}
API 呼び出しの例
方法 4:AK と RamRoleArn を使用する
このメソッドは STS トークンを使用して実装されています。RAM ロールの Amazon リソースネーム (ARN) を指定することで、開発者は Credentials ツールを使用して STS から STS トークンを取得できます。また、SetPolicy に値を割り当てて、RAM ロールをより限定的な権限セットに制限することもできます。
package main
import (
"fmt"
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"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 環境変数を使用して RoleArn を設定できます。
SetRoleArn("<RoleArn>").
// ロールセッションの名前。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して RoleSessionName を設定できます。
SetRoleSessionName("<RoleSessionName>").
// オプション。より小さな権限ポリシー。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
SetPolicy("<Policy>").
// オプション。セッションの有効期限。
SetRoleSessionExpiration(3600).
// オプション。ロールの外部 ID。このパラメーターは、ロールを表すために外部パーティによって提供され、Confused Deputy 問題を防ぐために使用されます。
SetExternalId("ExternalId").
// オプション。デフォルト値は sts.aliyuncs.com です。リージョン固有の STS ドメイン名を使用することを推奨します。ネットワーク接続を確保するために、地理的に近いリージョンを選択してください。
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
arnCredential, err := credentials.NewCredential(config)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = arnCredential
// config を使用してクラウドプロダクトクライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}
ExternalId の詳細については、「外部 ID を使用して Confused Deputy 問題を防ぐ」をご参照ください。
API 呼び出しの例
方法 5:インスタンス RAM ロールを使用する
ECS と ECI インスタンスはどちらもインスタンス RAM ロールのアタッチをサポートしています。これらのインスタンスで実行されるプログラムは、Credentials ツールを使用してロールの STS トークンを自動的に取得し、認証情報クライアントを初期化できます。
デフォルトでは、Credentials ツールはセキュアモード (IMDSv2) を使用して ECS メタデータサービスにアクセスし、アクセス認証情報を取得します。セキュアモードで例外が発生した場合、ツールは通常モードにフォールバックしてアクセス認証情報を取得します。また、disableIMDSv1 パラメーターまたは ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数を設定して、異なる例外処理ロジックを実行することもできます。
値が false (デフォルト) の場合、ツールは通常モードでアクセス認証情報の取得を続行します。
値が true の場合、アクセス認証情報はセキュアモードでのみ取得できることを意味し、例外がスローされます。
サーバー側が IMDSv2 をサポートするかどうかは、ご利用のサーバー設定に依存します。
さらに、環境変数 ALIBABA_CLOUD_ECS_METADATA_DISABLED=true を設定することで、ECS メタデータからの認証情報アクセスを無効にできます。
セキュアモードで一時的な ID 認証情報を取得するには、credentials-go のバージョンが 1.3.10 以降である必要があります。
ECS インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
ECS または ECI インスタンスに RAM ロールを付与する方法の詳細については、「RAM ロールを作成して ECS インスタンスに付与する」および「インスタンス RAM ロールを ECI インスタンスに付与する」をご参照ください。
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
)
func _main(args []*string) {
// EcsRamRole で Credentials クライアントを初期化します。
credentialsConfig := new(credentials.Config).
// 認証情報タイプ。
SetType("ecs_ram_role").
// オプション。ECS ロールの名前。このパラメーターを指定しない場合、ロール名は自動的に取得されます。リクエスト数を減らすために、このパラメーターを指定することを推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して RoleName を設定できます。
SetRoleName("<RoleName>")
// オプション。デフォルト値は false です。このパラメーターを true に設定すると、セキュアモードが強制されます。false に設定すると、システムはまずセキュアモードで認証情報を取得しようとします。試行が失敗した場合、システムは通常モード (IMDSv1) に切り替わります。
// credentialsConfig.SetDisableIMDSv1(true)
credentialClient, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = credentialClient
// config を使用してクラウドプロダクトクライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}
API 呼び出しの例
方法 6:OIDCRoleArn を使用する
OIDC 認証プロトコルを使用し、OIDC IdP の RAM ロールを作成している場合、OIDC IdP の ARN、OIDC トークン、および RAM ロールの ARN を Credentials ツールに渡すことができます。すると、システムは自動的に AssumeRoleWithOIDC 操作を呼び出して RAM ロールの STS トークンを取得し、このトークンをアクセス認証情報として使用します。この方法で取得した認証情報は自動更新をサポートしています。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。例えば、アプリケーションが RRSA 機能が有効になっている ACK クラスターで実行されている場合、Credentials ツールは Pod の環境変数から OIDC 設定情報を読み取り、AssumeRoleWithOIDC 操作を呼び出してサービスロールの STS トークンを取得し、このトークンを使用して関連する Alibaba Cloud サービスにアクセスします。
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
"os"
)
func main() {
config := new(credentials.Config).
SetType("oidc_role_arn").
// OIDC IdP の ARN。ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を使用して OidcProviderArn を設定できます。
SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
// OIDC トークンのファイルパス。ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を使用して OidcTokenFilePath を設定できます。
SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
// RAM ロールの ARN。ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して RoleArn を設定できます。
SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
// ロールセッションの名前。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して RoleSessionName を設定できます。
SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
// オプション。より小さな権限ポリシー。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
SetPolicy("<Policy>").
// オプション。セッションの有効期限。
SetRoleSessionExpiration(3600).
// オプション。デフォルト値は sts.aliyuncs.com です。リージョン固有の STS ドメイン名を使用することを推奨します。ネットワーク接続を確保するために、地理的に近いリージョンを選択してください。
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
oidcCredential, err := credentials.NewCredential(config)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = oidcCredential
// config を使用してクラウドプロダクトクライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}
API 呼び出しの例
方法 7:URI 認証情報を使用する
STS サービスをカプセル化し、その URI を公開することで、外部サービスは URI を通じて STS トークンを取得できます。これにより、AccessKey ペアなどの機密情報が漏洩するリスクが軽減されます。Credentials ツールは、提供された URI にアクセスして STS トークンを取得し、このトークンをアクセス認証情報として使用します。この方法で取得した認証情報は自動更新をサポートしています。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。
package main
import (
"github.com/aliyun/credentials-go/credentials"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
)
func main() {
config := new(credentials.Config).
SetType("credentials_uri").
// 認証情報の URI。フォーマットは http://local_or_remote_uri/ です。ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を使用して CredentialsUri を設定できます。
SetURLCredential("<CredentialsUri>")
uriCredential, err := credentials.NewCredential(config)
config := &openapi.Config{}
config.Credential = uriCredential
// config を使用してクラウドプロダクトクライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}
アドレスは以下の条件を満たす必要があります。
GET リクエストをサポートしている必要があります。
応答本文は以下の構造である必要があります。
{ "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
API 呼び出しの例
方法 8:Bearer トークンを使用する
現在、Bearer トークンで認証情報を初期化できるのは Cloud Call Center (CCC) のみです。
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
config := new(credentials.Config).
SetType("bearer").
// ご利用の Bearer トークンを入力します。
SetBearerToken("<BearerToken>")
bearerCredential, err := credentials.NewCredential(config)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = bearerCredential
// config を使用してクラウドプロダクトクライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}API 呼び出しの例
方法 9:CLIProfileCredentialsProvider を使用する
Alibaba Cloud CLI の認証情報設定ファイル (config.json) からアクセス認証情報を取得できます。
package main
import (
"github.com/aliyun/credentials-go/credentials"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials/providers"
)
func main() {
// CLIProfileCredentialsProvider
provider, err := providers.NewCLIProfileCredentialsProviderBuilder().
// オプション。認証情報の名前。このパラメーターは複数の方法で設定できます。優先順位は次のとおりです:明示的に指定された profileName > ALIBABA_CLOUD_PROFILE 環境変数で指定された profileName > config.json の現在のプロファイル。
WithProfileName("<PROFILE_NAME>").
// オプション。設定ファイルのパス。これは .json ファイルである必要があります。このパラメーターは複数の方法で設定できます。優先順位は次のとおりです:明示的に指定された profileFile > ALIBABA_CLOUD_CONFIG_FILE 環境変数で指定された profileFile > デフォルトのパス ~/.aliyun/config.json。
WithProfileFile("<PROFILE_FILE_PATH>").
Build()
if err != nil {
return
}
credential := credentials.FromCredentialsProvider("cli_profile", provider)
config := &openapi.Config{}
config.Credential = credential
// config を使用してクラウドプロダクトクライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}Alibaba Cloud CLI を使用するか、次のパスに config.json 構成ファイルを手動で作成することで、認証情報を構成できます:
Linux: `
~/.aliyun/config.jsonWindows: `
C:\Users\USER_NAME\.aliyun\config.json
コンテンツのフォーマットは次のとおりです。
{
"current": "<PROFILE_NAME>",
"profiles": [
{
"name": "<PROFILE_NAME>",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "<PROFILE_NAME1>",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name":"<PROFILE_NAME2>",
"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":"<PROFILE_NAME3>",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"<PROFILE_NAME4>",
"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":"<PROFILE_NAME5>",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name": "<PROFILE_NAME6>",
"mode": "CloudSSO",
"cloud_sso_sign_in_url": "https://******/login",
"access_token": "eyJraWQiOiJiYzViMzUwYy******",
"cloud_sso_access_token_expire": 1754316142,
"cloud_sso_access_config": "ac-00s1******",
"cloud_sso_account_id": "151266******"
}
]
}
config.json ファイルでは、mode パラメーターを使用して異なる認証情報を指定できます。
AK:ユーザーの AccessKey を認証情報として使用します。
StsToken:STS トークンを認証情報として使用します。
RamRoleArn:RAM ロールの ARN を使用して認証情報を取得します。
EcsRamRole:ECS インスタンスにアタッチされた RAM ロールを使用して認証情報を取得します。
OIDC:OIDC ARN と OIDC トークンを使用して認証情報を取得します。
ChainableRamRoleArn: ロールチェーンを使用します。
source_profileを使用してconfig.jsonファイル内の別の認証情報の名前を指定することで、新しい認証情報を取得します。CloudSSO:CloudSSO ユーザーが Alibaba Cloud CLI を使用して取得する認証情報。
説明CloudSSO 認証情報には、バージョン 1.4.7 以降の
github.com/aliyun/credentials-goが必要です。構成内容は、Alibaba Cloud CLI を使用してのみ取得できます。詳細については、「CLI を使用して CloudSSO にログインし、Alibaba Cloud リソースにアクセスする」をご参照ください。
設定が完了すると、Credentials ツールは `current` パラメーターで指定された認証情報名に基づいて認証情報クライアントを初期化します。
API 呼び出しの例
デフォルトの認証情報プロバイダーチェーン
開発環境と本番環境で使用する認証情報のタイプが異なる場合、通常は現在の環境に応じて異なる認証情報を取得するためのブランチコードを記述します。Credentials ツールのデフォルトの認証情報プロバイダーチェーンを使用すると、同じコードを使用しながら、外部構成によって異なる環境での認証情報の取得方法を制御できます。パラメーターを渡さずに NewCredential() を使用して認証情報クライアントを初期化すると、Alibaba Cloud SDK は次の順序で認証情報を検索しようとします。
1. 環境変数
システムプロパティに認証情報が見つからない場合、Credentials ツールは環境変数をチェックします。
ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が存在し、空でない場合、AccessKey ペアがデフォルトの認証情報として使用されます。
ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および ALIBABA_CLOUD_SECURITY_TOKEN 環境変数がすべて設定されている場合、STS トークンがデフォルトの認証情報として使用されます。
2. OIDC RAM ロール
認証情報が見つからない場合、Credentials ツールは OIDC RAM ロールに関連する次の環境変数をチェックします。
ALIBABA_CLOUD_ROLE_ARN:RAM ロールの ARN。
ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC IdP の ARN。
ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC トークンファイルのパス。
上記の 3 つの環境変数が存在し、空でない場合、Credentials ツールはこれらの環境変数の値を使用して STS の AssumeRoleWithOIDC 操作を呼び出し、STS トークンをデフォルトの認証情報として取得します。
3. config.json 設定ファイル
優先度の高い資格情報が見つからない場合、Credentials ツールは config.json 構成ファイルの読み込みを試みます。この構成ファイルのデフォルトの完全なパスは次のとおりです。
Linux/macOS: `
~/.aliyun/config.jsonWindows: `
C:\Users\USER_NAME\.aliyun\config.json
バージョン github.com/aliyun/credentials-go@1.4.4 以降では、ALIBABA_CLOUD_CONFIG_FILE 環境変数を使用して config.json ファイルのパスをカスタマイズできます。この環境変数は、デフォルトのパスよりも優先されます。
この方法でアクセス認証情報を設定するには、Alibaba Cloud CLI を使用して認証情報を設定するか、対応するパスに config.json ファイルを手動で作成します。以下にコンテンツのフォーマットの例を示します。
{
"current": "<PROFILE_NAME>",
"profiles": [
{
"name": "<PROFILE_NAME>",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "<PROFILE_NAME1>",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name": "<PROFILE_NAME2>",
"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": "<PROFILE_NAME3>",
"mode": "EcsRamRole",
"ram_role_name": "<RAM_ROLE_ARN>"
},
{
"name": "<PROFILE_NAME4>",
"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": "<PROFILE_NAME5>",
"mode": "ChainableRamRoleArn",
"source_profile": "<PROFILE_NAME>",
"ram_role_arn": "<ROLE_ARN>",
"ram_session_name": "<ROLE_SESSION_NAME>",
"expired_seconds": 3600
},
{
"name": "<PROFILE_NAME6>",
"mode": "CloudSSO",
"cloud_sso_sign_in_url": "https://******/login",
"access_token": "eyJraWQiOiJiYzViMzUwYy******",
"cloud_sso_access_token_expire": 1754316142,
"cloud_sso_access_config": "ac-00s1******",
"cloud_sso_account_id": "151266******"
},
{
"name": "<PROFILE_NAME7>",
"mode": "OAuth",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>",
"region_id": "<REGION_ID>",
"output_format": "json",
"language": "<zh|en>",
"sts_expiration": "<STS_EXPIRATION>",
"oauth_access_token": "<OAUTH_ACCESS_TOKEN>",
"oauth_refresh_token": "<OAUTH_REFRESH_TOKEN>",
"oauth_access_token_expire": 1754316142,
"oauth_site_type": "<CN|EN>"
}
]
}config.json ファイルでは、mode パラメーターを使用して異なる認証情報を指定できます。
AK:ユーザーの AccessKey を認証情報として使用します。
StsToken:STS トークンを認証情報として使用します。
RamRoleArn:RAM ロールの ARN を使用して認証情報を取得します。
EcsRamRole:ECS インスタンスにアタッチされた RAM ロールを使用して認証情報を取得します。
OIDC:OIDC ARN と OIDC トークンを使用して認証情報を取得します。
ChainableRamRoleArn: ロールチェーンを使用します。
source_profileを使用してconfig.jsonファイル内の別の資格情報の名前を指定し、新しい資格情報を取得します。OAuth:CLI を使用して OAuth でログインして取得した認証情報。
CloudSSO:CloudSSO ユーザーが Alibaba Cloud CLI を使用して取得する認証情報。
OAuth 認証情報には、
github.com/aliyun/credentials-goのバージョン 1.4.8 以降が必要です。 構成内容は、Alibaba Cloud CLI を使用してのみ取得できます。 詳細については、「CLI を使用して OAuth 認証情報を取得する」をご参照ください。CloudSSO 資格情報には、
github.com/aliyun/credentials-goのバージョン 1.4.7 以降が必要です。構成内容は、Alibaba Cloud CLI を使用してのみ取得できます。詳細については、「CLI を使用して CloudSSO にログインし、Alibaba Cloud リソースにアクセスする」をご参照ください。
設定が完了すると、Credentials ツールは設定ファイル内の current パラメーターで指定された認証情報名に基づいて認証情報クライアントを初期化します。また、ALIBABA_CLOUD_PROFILE 環境変数を使用して認証情報名を指定することもできます。例えば、ALIBABA_CLOUD_PROFILE の値を client1 に設定できます。
4. インスタンス RAM ロール
より優先度の高い認証情報が見つからない場合、Credentials ツールは ECS インスタンスにアタッチされた RAM ロールから認証情報を取得しようとします。デフォルトでは、Credentials ツールはセキュアモード (IMDSv2) を使用して ECS メタデータサービスにアクセスし、インスタンス RAM ロールの STS トークンをデフォルトの認証情報として取得します。プログラムは自動的に ECS メタデータサービスにアクセスして RoleName を取得し、その後認証情報を取得するため、2 つのリクエストが含まれます。これを 1 つのリクエストに減らすには、ALIBABA_CLOUD_ECS_METADATA 環境変数を直接設定してインスタンス RAM ロール名を指定できます。セキュアモードで例外が発生した場合、ツールは通常モードにフォールバックしてアクセス認証情報を取得します。また、ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数を設定して、異なる例外処理ロジックを実行することもできます。
値が false の場合、ツールは通常モードでアクセス認証情報の取得を続行します。
値が true の場合、アクセス認証情報はセキュアモードでのみ取得できることを意味し、例外がスローされます。
サーバー側が IMDSv2 をサポートするかどうかは、ご利用のサーバー設定に依存します。
さらに、環境変数 ALIBABA_CLOUD_ECS_METADATA_DISABLED=true を設定することで、ECS メタデータからの認証情報アクセスを無効にできます。
ECS インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
ECS または ECI インスタンスに RAM ロールを付与する方法の詳細については、「RAM ロールを作成して ECS インスタンスに付与する」および「インスタンス RAM ロールを ECI インスタンスに付与する」をご参照ください。
5. Credentials ツール URI
認証情報が見つからない場合、Credentials ツールは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数をチェックします。この変数が存在し、有効な URI を指している場合、Credentials ツールはこの URI にアクセスして STS トークンをデフォルトの認証情報として取得します。
セッションベースの認証情報の自動更新メカニズム
セッション認証情報には、ram_role_arn、ecs_ram_role、oidc_role_arn、および credentials_uri が含まれます。このタイプの認証情報には、Credentials ツールに組み込まれた自動更新メカニズムがあります。認証情報クライアントが初めて認証情報を取得した後、Credentials ツールはその認証情報をキャッシュに保存します。後続のリクエストでは、同じ認証情報クライアントインスタンスが自動的にキャッシュから認証情報をフェッチします。キャッシュ内の認証情報が期限切れの場合、認証情報クライアントインスタンスは認証情報を再取得し、キャッシュを更新します。
`ecs_ram_role` 認証情報の場合、Credentials ツールは認証情報が期限切れになる 15 分前にキャッシュを更新します。
次の例では、シングルトンパターンで認証情報クライアントを作成します。クライアントは異なる時点で認証情報を取得して自動更新メカニズムを検証し、OpenAPI 操作を呼び出して取得した認証情報が有効であることを確認します。
package main
import (
"fmt"
"log"
"os"
"sync"
"time"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
"github.com/aliyun/credentials-go/credentials"
)
// Credential は、Alibaba Cloud 認証情報インスタンスを管理するために使用されるシングルトン構造体です。
type Credential struct {
instance credentials.Credential
once sync.Once
}
var credentialInstance = &Credential{}
func GetCredentialInstance() credentials.Credential {
credentialInstance.once.Do(func() {
cfg := &credentials.Config{
Type: tea.String("ram_role_arn"),
AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
RoleArn: tea.String(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")),
RoleSessionName: tea.String("RamRoleArnTest"),
RoleSessionExpiration: tea.Int(3600),
}
var err error
credentialInstance.instance, err = credentials.NewCredential(cfg)
if err != nil {
log.Fatalf("Credential initialization failed: %v", err)
}
})
return credentialInstance.instance
}
// EcsClient は、ECS クライアントインスタンスを管理するために使用されるシングルトン構造体です。
type EcsClient struct {
instance *ecs20140526.Client
once sync.Once
}
var ecsClientInstance = &EcsClient{}
func GetEcsClientInstance(cred credentials.Credential) *ecs20140526.Client {
ecsClientInstance.once.Do(func() {
cfg := &openapi.Config{
Endpoint: tea.String("ecs.cn-hangzhou.aliyuncs.com"),
Credential: cred,
}
var err error
ecsClientInstance.instance, err = ecs20140526.NewClient(cfg)
if err != nil {
log.Fatalf("ECS client initialization failed: %v", err)
}
})
return ecsClientInstance.instance
}
// メインのタスクを実行します。
func runTask() {
cred := GetCredentialInstance()
credentialModel, err := cred.GetCredential()
if err != nil {
log.Printf("Failed to get credential: %v", err)
return
}
fmt.Println(time.Now())
fmt.Printf("AK ID: %s, AK Secret: %s, STS Token: %s\n",
*credentialModel.AccessKeyId,
*credentialModel.AccessKeySecret,
*credentialModel.SecurityToken)
ecsClient := GetEcsClientInstance(cred)
req := &ecs20140526.DescribeRegionsRequest{}
runtime := &util.RuntimeOptions{}
resp, err := ecsClient.DescribeRegionsWithOptions(req, runtime)
if err != nil {
log.Printf("ECS API call failed: %v", err)
return
}
fmt.Printf("Invoke result: %d\n", *resp.StatusCode)
}
func main() {
done := make(chan bool)
// スケジュールされたタスクを実行するための goroutine を開始します。
go func() {
tick := time.NewTicker(1 * time.Second)
defer tick.Stop()
executionCount := 0
delays := []time.Duration{0, 600, 3600, 100} // 遅延時間(秒)。
for {
select {
case <-tick.C:
if executionCount < len(delays) {
delay := delays[executionCount]
time.Sleep(delay * time.Second)
runTask()
executionCount++
} else {
close(done)
return
}
}
}
}()
<-done
fmt.Println("All tasks completed. Exiting...")
}

以下のセクションでは、ログ結果を分析します。
最初の呼び出しでは、認証情報はキャッシュされていません。そのため、システムは設定に基づいて認証情報を取得します。認証情報が取得された後、それらはキャッシュに保存されます。
2 回目の呼び出しで使用される認証情報は、最初のものと同じです。これは、2 回目の呼び出しの認証情報がキャッシュから取得されたことを示しています。
3 回目の呼び出しでは、キャッシュ内の認証情報が期限切れになっています。これは、認証情報の有効期間 (`RoleSessionExpiration`) が 3,600 秒に設定されており、3 回目の呼び出しが最初の呼び出しから 4,200 秒後に発生するためです。したがって、SDK は自動更新メカニズムに基づいて新しい認証情報を再取得し、新しい認証情報をキャッシュに保存します。
4 回目の呼び出しで使用される認証情報は、3 回目の呼び出しで取得された新しい認証情報と同じです。これは、キャッシュ内の認証情報が期限切れになった後に更新されたことを示しています。
関連ドキュメント
RAM の詳細については、「用語」をご参照ください。
AccessKey ペアの作成方法の詳細については、「AccessKey ペアの作成」をご参照ください。
プログラムで RAM ユーザー、AccessKey ペア、RAM ロール、およびアクセスポリシーを作成し、権限を付与する方法の詳細については、「RAM SDK の概要」をご参照ください。
プログラムでロールを引き受ける方法の詳細については、「STS SDK の概要」をご参照ください。
RAM および STS 関連の API 操作の詳細については、「API リファレンス」をご参照ください。