Alibaba Cloud SDK は、認証情報ツールを使用して、AccessKey や STS トークンなどの認証情報を一元管理します。このトピックでは、サポートされている認証情報の種類とその設定方法について説明します。
背景情報
認証情報とは、ユーザーのアイデンティティを検証するための一連の情報です。 システムにサインインするには、有効な認証情報を提供する必要があります。 一般的な認証情報の種類は、次のとおりです。
-
AccessKey は、Alibaba Cloud アカウントまたは RAM ユーザーの長期的な認証情報です。 AccessKey ID と AccessKey secret で構成されるキーペアです。
-
STS トークンは、RAM ロール用の一時的なアクセス認証情報です。 設定可能な有効期間とアクセス権限が含まれます。 詳細については、「STSとは」をご参照ください。
-
ベアラートークンは、認証と認可に使用される認証情報です。
前提条件
-
クレデンシャルツールには Go 1.10.x 以降が必要です。
-
Alibaba Cloud SDK の V2.0 を使用する必要があります。詳細については、「IDE で Alibaba Cloud Go SDK を使用する」をご参照ください。
Alibaba Cloud Credentials のインストール
Alibaba Cloud Credentials がすでにインストールされている場合、このステップはスキップできます。すべての認証情報の種類を完全にサポートするために、最新の Alibaba Cloud Credentials の依存関係を使用することを推奨します。すべてのリリースバージョンについては、Alibaba Cloud Credentials をご参照ください。
Alibaba Cloud Credentials は、以下のいずれかの方法でインストールできます。
-
方法 1:
go getを使用して Alibaba Cloud Credentials をインストールします。$ go get -u github.com/aliyun/credentials-go -
方法 2:
depを使用して依存関係を管理する場合は、次のコマンドを実行します。dep ensure -add github.com/aliyun/credentials-go
クレデンシャルツール:パラメーター
github.com/aliyun/credentials-go/credentials パッケージの Config 構造体で、クレデンシャルツールの設定パラメーターを定義します。必須パラメーターの 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:ベアラートークン。 |
× |
× |
× |
× |
× |
× |
√ |
|
Policy:カスタムポリシー。 |
× |
× |
- |
× |
- |
× |
× |
|
RoleSessionExpiration:セッションの有効期限 (秒単位)。デフォルト値は 3,600 です。 |
× |
× |
- |
× |
- |
× |
× |
|
OIDCProviderArn:OpenID Connect (OIDC) ID プロバイダー (IdP) の Alibaba Cloud リソースネーム (ARN)。 |
× |
× |
× |
× |
√ |
× |
× |
|
OIDCTokenFilePath:OIDC トークンファイルへのパス。 |
× |
× |
× |
× |
√ |
× |
× |
|
ExternalId:ロールの外部 ID。この ID は、混乱した代理問題を防ぐのに役立ちます。詳細については、「ExternalId を使用して混乱した代理問題を防止する」をご参照ください。 |
× |
× |
- |
× |
× |
× |
× |
|
Url:認証情報の URI。この値は、SetURLCredential(v string) メソッドを使用して設定します。 |
× |
× |
× |
× |
× |
√ |
× |
|
STSEndpoint:STS エンドポイント。このパラメーターは、VPC エンドポイントとパブリックエンドポイントの両方をサポートします。有効な値のリストについては、「エンドポイント」をご参照ください。デフォルト値は |
× |
× |
- |
× |
- |
× |
× |
|
Timeout:HTTP 読み取りタイムアウト (ミリ秒単位)。デフォルト値は 5,000 です。 |
× |
× |
- |
- |
- |
- |
× |
|
ConnectTimeout:HTTP 接続タイムアウト (ミリ秒単位)。デフォルト値は 10,000 です。 |
× |
× |
- |
- |
- |
- |
× |
クレデンシャルクライアントの初期化
前のセクションでは、Credentials ツールがサポートする認証情報の種類と設定パラメーターを説明しました。以降のセクションでは、このツールの使用方法を示すコード例を紹介します。シナリオに最も適した方法を選択してください。
-
プロジェクトに AccessKey をハードコーディングすると、セキュリティリスクが生じます。リポジトリの権限が適切に管理されていない場合、アカウント内のすべてのリソースが公開される可能性があります。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
// クラウド製品クライアントを初期化するコードは省略されています。詳細については、API 呼び出しの例を参照してください。
}
API 呼び出しの例
方法 2:AccessKey
Credentials ツールは、指定されたAccessKey をアクセス認証情報として使用します。
Alibaba Cloud アカウント (ルートアカウント) は、そのすべてのリソースに対する完全な権限を持っているため、AK が公開されると重大なセキュリティリスクが生じます。ルートアカウントの AK は使用しないでください。
最小権限を持つ RAM ユーザーの AK を使用してください。
package main
import (
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
credentialsConfig := 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(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = akCredential
// クラウド製品クライアントを初期化するコードは省略されています。詳細については、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() {
credentialsConfig := 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")).
// 環境変数からセキュリティトークンを取得します。
SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))
stsCredential, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = stsCredential
// クラウド製品クライアントの初期化コードは省略されています。詳細は、API 呼び出しのサンプルを参照してください。
}
API 呼び出し
方法 4: AK と RamRoleArn
このメソッドは内部的に STS トークンを使用します。RAM ロールの Alibaba Cloud リソースネーム (ARN) を指定することで、認証情報ツールは 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() {
credentialsConfig := 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>").
// オプション。一時的な認証情報の権限をさらに制限するインラインポリシーです。例: `{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}`
SetPolicy("<Policy>").
// オプション。セッションの有効期限 (秒単位) です。
SetRoleSessionExpiration(3600).
// オプション。混乱した使節の問題を防ぐために使用される外部 ID です。
SetExternalId("ExternalId").
// オプション。STS エンドポイントです。デフォルトは sts.aliyuncs.com です。ネットワークパフォーマンスを向上させるには、アプリケーションに近いリージョン固有のエンドポイントを使用します。
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
arnCredential, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = arnCredential
// この例では、クライアントの初期化コードは省略されています。詳細については、API 呼び出しの例をご参照ください。
}
外部 ID の詳細については、「外部 ID を使用して混乱した使節の問題を防止する」をご参照ください。
API の例
方法 5: ECS インスタンスの RAM ロール
ECS および ECI インスタンスにインスタンス RAM ロールをアタッチできます。これらのインスタンス上のアプリケーションは、認証情報ツールを使用して STS トークンを自動的に取得し、認証情報クライアントを初期化できます。
デフォルトでは、認証情報ツールはセキュリティ強化モード (IMDSv2) で ECS メタデータサーバーにアクセスします。エラーが発生した場合、ツールは自動的に通常モードにフォールバックし、アクセス認証情報を取得します。このフォールバック動作は、disableIMDSv1 パラメーターまたは ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数を設定することで制御できます:
-
false(デフォルト) に設定した場合、ツールは通常モードにフォールバックします。 -
trueに設定した場合、ツールはセキュリティ強化モードのみを使用し、失敗した場合は例外をスローします。
IMDSv2 のサポートは、サーバーの設定に依存します。
さらに、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定することで、ECS インスタンスメタデータ経由での認証情報アクセスを無効にできます。
-
セキュリティ強化モードを使用して STS トークンを取得するには、
credentials-goバージョン 1.3.10 以降が必要です。 -
ECS インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
-
RAM ロールを ECS または ECI インスタンスに付与するには、「ステップ 1: RAM ロールの作成」および「インスタンス 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) {
// ECS RAM ロールを使用して認証情報クライアントを初期化します。
credentialsConfig := new(credentials.Config).
// 認証情報の種類。
SetType("ecs_ram_role").
// オプション。ECS RAM ロールの名前。空のままにすると、名前は自動的に取得されます。API コールを減らすには、このパラメーターを設定します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して設定することもできます。
SetRoleName("<RoleName>")
// オプション、デフォルトは false です。`true` の値は、セキュリティ強化モード (IMDSv2) を強制します。`false` に設定すると、SDK はまずセキュリティ強化モードで認証情報を取得しようとし、試行が失敗した場合は通常モード (IMDSv1) にフォールバックします。
// credentialsConfig.SetDisableIMDSv1(true)
credentialClient, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = credentialClient
// この設定オブジェクトでクラウド製品クライアントを初期化するコードは省略されています。詳細については、API コール例をご参照ください。
}
API 呼び出しの例
方法 6:OIDCRoleArn の使用
OIDC を使用して認証を行い、OIDC ID プロバイダーの RAM ロールを作成している場合、OIDC プロバイダー ARN、OIDC トークンファイルパス、および RAM ロール ARN を Credentials ツールに指定します。その後、ツールは自動的にAssumeRoleWithOIDC API を呼び出して、RAM ロールの STS トークンを取得し、アクセス認証情報として使用します。この方法で取得した認証情報は自動更新をサポートします。詳細については、「セッション認証情報の自動更新」をご参照ください。たとえば、アプリケーションがRRSA が有効になっている Container Service for Kubernetes (ACK) クラスター内で実行されている場合、Credentials ツールはポッドの環境変数から OIDC 設定を読み取り、AssumeRoleWithOIDC API を呼び出して STS トークンを取得できます。その後、この 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() {
credentialsConfig := new(credentials.Config).
SetType("oidc_role_arn").
// OIDC プロバイダー ARN。ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を使用して設定できます。
SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
// OIDC トークンファイルパス。ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を使用して設定できます。
SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
// RAM ロール ARN。ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
// ロールセッション名。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
// オプション。 権限をさらに制限するインラインポリシーを指定します。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
SetPolicy("<Policy>").
// オプション。 セッションの有効期限を秒単位で指定します。
SetRoleSessionExpiration(3600).
// オプション。 STS エンドポイント。デフォルトは sts.aliyuncs.com です。ネットワーク接続を向上させるには、リージョン固有のエンドポイントを使用してください。
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
oidcCredential, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = oidcCredential
// config オブジェクトを使用してクラウド製品のクライアントを初期化するコードは省略されています。詳細については、「API コールの例」をご参照ください。
}
API の例
メソッド 7: URI 認証情報の使用
Security Token Service (STS) をサービス URI でカプセル化することで、外部サービスが AK などの機密情報を公開せずに STS トークンを取得できるようになります。その後、Credentials ツールはこの URI を使用して STS トークンを取得し、アクセス認証情報として使用します。この方法で取得した認証情報は自動更新をサポートします。詳細については、「セッション認証情報の自動更新」をご参照ください。
package main
import (
"github.com/aliyun/credentials-go/credentials"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
)
func main() {
credentialsConfig := new(credentials.Config).
SetType("credentials_uri").
// 認証情報 URI です。フォーマット: http://local_or_remote_uri/。 ALIBABA_CLOUD_CREDENTIALS_URI 環境変数で設定することも可能です。
SetURLCredential("<CredentialsUri>")
uriCredential, err := credentials.NewCredential(credentialsConfig)
config := &openapi.Config{}
config.Credential = uriCredential
// 簡潔にするため、クラウド製品のクライアント初期化コードは省略しています。詳細については、「API 呼び出しのサンプル」をご参照ください。
}
URI は以下に準拠する必要があります。
-
GET リクエストをサポートします。
-
レスポンスボディの構造は次のとおりです:
{ "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
API の例
方法 8:ベアラートークンの使用
ベアラートークンによる認証情報の初期化は、 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() {
credentialsConfig := new(credentials.Config).
SetType("bearer").
// ベアラートークンを入力します。
SetBearerToken("<BearerToken>")
bearerCredential, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = bearerCredential
// この例では、クライアントの初期化コードは省略されています。完全な実装については、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_CONFIG_FILE 環境変数 > config.json 内の 'current' プロファイル。
WithProfileName("<PROFILE_NAME>").
// オプション。設定ファイルのパスを指定します (.json ファイルであること)。解決の優先順位は次のとおりです: 指定された profileFile > ALIBABA_CLOUD_CONFIG_FILE 環境変数 > デフォルトパス ~/.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 オブジェクトでクラウド製品クライアントを初期化するコードは、簡潔にするために省略されています。
}
Alibaba Cloud CLI を使用して認証情報を設定するか、次のパスに config.json 設定ファイルを手動で作成できます:
-
Linux:
~/.aliyun/config.json -
Windows:
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_NAME>"
},
{
"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:アクセスキーを使用します。
-
StsToken:STS トークンを使用します。
-
RamRoleArn:ARN を使用して RAM ロールを引き受け、認証情報を取得します。
-
EcsRamRole:ECS インスタンスにアタッチされた RAM ロールを引き受け、認証情報を取得します。
-
OIDC:OIDC プロバイダーの ARN と OIDC トークンを使用して認証情報を取得します。
-
ChainableRamRoleArn:ロールチェーンを使用します。
source_profileを使用してconfig.json設定ファイル内の他の認証情報の名前を指定し、新しい認証情報を取得します。 -
CloudSSO:CloudSSO ユーザーが Alibaba Cloud CLI を通じて取得した認証情報を使用します。
説明CloudSSO 認証情報には、
github.com/aliyun/credentials-goのバージョン 1.4.7 以降が必要です。設定は Alibaba Cloud CLI を使用してのみ取得できます。詳細については、「CLI を使用して CloudSSO にログインし、Alibaba Cloud リソースにアクセスする」をご参照ください。
設定が完了すると、プロバイダーは指定されたプロファイル名に基づいて認証情報を初期化します。
API 呼び出しの例
デフォルトの認証情報プロバイダーチェーン
開発環境と本番環境で必要な認証情報の種類が異なる場合、現在の環境に基づいて認証情報を取得する条件分岐コードを記述するのが一般的です。デフォルトの認証情報プロバイダーチェーンを使用すると、このプロセスを簡素化できます。単一のコードベースを使用しつつ、外部設定で認証情報の取得を制御できます。パラメーターを指定せずに NewCredential() を呼び出して認証情報クライアントを初期化すると、Alibaba Cloud SDK は次の順序で認証情報を検索します。
1. 環境変数
システムプロパティで認証情報が見つからない場合、プロバイダーチェーンは次に環境変数を確認します。
-
ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET が設定されており、空でない場合、プロバイダーチェーンはそれらをデフォルトの認証情報として使用します。
-
ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET と ALIBABA_CLOUD_SECURITY_TOKEN も設定されている場合、プロバイダーチェーンは STS トークンをデフォルトの認証情報として使用します。
2. OIDC RAM ロール
認証情報が見つからない場合、プロバイダーチェーンは OIDC RAM ロールに関連する次の環境変数を確認します:
-
ALIBABA_CLOUD_ROLE_ARN: RAM ロールの ARN。
-
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDC プロバイダーの ARN。
-
ALIBABA_CLOUD_OIDC_TOKEN_FILE: OIDC トークンのファイルパス。
3 つの環境変数がすべて設定されており、空でない場合、プロバイダーチェーンはこれらの値を使用して Security Token Service (STS) の AssumeRoleWithOIDC API を呼び出して、STS トークンを取得します。
3. config.json ファイル
優先順位の高い認証情報が見つからない場合、Credentials ツールは config.json ファイルを読み込みます。このファイルのデフォルトパスは次のとおりです:
-
Linux/macOS:
~/.aliyun/config.json -
Windows:
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_NAME>"
},
{
"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: ユーザーのアクセスキーを認証情報として使用します。
-
StsToken: STS トークンを認証情報として使用します。
-
RamRoleArn: RAM ロール ARN を使用して認証情報を取得します。
-
EcsRamRole: ECS インスタンスに割り当てられた RAM ロールを使用して認証情報を取得します。
-
OIDC: OIDC プロバイダー ARN と OIDC トークンを使用して認証情報を取得します。
-
ChainableRamRoleArn: ロールチェーンを実装します。
source_profileパラメーターを使用して、config.jsonファイル内の別のプロファイルを指定し、そこから新しい認証情報を取得します。 -
OAuth: Alibaba Cloud CLI を使用して OAuth でログインし、取得した認証情報を使用します。
-
CloudSSO: Alibaba Cloud CLI を使用して CloudSSO ユーザーが取得した認証情報を使用します。
-
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 を使用してのみ取得できます。詳細については、「Alibaba Cloud CLI を使用して CloudSSO にログオンし、Alibaba Cloud リソースにアクセスする」をご参照ください。
設定後、Credentials は設定ファイルの current フィールドで指定されたプロファイルを使用してクライアントを初期化します。また、 ALIBABA_CLOUD_PROFILE 環境変数を設定してプロファイルを指定することもできます。たとえば、ALIBABA_CLOUD_PROFILE の値を client1 に設定します。
4. ECS インスタンス RAM ロール
優先順位の高い認証情報が見つからない場合、Credentials は ECS インスタンスに割り当てられている RAM ロールから認証情報を取得します。デフォルトでは、Credentials は IMDSv2 を使用して ECS メタデータサービスにアクセスし、ECS インスタンス RAM ロールの STS トークンを取得します。このプロセスには 2 つのリクエストが含まれます。1 つ目はメタデータサービスからロール名を取得するためのリクエストで、2 つ目は認証情報を取得するためのリクエストです。これを 1 つのリクエストに減らすには、ALIBABA_CLOUD_ECS_METADATA 環境変数を設定して、インスタンス RAM ロール名を直接指定します。IMDSv2 の使用中にエラーが発生した場合、Credentials は自動的に IMDSv1 にフォールバックします。ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数を設定することで、このフォールバック動作を制御できます:
-
falseに設定すると、IMDSv2 リクエストが失敗した場合にツールは IMDSv1 にフォールバックして認証情報を取得します。 -
trueに設定すると、ツールは IMDSv2 のみを使用します。リクエストが失敗した場合は例外がスローされます。
サーバーが IMDSv2 をサポートするかどうかは、サーバー設定に依存します。
ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定して、ECS メタデータサービスからの認証情報アクセスを無効化することもできます。
-
ECS インスタンスメタデータ の詳細については、「インスタンスメタデータ」をご参照ください。
-
ECS インスタンスまたは ECI インスタンスに RAM ロールを付与する手順については、「ステップ 1: RAM ロールを作成する」および「ECI インスタンスにインスタンス RAM ロールを付与する」をご参照ください。
5. 認証情報 URI
認証情報が見つからない場合、プロバイダーチェーンは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を確認します。この環境変数に有効な URI が設定されている場合、チェーンはその URI にアクセスして STS トークンを取得します。
セッション認証情報の自動更新
ram_role_arn、ecs_ram_role、oidc_role_arn、credentials_uri などのセッション認証情報の種類は、認証情報プロバイダーに組み込まれたメカニズムにより自動更新をサポートします。認証情報クライアントが初めて認証情報を取得すると、プロバイダーはそれをキャッシュに保存します。以降のオペレーションでは、同じクライアントインスタンスがこのキャッシュから認証情報を自動的に取得します。キャッシュされた認証情報の有効期限が切れている場合、クライアントインスタンスは新しい認証情報を取得してキャッシュを更新します。
ecs_ram_role 認証情報の場合、認証情報プロバイダーは有効期限の 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.comcom/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("Failed to initialize credential: %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("Failed to initialize ECS client: %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("Failed to call ECS API: %v", err)
return
}
fmt.Printf("Call Result: %d\n", *resp.StatusCode)
}
func main() {
done := make(chan bool)
// スケジュールされたタスクを実行するゴルーチンを開始します。
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...")
}
2025-05-29 10:56:24.7142698 +0800 CST m=+1.418627901
AK ID: STS.NXFN xxx 33d7Da, AK Secret: 3QdoQASHSyt xxx UGNjZaHsEGXZXc, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5vZBf3Biotj1o6MQGjFgTI2eLwfi/Lvgzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7VsDs194Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx m5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAvw3VhNiQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx D2hT+Bi3HLQztLtlrnMQdpz0agAFDeioHfrugVbFZyY9ggw28Pyx4ckcndsp1cWIU/kwT5HYClH6X7ArciY+H1V01Nh1W7dDFIiwn5htgzQkn1K2xXKA1SNzCjy076rXe7F+BNGES3mUPuTTk
irb467Kb6f3SHj7 xxx J6DPHSj/VzDSAA
Call Result: 200
2025-05-29 11:06:25.3225563 +0800 CST m=+602.026914401
AK ID: STS.NXFN xxx 33d7Da, AK Secret: 3QdoQASHSyt xxx UGNjZaHsEGXZXc, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5vZBf3Biotj1o6MQGjFgTI2eLwfi/Lvgzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7VsDs194Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx m5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAvw3VhNiQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx D2hT+Bi3HLQztLtlrnMQdpz0agAFDeioHfrugVbFZyY9ggw28Pyx4ckcndsp1cWIU/kwT5HYClH6X7ArciY+H1V01Nh1W7dDFIiwn5htgzQkn1K2xXKA1SNzCjy076rXe7F+BNGES3mUPuTTk
irb467Kb6f3SHj7 xxx J6DPHSj/VzDSAA
Call Result: 200
2025-05-29 12:06:26.039859 +0800 CST m=+4202.744217101
AK ID: STS.NWDS xxx 73kVg5u, AK Secret: C3tJCLkszB3 xxx PHGcUroGruw8D, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5TxGOKBjrYY1ZCEWmrFr2YUO7xHuaKelzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7Vtz5F96Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx 5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAsQnUp9tQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx 2hT+Bi3HLQztcMoybMQdpz0agAExoac2PSXrXSXyh4J+ekl0xNIztOFEAJJ2qTkuUgP1AKZIsZYdnX+yHJ1XJpD/yd6pKCEmUSzBwR+Q+S1BmhDANmVRzwUG8QJwxD6bTEvjUwhpGUOKLJL6b
FoBpJJ4WDZRliiw0 xxx y8sGj81a/iiAA
Call Result: 200
2025-05-29 12:08:06.3556621 +0800 CST m=+4303.060020201
AK ID: STS.NWDS xxx 73kVg5u, AK Secret: C3tJCLkszB3 xxx PHGcUroGruw8D, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5TxGOKBjrYY1ZCEWmrFr2YUO7xHuaKelzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7Vtz5F96Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx 5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAsQnUp9tQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx 2hT+Bi3HLQztcMoybMQdpz0agAExoac2PSXrXSXyh4J+ekl0xNIztOFEAJJ2qTkuUgP1AKZIsZYdnX+yHJ1XJpD/yd6pKCEmUSzBwR+Q+S1BmhDANmVRzwUG8QJwxD6bTEvjUwhpGUOKLJL6b
FoBpJJ4WDZRliiw0 xxx y8sGj81a/iiAA
Call Result: 200
All tasks completed. Exiting...
ログ出力に基づく分析:
-
1 回目の呼び出しでは、キャッシュは空です。システムは設定に基づいて認証情報を取得してキャッシュに保存します。
-
2 回目の呼び出しでは 1 回目と同じ認証情報が使用されており、キャッシュから取得されたことが分かります。
-
3 回目の呼び出しでは、キャッシュされた認証情報の有効期限が切れています。有効期限 (
RoleSessionExpiration) は 3,600 秒ですが、この呼び出しは 1 回目から 4,200 秒後に行われています。そのため、SDK の自動更新メカニズムによって新しい認証情報が取得され、キャッシュが更新されます。 -
4 回目の呼び出しでは 3 回目と同じ認証情報が使用されており、キャッシュが更新されたことが確認できます。
関連ドキュメント
-
RAM の基本的な概念の概要については、「基本的な概念」をご参照ください。
-
AccessKey を作成するには、「AccessKey の作成」をご参照ください。
-
プログラムで RAM ユーザー、AccessKey、RAM ロールを作成し、権限ポリシーを定義して権限を付与するには、「RAM SDK 概要」をご参照ください。
-
プログラムでロールを引き受けるには、「STS SDK 概要」をご参照ください。
-
RAM および STS API の詳細については、「API リファレンス」をご参照ください。