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

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

最終更新日:Dec 19, 2025

Alibaba Cloud SDK を使用する際、AccessKey ペアや Security Token Service (STS) トークンなどの認証情報は、Credentials ツールによって管理されます。このトピックでは、Credentials ツールがサポートする認証情報の種類と、その設定方法について説明します。

前提条件

  • .NET Framework 4.5 以降。

  • .NET Standard 2.0 以降。

  • C# 4.0 以降。

  • Alibaba Cloud SDK for .NET V2.0。

Credentials ツールのインストール

.NET Credentials ツールをすでにインストールしている場合は、このステップをスキップできます。すべての認証情報の種類がサポートされるように、最新バージョンの Credentials 依存関係パッケージを使用していることを確認してください。公開されているすべてのバージョンについては、「ChangeLog.md」をご参照ください。

Credentials ツールは、次のいずれかの方法でインストールできます。

  • 方法1:.NET コマンドラインインターフェイス (CLI) を使用してツールをインストールする。

    dotnet add package Aliyun.Credentials
  • 方法2:NuGet パッケージマネージャを使用してツールをインストールする。

    1. [ソリューション エクスプローラー] パネルで、プロジェクトを右クリックし、[NuGet パッケージの管理] を選択します。

    2. [NuGet Package Manager] パネルで、[Browse] タブをクリックし、Aliyun.Credentials を入力します。

    3. 表示されたリストで、Authors の値が Alibaba Cloud である公式パッケージを選択し、[インストール] をクリックします。

インストールが成功すると、次のコマンドを実行できます。出力には Aliyun.Credentials とそのバージョン番号が含まれます:

dotnet list package

Credentials ツールのパラメーター

Credentials ツールの構成パラメーターは、Aliyun.Credentials.Models.Config で定義されています。認証情報タイプを指定するには、必須パラメーターの type を使用します。認証情報タイプを指定した後、対応するパラメーターを選択します。次の表に、type の有効な値と、各認証情報タイプでサポートされているパラメーターを示します。チェックマーク () は必須パラメーターを、ハイフン (-) はオプションのパラメーターを、X マーク (×) はサポートされていないパラメーターを示します。

説明

次の表に記載されていない認証情報の種類やパラメーターは使用しないでください。

種類

access_key

sts

ram_role_arn

ecs_ram_role

oidc_role_arn

credentials_uri

bearer

AccessKeyId:AccessKey ID。

×

×

×

×

AccessKeySecret:AccessKey Secret。

×

×

×

×

SecurityToken:STS トークン。

×

-

×

×

×

×

RoleArn:RAM ロールの Alibaba Cloud リソースネーム (ARN)。

×

×

×

×

×

RoleSessionName: カスタムセッション名。デフォルトのフォーマットは credentials-csharp-current_timestamp です。

×

×

-

×

-

×

×

RoleName:RAM ロール名。

×

×

×

-

×

×

×

DisableIMDSv1: セキュリティ強化モードを強制的に使用するかどうかを指定します。デフォルト値: false

×

×

×

-

×

×

×

BearerToken:ベアラートークン。

×

×

×

×

×

×

Policy:カスタム権限ポリシー。

×

×

-

×

-

×

×

RoleSessionExpiration:セッションの有効期間 (TTL)。デフォルト値:3600 秒。

×

×

-

×

-

×

×

OidcProviderArn:OIDC IdP の ARN。

×

×

×

×

×

×

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

×

×

×

×

×

×

ExternalId:ロールの外部 ID。この機能は Confused Deputy 問題を防ぎます。詳細については、「外部 ID を使用して Confused Deputy 問題を防ぐ」をご参照ください。

×

×

-

×

×

×

×

CredentialsURI:認証情報の URI。

×

×

×

×

×

×

STSEndpoint: STS のエンドポイントです。 VPC エンドポイントとパブリックネットワークエンドポイントがサポートされています。 有効な値については、「エンドポイント」をご参照ください。 デフォルト値は sts.aliyuncs.com です。

×

×

-

×

-

×

×

Timeout:HTTP リクエストの読み取りタイムアウト。デフォルト値:5000 ミリ秒。

×

×

-

-

-

-

×

ConnectTimeout:HTTP リクエストの接続タイムアウト。デフォルト値:10000 ミリ秒。

×

×

-

-

-

-

×

認証情報クライアントの初期化

