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

Alibaba Cloud SDK:アクセス認証情報の管理

最終更新日:Jun 22, 2026
  • <Step>1</Step> コード内での認証情報の指定
  • <Step>2</Step> 環境変数の設定
  • <Step>3</Step> 認証情報ファイル (~/.alibabacloud/credentials) での設定
  • <Step>4</Step> Elastic Compute Service (ECS) インスタンスへの RAM ロールの設定
  • Alibaba Cloud SDK は、認証情報ツールを使用して、AccessKey や STS トークンなどの認証情報を一元管理します。このトピックでは、サポートされている認証情報の種類とその設定方法について説明します。

    背景情報

    認証情報とは、ユーザーのアイデンティティを検証するための一連の情報です。 システムにサインインするには、有効な認証情報を提供する必要があります。 一般的な認証情報の種類は、次のとおりです。

    1. AccessKey は、Alibaba Cloud アカウントまたは RAM ユーザーの長期的な認証情報です。 AccessKey ID と AccessKey secret で構成されるキーペアです。

    2. STS トークンは、RAM ロール用の一時的なアクセス認証情報です。 設定可能な有効期間とアクセス権限が含まれます。 詳細については、「STSとは」をご参照ください。

    3. ベアラートークンは、認証と認可に使用される認証情報です。

    前提条件

    • クレデンシャルツールには 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:カスタムセッション名。デフォルトの形式は credentials-go-<timestamp> です。

    ×

    ×

    -

    ×

    -

    ×

    ×

    RoleName:RAM ロール名。

    ×

    ×

    ×

    -

    ×

    ×

    ×

    DisableIMDSv1:true に設定すると、セキュリティ強化モードが適用されます。デフォルト値は false です。

    ×

    ×

    ×

    -

    ×

    ×

    ×

    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 エンドポイントとパブリックエンドポイントの両方をサポートします。有効な値のリストについては、「エンドポイント」をご参照ください。デフォルト値は sts.aliyuncs.com です。

    ×

    ×

    -

    ×

    -

    ×

    ×

    Timeout:HTTP 読み取りタイムアウト (ミリ秒単位)。デフォルト値は 5,000 です。

    ×

    ×

    -

    -

    -

    -

    ×

    ConnectTimeout:HTTP 接続タイムアウト (ミリ秒単位)。デフォルト値は 10,000 です。

    ×

    ×

    -

    -

    -

    -

    ×

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

    前のセクションでは、Credentials ツールがサポートする認証情報の種類と設定パラメーターを説明しました。以降のセクションでは、このツールの使用方法を示すコード例を紹介します。シナリオに最も適した方法を選択してください。

    重要
    • プロジェクトに AccessKey をハードコーディングすると、セキュリティリスクが生じます。リポジトリの権限が適切に管理されていない場合、アカウント内のすべてのリソースが公開される可能性があります。AccessKey は環境変数または設定ファイルに保存することを推奨します。

    • Credentials ツールではシングルトンパターンを使用してください。このパターンにより、ツールに組み込まれた認証情報キャッシングが有効になり、頻繁な API 呼び出しによるレート制限を防ぎ、複数のインスタンスを作成することによるリソースの浪費を回避できます。詳細については、「セッション認証情報の自動更新」をご参照ください。

    方法 1: デフォルトの認証情報プロバイダーチェーン

    B{認証情報ファイルが存在するか}; B -- はい --> C(認証情報ファイルの読み取り); B -- いいえ --> D{環境変数が設定済みか}; C --> E{有効な認証情報を取得できたか}; D -- はい --> F(環境変数の読み取り); D -- いいえ --> G{ECS インスタンス を使用しているか}; F --> E; G -- はい --> H(インスタンス RAM ロール の読み取り); G -- いいえ --> I(エラー); H --> E; E -- はい --> J(有効な認証情報を取得); E -- いいえ --> I; J --> K(終了); I --> L(終了); ]]>

    パラメーターなしで 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 呼び出しの例

    この例では、ECS の DescribeRegions オペレーションを呼び出す方法を示します。この例を実行するには、Go 用の ECS SDK をインストールしてください。

    package main
    import (
    	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"
    )
    func main() {
    	// デフォルトのプロバイダーチェーンから認証情報を作成します。
    	credentialClient, _err := credentials.NewCredential(nil)
    	if _err != nil {
    		panic(_err)
    	}
    	ecsConfig := &openapi.Config{}
    	// サービスエンドポイントを設定します。
    	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
    	// 認証情報を設定します。
    	ecsConfig.Credential = credentialClient
    	// ECS クライアントを初期化します。
    	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
    	// DescribeRegions リクエストを初期化します。
    	describeRegionsRequest := &ecs20140526.DescribeRegionsRequest{}
    	// ランタイムオプションを初期化します。
    	runtime := &util.RuntimeOptions{}
    	// DescribeRegionsWithOptions を呼び出して、応答を取得します。
    	response, _err := ecsClient.DescribeRegionsWithOptions(describeRegionsRequest, runtime)
    	if _err != nil {
    		panic(_err)
    	}
    	panic(response.Body.String())
    }
    

    方法 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 の例

    この例では、Elastic Compute Service (ECS) の DescribeRegions オペレーションを呼び出す方法を示します。この例を実行するには、まずECS SDK をインストールする必要があります。

    package main
    import (
    	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"
    	"os"
    )
    func main() {
    	// AccessKey ペアを使用して認証情報クライアントを初期化します。
    	credentialsConfig := new(credentials.Config).
    		// 認証情報タイプを設定します。
    		SetType("access_key").
    		// AccessKey ID を設定します。
    		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
    		// AccessKey Secret を設定します。
    		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
    	credentialClient, _err := credentials.NewCredential(credentialsConfig)
    	if _err != nil {
    		panic(_err)
    	}
    	ecsConfig := &openapi.Config{}
    	// サービスエンドポイントを設定します。
    	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
    	// 認証情報を設定します。
    	ecsConfig.Credential = credentialClient
    	// ECS クライアントを初期化します。
    	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
    	// DescribeRegions リクエストを初期化します。
    	describeRegionsRequest := &ecs20140526.DescribeRegionsRequest{}
    	// ランタイムオプションを初期化します。
    	runtime := &util.RuntimeOptions{}
    	// DescribeRegions オペレーションを呼び出します。
    	response, _err := ecsClient.DescribeRegionsWithOptions(describeRegionsRequest, runtime)
    	if _err != nil {
    		panic(_err)
    	}
    	panic(response.Body.String())
    }
    

    方法 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 呼び出し

    この例では、ECS の DescribeRegions API を呼び出す方法を示します。この例を実行するには、ECS SDKSTS SDK をインストールする必要があります。

    package main
    import (
    	"os"
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/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 API を呼び出して 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 ロールの ARN。例: acs:ram::123456789012****:role/adminrole。RoleArn は ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
    	assumeRoleRequest.SetRoleArn("<RoleArn>")
    	// ロールセッション名。RoleSessionName は 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 トークンを使用して Credentials クライアントを初期化します。
    	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{}
    	// サービスエンドポイントを設定します。
    	ecsConfig.Endpoint = tea.String("ecs.cn-hangzhou.aliyuncs.com")
    	// 認証情報を設定します。
    	ecsConfig.Credential = credentialClient
    	// ECS クライアントを初期化します。
    	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
    	// DescribeRegions リクエストを初期化します。
    	describeRegionsRequest := &ecs20140526.DescribeRegionsRequest{}
    	// ランタイムオプションを初期化します。
    	runtime := &util.RuntimeOptions{}
    	// DescribeRegions API を呼び出し、レスポンスを取得します。
    	response, _err := ecsClient.DescribeRegionsWithOptions(describeRegionsRequest, runtime)
    	if _err != nil {
    		panic(_err)
    	}
    	panic(response.Body.String())
    }
    

    方法 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 の例

    この例では、ECS の DescribeRegions オペレーションを呼び出す方法を示します。この例を実行するには、ECS SDK をインストールしてください。

    package main
    import (
    	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"
    	"os"
    )
    func main() {
    	// RAM ロール ARN を使用して認証情報の設定を初期化します。
    	credentialsConfig := new(credentials.Config).
    		// 認証情報のタイプ。
    		SetType("ram_role_arn").
    		// AccessKey ID。
    		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
    		// AccessKey Secret。
    		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
    		// 引き受ける RAM ロールの ARN。ALIBABA_CLOUD_ROLE_ARN 環境変数で設定できます。例: acs:ram::123456789012****:role/adminrole。
    		SetRoleArn("<RoleArn>").
    		// ロールセッションのカスタム名。ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数で設定できます。
    		SetRoleSessionName("<RoleSessionName>").
    		// オプション。権限をさらに制限するインラインポリシー。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
    		SetPolicy("<Policy>").
    		// オプション。セッションの有効期限 (秒単位)。
    		SetRoleSessionExpiration(3600).
    		// オプション。STS エンドポイント。デフォルトは sts.aliyuncs.com です。ネットワークパフォーマンスを向上させるには、アプリケーションに近いリージョン固有のエンドポイントを使用してください。
    		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
    	credentialClient, _err := credentials.NewCredential(credentialsConfig)
    	if _err != nil {
    		panic(_err)
    	}
    	ecsConfig := &openapi.Config{}
    	// サービスエンドポイントを設定します。
    	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
    	// 作成した認証情報を ECS の設定に割り当てます。
    	ecsConfig.Credential = credentialClient
    	// ECS クライアントを初期化します。
    	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
    	// DescribeRegionsRequest オブジェクトを初期化します。
    	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 および ECI インスタンスにインスタンス RAM ロールをアタッチできます。これらのインスタンス上のアプリケーションは、認証情報ツールを使用して STS トークンを自動的に取得し、認証情報クライアントを初期化できます。

    デフォルトでは、認証情報ツールはセキュリティ強化モード (IMDSv2) で ECS メタデータサーバーにアクセスします。エラーが発生した場合、ツールは自動的に通常モードにフォールバックし、アクセス認証情報を取得します。このフォールバック動作は、disableIMDSv1 パラメーターまたは ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数を設定することで制御できます:

    • false (デフォルト) に設定した場合、ツールは通常モードにフォールバックします。

    • true に設定した場合、ツールはセキュリティ強化モードのみを使用し、失敗した場合は例外をスローします。

    IMDSv2 のサポートは、サーバーの設定に依存します。

    さらに、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定することで、ECS インスタンスメタデータ経由での認証情報アクセスを無効にできます。

    説明
    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 呼び出しの例

    この例では、ECS の DescribeRegions オペレーションを呼び出す方法を示します。この例を実行する前に、ECS SDK をインストールする必要があります。

    package main
    import (
    	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"
    	credentials "github.com/aliyun/credentials-go/credentials"
    )
    func main() {
    	// ECS RAM ロールを使用して認証情報クライアントを初期化します。
    	credentialsConfig := new(credentials.Config).
    		// 認証情報の種類を指定します。
    		SetType("ecs_ram_role").
    		// オプション。ロール名。省略した場合、名前は自動的に取得されます。リクエストを減らすため、このパラメーターの指定を推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用してロール名を設定することもできます。
    		SetRoleName("<RoleName>")
    	credentialClient, _err := credentials.NewCredential(credentialsConfig)
    	if _err != nil {
    		panic(_err)
    	}
    	ecsConfig := &openapi.Config{}
    	// サービスエンドポイントを設定します。
    	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
    	// クライアントの認証情報を設定します。
    	ecsConfig.Credential = credentialClient
    	// ECS クライアントを初期化します。
    	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
    	// DescribeRegions リクエストを初期化します。
    	describeRegionsRequest := &ecs20140526.DescribeRegionsRequest{}
    	// ランタイム設定を初期化します。
    	runtime := &util.RuntimeOptions{}
    	// DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
    	response, _err := ecsClient.DescribeRegionsWithOptions(describeRegionsRequest, runtime)
    	if _err != nil {
    		panic(_err)
    	}
    	panic(response.Body.String())
    }
    

    方法 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 の例

    この例では、ECS の DescribeRegions オペレーションを呼び出す方法を示します。このコードを実行するには、Go 向け ECS SDK をインストールする必要があります。

    package main
    import (
    	"os"
    	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.comcom/alibabacloud-go/tea/tea"
    	credentials "github.com/aliyun/credentials-go/credentials"
    )
    func main() {
    	// OIDC ロール ARN を使用して認証情報クライアントを初期化します。
    	credentialsConfig := new(credentials.Config).
    		// 認証情報のタイプ。
    		SetType("oidc_role_arn").
    		// OIDC ID プロバイダーの 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)
    	credentialClient, _err := credentials.NewCredential(credentialsConfig)
    	if _err != nil {
    		panic(_err)
    	}
    	ecsConfig := &openapi.Config{}
    	// サービスエンドポイントを設定します。
    	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
    	// 認証情報をクライアント設定に割り当てます。
    	ecsConfig.Credential = credentialClient
    	// ECS クライアントを初期化します。
    	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
    	// DescribeRegions リクエストを初期化します。
    	describeRegionsRequest := &ecs20140526.DescribeRegionsRequest{}
    	// ランタイム設定を初期化します。
    	runtime := &util.RuntimeOptions{}
    	// DescribeRegions オペレーションを呼び出します。
    	response, _err := ecsClient.DescribeRegionsWithOptions(describeRegionsRequest, runtime)
    	if _err != nil {
    		panic(_err)
    	}
    	panic(response.Body.String())
    }
    

    メソッド 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 の例

    この例では、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/v7/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() {
    	config := new(credentials.Config).
    		SetType("credentials_uri").
    		// 認証情報URI (例: http://local_or_remote_uri/) を指定するか、環境変数 ALIBABA_CLOUD_CREDENTIALS_URI を設定します。
    		SetURLCredential("<CredentialsUri>")
    	uriCredential, _err := credentials.NewCredential(config)
    	if _err != nil {
    		panic(_err)
    	}
    	ecsConfig := &openapi.Config{}
    	// サービスエンドポイントを設定します。
    	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
    	// 認証情報を設定します。
    	ecsConfig.Credential = uriCredential
    	// ECSクライアントを初期化します。
    	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
    	// DescribeRegions リクエストを初期化します。
    	describeRegionsRequest := &ecs20140526.DescribeRegionsRequest{}
    	// ランタイム設定を初期化します。
    	runtime := &util.RuntimeOptions{}
    	// DescribeRegions オペレーションを呼び出します。
    	response, _err := ecsClient.DescribeRegionsWithOptions(describeRegionsRequest, runtime)
    	if _err != nil {
    		panic(_err)
    	}
    	panic(response.Body.String())
    }
    

    方法 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 の例

    この例では、Cloud Call Center (CCC) の GetInstance API を呼び出す方法を示します。この例を実行するには、最初に CCC SDK をインストールしてください。

    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
    	}
    	// 認証情報クライアントを使用して CCC クライアントを初期化します。
    	config := &openapi.Config{}
    	config.Endpoint = tea.String("ccc.cn-shanghai.aliyuncs.com") // サービスエンドポイントを指定します。
    	config.Credential = credentialClient                         // 認証情報を設定します。
    	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)
    	}
    }
    

    メソッド 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 呼び出しの例

    この例では、ECS DescribeRegions API を呼び出す方法を示します。この例を実行するには、まず ECS SDK をインストールする必要があります。

    package main
    import (
    	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"
    	"github.com/aliyun/credentials-go/credentials/providers"
    )
    func main() {
    	// CLIProfileCredentialsProvider
    	provider, err := providers.NewCLIProfileCredentialsProviderBuilder().
    		WithProfileName("SSOProfile"). // オプション。デフォルトは config.json 内の 'current' です。
    		// WithProfileFile("/path/to/config.json"). // オプション。デフォルトは ~/.aliyun/config.json です。
    		Build()
    	if err != nil {
    		return
    	}
    	credentialClient := credentials.FromCredentialsProvider("cli_profile", provider)
    	// 認証情報を使用して ECS クライアントを初期化します。
    	ecsConfig := &openapi.Config{}
    	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
    	ecsConfig.Credential = credentialClient
    	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
    	describeRegionsRequest := &ecs20140526.DescribeRegionsRequest{}
    	runtime := &util.RuntimeOptions{}
    	response, _err := ecsClient.DescribeRegionsWithOptions(describeRegionsRequest, runtime)
    	if _err != nil {
    		panic(_err)
    	}
    	panic(response.Body.String())
    }
    

    デフォルトの認証情報プロバイダーチェーン

    開発環境と本番環境で必要な認証情報の種類が異なる場合、現在の環境に基づいて認証情報を取得する条件分岐コードを記述するのが一般的です。デフォルトの認証情報プロバイダーチェーンを使用すると、このプロセスを簡素化できます。単一のコードベースを使用しつつ、外部設定で認証情報の取得を制御できます。パラメーターを指定せずに NewCredential() を呼び出して認証情報クライアントを初期化すると、Alibaba Cloud SDK は次の順序で認証情報を検索します。

    1. 環境変数

    システムプロパティで認証情報が見つからない場合、プロバイダーチェーンは次に環境変数を確認します。

    • ALIBABA_CLOUD_ACCESS_KEY_ID ALIBABA_CLOUD_ACCESS_KEY_SECRET が設定されており、空でない場合、プロバイダーチェーンはそれらをデフォルトの認証情報として使用します。

    • ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRETALIBABA_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 ユーザーが取得した認証情報を使用します。

    説明

    設定後、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 環境変数を設定することで、このフォールバック動作を制御できます:

    1. false に設定すると、IMDSv2 リクエストが失敗した場合にツールは IMDSv1 にフォールバックして認証情報を取得します。

    2. true に設定すると、ツールは IMDSv2 のみを使用します。リクエストが失敗した場合は例外がスローされます。

    サーバーが IMDSv2 をサポートするかどうかは、サーバー設定に依存します。

    ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定して、ECS メタデータサービスからの認証情報アクセスを無効化することもできます。

    説明

    5. 認証情報 URI

    認証情報が見つからない場合、プロバイダーチェーンは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を確認します。この環境変数に有効な URI が設定されている場合、チェーンはその URI にアクセスして STS トークンを取得します。

    セッション認証情報の自動更新

    ram_role_arnecs_ram_roleoidc_role_arncredentials_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 回目と同じ認証情報が使用されており、キャッシュが更新されたことが確認できます。

    関連ドキュメント