以下のセクションでは、Credentials ツールを使用する方法を示すコード例を提供します。要件に基づいて方法を選択できます。

重要
  • AccessKey ペアは環境変数または設定ファイルに保存することを推奨します。

  • Credentials ツールを使用する際は、シングルトンパターンを使用することを推奨します。この方法により、組み込みの認証情報キャッシュ機能が有効になります。これにより、複数の API 呼び出しによるスロットリングの問題を防ぎ、複数のインスタンスを作成することによるリソースの無駄を回避できます。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。

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

認証情報クライアントを初期化する際にパラメーターを渡さない場合、Credentials ツールはデフォルトの認証情報プロバイダーチェーンを使用してクライアントを初期化します。デフォルトの認証情報取得ロジックの詳細については、「デフォルトの認証情報プロバイダーチェーン」をご参照ください。

using Aliyun.Credentials.Models;

namespace credentials_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            // パラメーターを指定しないか、null を渡します。
            var credential = new Aliyun.Credentials.Client();
            // var credential = new Aliyun.Credentials.Client(null);
        }
    }
}

API 呼び出しの例

この例では、Elastic Compute Service (ECS) の DescribeRegions 操作を呼び出す方法を示します。開始する前に、ECS SDK をインストールする必要があります。

using System;
using Aliyun.Credentials.Models;
using Tea;
using Tea.Utils;

namespace credentials_demo
{
    public class Sample
    {
        static void Main(string[] args)
        {
            // デフォルトの認証情報を使用して Credentials クライアントを初期化します。
            Aliyun.Credentials.Client credentialClient = new Aliyun.Credentials.Client(null);

            AlibabaCloud.OpenApiClient.Models.Config ecsConfig = new AlibabaCloud.OpenApiClient.Models.Config();
            // サービスエンドポイントを設定します。
            ecsConfig.Endpoint = "ecs.cn-beijing.aliyuncs.com";
            // Credentials を使用して認証情報を設定します。
            ecsConfig.Credential = credentialClient;
            // ECS クライアントを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Client escClient = new AlibabaCloud.SDK.Ecs20140526.Client(ecsConfig);
            // DescribeRegions リクエストを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest describeInstancesRequest = new AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest();
            // ランタイム設定を初期化します。
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            // DescribeRegions 操作を呼び出し、応答を取得します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsResponse response = escClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime);
            Console.WriteLine(response.Body.ToMap());
        }
    }
}

方法2:AccessKey の使用

Credentials ツールは、ご利用の AccessKey をアクセス認証情報として使用します。

警告

Alibaba Cloud アカウントは、すべてのリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩すると、システムに重大なセキュリティ上の脅威をもたらします。Alibaba Cloud アカウントの AccessKey ペアを使用することは推奨しません。

最小限の必要な権限が付与された RAM ユーザーの AccessKey ペアを使用することを推奨します。

using Aliyun.Credentials.Models;

namespace credentials_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = new Config()
            {
                Type = "access_key",                    
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),          
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET")   
            };
            var akCredential = new Aliyun.Credentials.Client(config);

            string accessKeyId = akCredential.GetAccessKeyId();
            string accessSecret = akCredential.GetAccessKeySecret();
            string credentialType = akCredential.GetType();
        }
    }
}

API 呼び出しの

この例では、ECS の DescribeRegions 操作を呼び出す方法を示します。開始する前に、ECS SDK をインストールする必要があります。

using System;
using Aliyun.Credentials.Models;
using Tea;
using Tea.Utils;

namespace credentials_demo
{
    public class Sample
    {
        static void Main(string[] args)
        {
            // AccessKey を使用して Credentials クライアントを初期化します。
            Aliyun.Credentials.Models.Config credentialsConfig = new Aliyun.Credentials.Models.Config()
            {
                // 認証情報の種類。
                Type = "access_key",
                // 環境変数から AccessKey ID を取得します。
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // 環境変数から AccessKey Secret を取得します。
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
            };
            Aliyun.Credentials.Client credentialClient = new Aliyun.Credentials.Client(credentialsConfig);

            AlibabaCloud.OpenApiClient.Models.Config ecsConfig = new AlibabaCloud.OpenApiClient.Models.Config();
            // サービスエンドポイントを設定します。
            ecsConfig.Endpoint = "ecs.cn-beijing.aliyuncs.com";
            // Credentials を使用して認証情報を設定します。
            ecsConfig.Credential = credentialClient;
            // ECS クライアントを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Client escClient = new AlibabaCloud.SDK.Ecs20140526.Client(ecsConfig);
            // DescribeRegions リクエストを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest describeInstancesRequest = new AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest();
            // ランタイム設定を初期化します。
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            // DescribeRegions 操作を呼び出し、応答を取得します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsResponse response = escClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime);
            Console.WriteLine(response.Body.ToMap());
        }
    }
}

方法3:STS トークンの使用

Credentials ツールは、提供された静的な STS トークン をアクセス認証情報として使用します。

using Aliyun.Credentials.Models;

namespace credentials_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = new Config()
            {
                Type = "sts", 
                // 環境変数から AccessKey ID を取得します。
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // 環境変数から AccessKey Secret を取得します。
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), 
                // 環境変数から取得した一時的な SecurityToken。
              	SecurityToken = Environment.GetEnvironmentVariable("<ALIBABA_CLOUD_SECURITY_TOKEN>")
            };
            var stsCredential = new Aliyun.Credentials.Client(config);

            string accessKeyId = stsCredential.GetAccessKeyId();
            string accessSecret = stsCredential.GetAccessKeySecret();
            string credentialType = stsCredential.GetType();
            string securityToken = stsCredential.GetSecurityToken();
        }
    }

API 呼び出しの

この例では、ECS の DescribeRegions 操作を呼び出す方法を示します。開始する前に、Elastic Compute Service SDKSecurity Token Service SDK をインストールする必要があります。

using System;
using Aliyun.Credentials.Models;
using Tea;
using Tea.Utils;

namespace credentials_demo
{
    public class Sample
    {
        static void Main(string[] args)
        {
            // STS トークンを使用して Credentials クライアントを初期化します。
            Aliyun.Credentials.Models.Config credentialsConfig = new Aliyun.Credentials.Models.Config()
            {
                // 認証情報の種類。
                Type = "sts", 
                // 環境変数から AccessKey ID を取得します。
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // 環境変数から AccessKey Secret を取得します。
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), 
                // 環境変数から取得した一時的な SecurityToken。
              	SecurityToken = Environment.GetEnvironmentVariable("<ALIBABA_CLOUD_SECURITY_TOKEN>")
            };
            Aliyun.Credentials.Client credentialClient = new Aliyun.Credentials.Client(credentialsConfig);

            AlibabaCloud.OpenApiClient.Models.Config ecsConfig = new AlibabaCloud.OpenApiClient.Models.Config();
            // サービスエンドポイントを設定します。
            ecsConfig.Endpoint = "ecs.cn-beijing.aliyuncs.com";
            // Credentials を使用して認証情報を設定します。
            ecsConfig.Credential = credentialClient;
            // ECS クライアントを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Client escClient = new AlibabaCloud.SDK.Ecs20140526.Client(ecsConfig);
            // DescribeRegions リクエストを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest describeInstancesRequest = new AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest();
            // ランタイム設定を初期化します。
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            // DescribeRegions 操作を呼び出し、応答を取得します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsResponse response = escClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime);
            Console.WriteLine(response.Body.ToMap());
        }
    }
}

方法4:AccessKey と RamRoleArn の使用

このメソッドの基盤となる実装は STS トークンです。RAM ロールの Amazon リソースネーム (ARN) を指定することで、Credentials ツールは開発者が STS から STS トークンを取得するのを支援します。また、Policy パラメーターに値を割り当てて、RAM ロールをより小さい権限のセットに制限することもできます。

using Aliyun.Credentials.Models;

namespace credentials_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = new Config()
            {
                Type = "ram_role_arn",                  
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
              	// 引き受ける RAM ロールの ARN。例:acs:ram::123456789012****:role/adminrole。RoleArn は ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
                RoleArn = "<RoleArn>",  
              	// ロールセッション名。RoleSessionName は ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
                RoleSessionName = "<RoleSessionName>", 
            };
            var arnCredential = new Aliyun.Credentials.Client(config);

            string accessKeyId = arnCredential.GetAccessKeyId();
            string accessSecret = arnCredential.GetAccessKeySecret();
            string credentialType = arnCredential.GetType();
            string securityToken = arnCredential.GetSecurityToken();
        }
    }
}

API 呼び出しの

この例では、ECS の DescribeRegions 操作を呼び出す方法を示します。開始する前に、ECS SDK をインストールする必要があります。

using System;
using Aliyun.Credentials.Models;
using Tea;
using Tea.Utils;

namespace credentials_demo
{
    public class Sample
    {
        static void Main(string[] args)
        {
            // AccessKey と RamRoleArn を使用して Credentials クライアントを初期化します。
            Aliyun.Credentials.Models.Config credentialsConfig = new Aliyun.Credentials.Models.Config()
            {
                // 認証情報の種類。
                Type = "ram_role_arn",
                // AccessKey ID を設定します。
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // AccessKey Secret を設定します。
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
                // 引き受ける RAM ロールの ARN。例:acs:ram::123456789012****:role/adminrole。RoleArn は ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
                RoleArn = "<RoleArn>",
                // ロールセッション名。RoleSessionName は ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
                RoleSessionName = "<RoleSessionName>",
            };
            Aliyun.Credentials.Client credentialClient = new Aliyun.Credentials.Client(credentialsConfig);

            AlibabaCloud.OpenApiClient.Models.Config ecsConfig = new AlibabaCloud.OpenApiClient.Models.Config();
            // サービスエンドポイントを設定します。
            ecsConfig.Endpoint = "ecs.cn-beijing.aliyuncs.com";
            // Credentials を使用して認証情報を設定します。
            ecsConfig.Credential = credentialClient;
            // ECS クライアントを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Client escClient = new AlibabaCloud.SDK.Ecs20140526.Client(ecsConfig);
            // DescribeRegions リクエストを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest describeInstancesRequest = new AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest();
            // ランタイム設定を初期化します。
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            // DescribeRegions 操作を呼び出し、応答を取得します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsResponse response = escClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime);
            Console.WriteLine(response.Body.ToMap());
        }
    }
}

方法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 メタデータからの認証情報アクセスを無効にすることができます。

説明
using Aliyun.Credentials.Models;

namespace credentials_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = new Config()
            {
                Type = "ecs_ram_role",
              	// 任意。ECS ロールの名前。指定しない場合は自動的に取得されます。リクエスト数を減らすために追加することを推奨します。RoleName は ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して設定できます。
                RoleName = "<RoleName>" 
            };
            // 任意。デフォルト値:false。true:セキュリティ強化モードを強制的に使用します。false:システムはまずセキュリティ強化モードで認証情報を取得しようとします。失敗した場合は、一般モード (IMDSv1) に切り替えて再試行します。
            // config.DisableIMDSv1 = true;
            
            var ecsCredential = new Aliyun.Credentials.Client(config);

            string accessKeyId = ecsCredential.GetAccessKeyId();
            string accessSecret = ecsCredential.GetAccessKeySecret();
            string credentialType = ecsCredential.GetType();
            string securityToken = ecsCredential.GetSecurityToken();
        }
    }
}

API 呼び出しの例

この例では、ECS の DescribeRegions 操作を呼び出す方法を示します。開始する前に、ECS SDK をインストールする必要があります。

using System;
using Aliyun.Credentials.Models;
using Tea;
using Tea.Utils;

namespace credentials_demo
{
    public class Sample
    {
        static void Main(string[] args)
        {
            // ECS インスタンスにアタッチされたロールを使用して Credentials クライアントを初期化します。
            Aliyun.Credentials.Models.Config credentialsConfig = new Aliyun.Credentials.Models.Config()
            {
                // 認証情報の種類。
                Type = "ecs_ram_role",
              	// 任意。ECS ロールの名前。指定しない場合は自動的に取得されます。リクエスト数を減らすために追加することを推奨します。RoleName は ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して設定できます。
                RoleName = "<RoleName>"
            };
            Aliyun.Credentials.Client credentialClient = new Aliyun.Credentials.Client(credentialsConfig);

            AlibabaCloud.OpenApiClient.Models.Config ecsConfig = new AlibabaCloud.OpenApiClient.Models.Config();
            // サービスエンドポイントを設定します。
            ecsConfig.Endpoint = "ecs.cn-beijing.aliyuncs.com";
            // Credentials を使用して認証情報を設定します。
            ecsConfig.Credential = credentialClient;
            // ECS クライアントを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Client escClient = new AlibabaCloud.SDK.Ecs20140526.Client(ecsConfig);
            // DescribeRegions リクエストを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest describeInstancesRequest = new AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest();
            // ランタイム設定を初期化します。
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            // DescribeRegions 操作を呼び出し、応答を取得します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsResponse response = escClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime);
            Console.WriteLine(response.Body.ToMap());
        }
    }
}

方法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 サービスにアクセスします。

using Aliyun.Credentials.Models;

namespace credentials_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = new Config()
            {
                Type = "oidc_role_arn",
                // RAM ロールの ARN。RoleArn は ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
                RoleArn = "<RoleArn>",
                // OIDC プロバイダーの ARN。OidcProviderArn は ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を使用して設定できます。
                OIDCProviderArn = "<OidcProviderArn>",
                // OIDC トークンファイルへのパス。OidcTokenFilePath は ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を使用して設定できます。
                OIDCTokenFilePath = "<OidcTokenFilePath>",
                // ロールセッション名。RoleSessionName は ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
                RoleSessionName = "<RoleSessionName>",
                // より小さな権限ポリシー。これは任意です。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
                Policy = "<Policy>",
                RoleSessionExpiration = 3600
            };
            var ecsCredential = new Aliyun.Credentials.Client(config);
        }
    }
}

API 呼び出しの例

この例では、ECS の DescribeRegions 操作を呼び出す方法を示します。開始する前に、ECS SDK をインストールする必要があります。

using System;
using Aliyun.Credentials.Models;
using Tea;
using Tea.Utils;

namespace credentials_demo
{
    public class Sample
    {
        static void Main(string[] args)
        {
            // OIDCRoleArn を使用して Credentials クライアントを初期化します。
            Aliyun.Credentials.Models.Config credentialsConfig = new Aliyun.Credentials.Models.Config()
            {
                // 認証情報の種類。
                Type = "oidc_role_arn",
                // RAM ロールの ARN。RoleArn は ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
                RoleArn = "<RoleArn>",
                // OIDC プロバイダーの ARN。OidcProviderArn は ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を使用して設定できます。
                OIDCProviderArn = "<OidcProviderArn>",
                // OIDC トークンファイルへのパス。OidcTokenFilePath は ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を使用して設定できます。
                OIDCTokenFilePath = "<OidcTokenFilePath>",
                // ロールセッション名。RoleSessionName は ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
                RoleSessionName = "<RoleSessionName>",
                // より小さな権限ポリシー。これは任意です。例:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
                Policy = "<Policy>",
                RoleSessionExpiration = 3600
            };
            Aliyun.Credentials.Client credentialClient = new Aliyun.Credentials.Client(credentialsConfig);

            AlibabaCloud.OpenApiClient.Models.Config ecsConfig = new AlibabaCloud.OpenApiClient.Models.Config();
            // サービスエンドポイントを設定します。
            ecsConfig.Endpoint = "ecs.cn-beijing.aliyuncs.com";
            // Credentials を使用して認証情報を設定します。
            ecsConfig.Credential = credentialClient;
            // ECS クライアントを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Client escClient = new AlibabaCloud.SDK.Ecs20140526.Client(ecsConfig);
            // DescribeRegions リクエストを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest describeInstancesRequest = new AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest();
            // ランタイム設定を初期化します。
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            // DescribeRegions 操作を呼び出し、応答を取得します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsResponse response = escClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime);
            Console.WriteLine(response.Body.ToMap());
        }
    }
}

方法7:認証情報 URI の使用

STS サービスをカプセル化し、その URI を公開することで、外部サービスは URI を通じて STS トークンを取得できます。これにより、AccessKey ペアなどの機密情報が漏洩するリスクが軽減されます。Credentials ツールは、提供された URI にアクセスして STS トークンを取得し、このトークンをアクセス認証情報として使用します。この方法で取得した認証情報は自動更新をサポートしています。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。

using Aliyun.Credentials.Models;

namespace credentials_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = new Config()
            {
                Type = "credentials_uri",
              	// 認証情報を取得するための URI。フォーマットは http://local_or_remote_uri/ です。CredentialsUri は ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を使用して設定できます。
                CredentialsURI = "<CredentialsURI>"     
            };
        }
    }
}

API 呼び出しの例

この例では、ECS の DescribeRegions 操作を呼び出す方法を示します。開始する前に、ECS SDK をインストールする必要があります。

using System;
using Aliyun.Credentials.Models;
using Tea;
using Tea.Utils;

namespace credentials_demo
{
    public class Sample
    {
        static void Main(string[] args)
        {
            // URI を使用して Credentials クライアントを初期化します。
            Aliyun.Credentials.Models.Config credentialsConfig = new Aliyun.Credentials.Models.Config()
            {
                // 認証情報の種類。
                Type = "credentials_uri",
              	// 認証情報を取得するための URI。フォーマットは http://local_or_remote_uri/ です。CredentialsUri は ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を使用して設定できます。
                CredentialsURI = "<CredentialsURI>" 
            };
            Aliyun.Credentials.Client credentialClient = new Aliyun.Credentials.Client(credentialsConfig);

            AlibabaCloud.OpenApiClient.Models.Config ecsConfig = new AlibabaCloud.OpenApiClient.Models.Config();
            // サービスエンドポイントを設定します。
            ecsConfig.Endpoint = "ecs.cn-beijing.aliyuncs.com";
            // Credentials を使用して認証情報を設定します。
            ecsConfig.Credential = credentialClient;
            // ECS クライアントを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Client escClient = new AlibabaCloud.SDK.Ecs20140526.Client(ecsConfig);
            // DescribeRegions リクエストを初期化します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest describeInstancesRequest = new AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest();
            // ランタイム設定を初期化します。
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            // DescribeRegions 操作を呼び出し、応答を取得します。
            AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsResponse response = escClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime);
            Console.WriteLine(response.Body.ToMap());
        }
    }
}

方法8:ベアラートークンの使用

現在、ベアラートークンによる認証情報の初期化をサポートしているのは Cloud Call Center (CCC) のみです。

using Aliyun.Credentials.Models;

namespace credentials_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = new Config()
            {
                Type = "bearer",     
              	// ご利用の Bearer Token を入力してください。
                BearerToken = "<BearerToken>"      
            };
            var bearerCredential = new Aliyun.Credentials.Client(config);

            string bearerToken = bearerCredential.GetBearerToken();
            string credentialType = bearerCredential.GetType();
        }
    }
}

API 呼び出しの

この例では、CCC の GetInstance 操作を呼び出す方法を示します。開始する前に、CCC SDK をインストールする必要があります。

using System;
using Aliyun.Credentials.Models;
using Tea;
using Tea.Utils;

namespace credentials_demo
{
    public class Sample
    {
        static void Main(string[] args)
        {
            // Bearer Token を使用して Credentials クライアントを初期化します。
            Aliyun.Credentials.Models.Config credentialsConfig = new Aliyun.Credentials.Models.Config()
            {
                // 認証情報の種類。
                Type = "bearer",
                // ご利用の Bearer Token を入力してください。
                BearerToken = "<BearerToken>"
            };
            Aliyun.Credentials.Client credentialClient = new Aliyun.Credentials.Client(credentialsConfig);

            AlibabaCloud.OpenApiClient.Models.Config cccConfig = new AlibabaCloud.OpenApiClient.Models.Config()
            {
                // サービスエンドポイントを設定します。
                Endpoint = "ccc.cn-shanghai.aliyuncs.com",
                // Credentials を使用して認証情報を設定します。
                Credential = credentialClient
            };

            // CCC クライアントを初期化します。
            AlibabaCloud.SDK.CCC20200701.Client cccClient = new AlibabaCloud.SDK.CCC20200701.Client(cccConfig);
            // GetInstance リクエストを初期化します。
            AlibabaCloud.SDK.CCC20200701.Models.GetInstanceRequest getInstanceRequest = new AlibabaCloud.SDK.CCC20200701.Models.GetInstanceRequest
            {
                InstanceId = "ccc-test",
            };
            // ランタイム設定を初期化します。
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            // DescribeRegions 操作を呼び出し、応答を取得します。
            AlibabaCloud.SDK.CCC20200701.Models.GetInstanceResponse response = cccClient.GetInstanceWithOptions(getInstanceRequest, runtime);
            Console.WriteLine(response.Body.ToMap());
        }
    }
}

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

開発環境と本番環境で異なる認証情報タイプを使用する場合、一般的には、コードで現在の環境情報を取得し、ブランチコードを記述して異なる認証情報を取得します。Credentials ツールのデフォルトの認証情報プロバイダーチェーンを使用すると、同じコードを使用し、外部構成によって異なる環境で認証情報を取得する方法を制御できます。認証情報クライアントを初期化する際、new Client(config) の呼び出し時にパラメーターを渡さず null を指定すると、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.json

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

この方法を使用して認証情報を構成するには、クラウドアシスタント 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
    }
  ]
}

パラメーター

説明

current

使用する資格情報の名前を指定します。この名前は、profiles パラメーターの name の値に対応します。デフォルトでは、システムは ALIBABA_CLOUD_PROFILE 環境変数で指定された資格情報名を優先します。この環境変数が設定されていない場合、システムは current で指定された資格情報名を使用します。

profiles

認証情報のコレクションです。 mode パラメーターを使用して、認証情報タイプを指定します:

  • AK:ユーザーの AccessKey ペアを認証情報として使用します。

  • StsToken:STS トークンを認証情報として使用します。

  • RamRoleArn:RAM ユーザーが RAM ロールを引き受けることで認証情報を取得します。

  • EcsRamRole:インスタンスメタデータから認証情報を取得します。

  • OIDC:OIDC IdP の ARN、OIDC トークン、および RAM ロールの ARN を使用して認証情報を取得します。

  • ChainableRamRoleArn: ロールチェーンメソッドを使用し、source_profile を使用して profiles 内の別の認証情報の名前を指定することで、新しい認証情報を取得します。

4. ECS インスタンスの RAM ロールの使用

アプリケーションが RAM ロールを付与された ECS または ECI インスタンスで実行されている場合、Credentials ツールはインスタンスメタデータから RAM ロールの STS トークンを取得し、アクセス認証情報として使用できます。 インスタンスメタデータにアクセスする際、アプリケーションはまず現在のインスタンスに付与されている RAM ロールの名前を取得し、そのロールに基づいて対応する STS トークンを取得します。 roleName パラメーターまたは ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して RAM ロール名を指定すると、認証情報を取得するために必要な時間を短縮し、効率を向上させることができます。 この方法で取得した認証情報は、自動更新をサポートします。 詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。

  • 値が false (デフォルト) の場合、システムは認証情報の取得を続行するために一般モードに切り替えようとします。

  • 値が true の場合、セキュリティ強化モードでのみ認証情報を取得できます。このモードでのアクセスが失敗した場合、例外がスローされます。

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

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

説明

5. Credentials ツール URI の使用

認証情報が見つからない場合、Credentials ツールは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数をチェックします。この変数が存在し、有効な URI を指している場合、Credentials ツールはこの URI にアクセスして STS トークンをデフォルトの認証情報として取得します。

セッションタイプの認証情報の自動更新メカニズム

セッション認証情報には、ram_role_arnecs_ram_roleoidc_role_arn、および credentials_uri が含まれます。このタイプの認証情報には、Credentials ツールに組み込まれた自動更新メカニズムがあります。認証情報クライアントが初めて認証情報を取得した後、Credentials ツールはその認証情報をキャッシュに保存します。後続のリクエストでは、同じ認証情報クライアントインスタンスが自動的にキャッシュから認証情報をフェッチします。キャッシュ内の認証情報が期限切れの場合、認証情報クライアントインスタンスは認証情報を再取得し、キャッシュを更新します。

説明

`ecs_ram_role` 認証情報の場合、Credentials ツールは認証情報が期限切れになる 15 分前にキャッシュを更新します。

次の例では、シングルトンパターンで認証情報クライアントを作成します。クライアントは異なる時点で認証情報を取得して自動更新メカニズムを検証し、OpenAPI 操作を呼び出して取得した認証情報が有効であることを確認します。

using System;
using System.Threading.Tasks;
using Aliyun.Credentials.Models;
using AlibabaCloud.SDK.Ecs20140526;
using AlibabaCloud.OpenApiClient.Models;
using AlibabaCloud.TeaUtil.Models;

namespace Example
{
    /// <summary>
    /// Credential クラスは、Alibaba Cloud 認証情報インスタンスを管理するために使用されます。静的なシングルトンパターンを使用します。
    /// </summary>
    public static class Credential
    {
        private static readonly Lazy<Aliyun.Credentials.Client> _instance = new(() =>
        {
            try
            {
                var config = new Aliyun.Credentials.Models.Config
                {
                    Type = "ram_role_arn",
                    AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                    AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
                    RoleArn = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ROLE_ARN"),
                    RoleSessionName = "RamRoleArnTest",
                    RoleSessionExpiration = 3600
                };

                return new Aliyun.Credentials.Client(config);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("Credential initialization failed: " + ex.Message, ex);
            }
        });

        public static Aliyun.Credentials.Client Instance => _instance.Value;
    }

    /// <summary>
    /// EcsClient クラスは、ECS クライアントインスタンスを管理するために使用されます。静的なシングルトンパターンを使用します。
    /// Initialize を使用してエンドポイントと認証情報を設定する必要があります。
    /// </summary>
    public static class EcsClient
    {
        private static string _endpoint = string.Empty; // 明示的な初期化。null にはできません。
        private static Aliyun.Credentials.Client _credential = null!; // 明示的な初期化。null にはできません。

        private static readonly Lazy<AlibabaCloud.SDK.Ecs20140526.Client> _instance = new(() =>
        {
            if (string.IsNullOrEmpty(_endpoint))
            {
                throw new InvalidOperationException("Endpoint must be set before initializing the ECS client.");
            }

            if (_credential == null)
            {
                throw new InvalidOperationException("Credential must be set before initializing the ECS client.");
            }

            try
            {
                var ecsConfig = new AlibabaCloud.OpenApiClient.Models.Config
                {
                    Endpoint = _endpoint,
                    Credential = _credential
                };

                return new AlibabaCloud.SDK.Ecs20140526.Client(ecsConfig);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("ECS client initialization failed: " + ex.Message, ex);
            }
        });

        public static void Initialize(string endpoint, Aliyun.Credentials.Client credential)
        {
            if (string.IsNullOrEmpty(endpoint))
            {
                throw new ArgumentException("Endpoint cannot be null or empty.", nameof(endpoint));
            }

            if (credential == null)
            {
                throw new ArgumentNullException(nameof(credential), "Credential cannot be null.");
            }

            _endpoint = endpoint;
            _credential = credential;
        }

        public static AlibabaCloud.SDK.Ecs20140526.Client Instance => _instance.Value;
    }

    public class Program
    {
        public static async Task Main(string[] args)
        {
            // EcsClient を初期化します。
            EcsClient.Initialize("ecs.cn-hangzhou.aliyuncs.com", Credential.Instance);

            Action task = () =>
            {
                try
                {
                    var credential = Credential.Instance.GetCredential();
                    Console.WriteLine(DateTime.Now);
                    Console.WriteLine($"AK ID: {credential.AccessKeyId}, AK Secret: {credential.AccessKeySecret}, STS Token: {credential.SecurityToken}");

                    var ecsClient = EcsClient.Instance;
                    var request = new AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest();
                    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();

                    var response = ecsClient.DescribeRegionsWithOptions(request, runtime);
                    Console.WriteLine($"Invoke result: {response.StatusCode}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"ECS client execution failed: {ex.Message}");
                }
            };

            // すぐに一度実行します。
            task();

            // 非同期タスクを同時に開始します。
            var tasks = new[]
            {
                ScheduleTaskAsync(task, 600),
                ScheduleTaskAsync(task, 4200),
                ScheduleTaskAsync(task, 4300)
            };

            await Task.WhenAll(tasks);

            Console.WriteLine("All tasks completed.");
        }

        private static async Task ScheduleTaskAsync(Action task, int delaySeconds)
        {
            await Task.Delay(TimeSpan.FromSeconds(delaySeconds));
            task();
        }
    }
}

image

次のセクションでは、ログの結果を分析します。

  • 最初の呼び出しでは、認証情報はキャッシュされていません。そのため、システムは設定に基づいて認証情報を取得します。認証情報が取得されると、キャッシュに保存されます。

  • 2 回目の呼び出しで使用される認証情報は、1 回目と同じです。これは、2 回目の呼び出しの認証情報がキャッシュから取得されたことを示します。

  • 3 回目の呼び出しでは、キャッシュ内の認証情報が期限切れになっています。これは、認証情報の有効期間 (`RoleSessionExpiration`) が 3,600 秒に設定されており、3 回目の呼び出しが最初の呼び出しから 4,200 秒後に発生するためです。したがって、SDK は自動更新メカニズムに基づいて新しい認証情報を再取得し、新しい認証情報をキャッシュに保存します。

  • 4 回目の呼び出しで使用される認証情報は、3 回目の呼び出しで取得された新しい認証情報と同じです。これは、キャッシュ内の認証情報が期限切れになった後に更新されたことを示します。

関連ドキュメント