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 パッケージマネージャを使用してツールをインストールする。
[ソリューション エクスプローラー]パネルで、プロジェクトを右クリックし、[NuGet パッケージの管理]を選択します。[NuGet Package Manager]パネルで、[Browse]タブをクリックし、Aliyun.Credentialsを入力します。表示されたリストで、
Authorsの値がAlibaba Cloudである公式パッケージを選択し、[インストール] をクリックします。
インストールが成功すると、次のコマンドを実行できます。出力には Aliyun.Credentials とそのバージョン番号が含まれます:
dotnet list packageCredentials ツールのパラメーター
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: カスタムセッション名。デフォルトのフォーマットは | × | × | - | × | - | × | × |
RoleName:RAM ロール名。 | × | × | × | - | × | × | × |
DisableIMDSv1: セキュリティ強化モードを強制的に使用するかどうかを指定します。デフォルト値: | × | × | × | - | × | × | × |
BearerToken:ベアラートークン。 | × | × | × | × | × | × | √ |
Policy:カスタム権限ポリシー。 | × | × | - | × | - | × | × |
RoleSessionExpiration:セッションの有効期間 (TTL)。デフォルト値:3600 秒。 | × | × | - | × | - | × | × |
OidcProviderArn:OIDC IdP の ARN。 | × | × | × | × | √ | × | × |
OidcTokenFilePath:OIDC トークンファイルへのパス。 | × | × | × | × | √ | × | × |
ExternalId:ロールの外部 ID。この機能は Confused Deputy 問題を防ぎます。詳細については、「外部 ID を使用して Confused Deputy 問題を防ぐ」をご参照ください。 | × | × | - | × | × | × | × |
CredentialsURI:認証情報の URI。 | × | × | × | × | × | √ | × |
STSEndpoint: STS のエンドポイントです。 VPC エンドポイントとパブリックネットワークエンドポイントがサポートされています。 有効な値については、「エンドポイント」をご参照ください。 デフォルト値は | × | × | - | × | - | × | × |
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 呼び出しの例
方法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 呼び出しの例
方法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 呼び出しの例
方法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 呼び出しの例
方法5:インスタンス RAM ロールの使用
ECS と ECI インスタンスはどちらもインスタンス RAM ロールのアタッチをサポートしています。これらのインスタンスで実行されるプログラムは、Credentials ツールを使用してロールの STS トークンを自動的に取得し、認証情報クライアントの初期化を完了できます。
デフォルトでは、Credentials ツールはセキュリティ強化モード (IMDSv2) で ECS インスタンスメタデータサービスにアクセスします。このモードで例外が発生した場合、ツールは通常モードにフォールバックしてアクセス認証情報を取得します。また、disableIMDSv1 パラメーターまたは ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数を設定して、別の例外処理ロジックを実行することもできます:
値が false (デフォルト) の場合、ツールは一般モードでアクセス認証情報の取得を続行します。
値が true の場合、ツールはセキュリティ強化モードでのみアクセス認証情報を取得でき、例外がスローされます。
サーバー側が IMDSv2 をサポートしているかどうかは、サーバーの設定に依存します。
さらに、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定して、ECS メタデータからの認証情報アクセスを無効にすることができます。
セキュリティ強化モードで一時的な ID 認証情報を取得する場合、Credentials のバージョンは 1.4.2 以降である必要があります。
ECS インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
ECS または ECI インスタンスに RAM ロールを付与する方法の詳細については、「RAM ロールを作成して ECS インスタンスに付与する」および「インスタンス RAM ロールを ECI インスタンスに付与する」をご参照ください。
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 呼び出しの例
方法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 呼び出しの例
方法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 呼び出しの例
方法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 呼び出しの例
デフォルトの認証情報プロバイダーチェーン
開発環境と本番環境で異なる認証情報タイプを使用する場合、一般的には、コードで現在の環境情報を取得し、ブランチコードを記述して異なる認証情報を取得します。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.jsonWindows:`
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 | 認証情報のコレクションです。
|
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 環境変数を設定することで、インスタンスメタデータからの認証情報アクセスを無効にすることができます。
インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
ECS または ECI インスタンスに RAM ロールを付与する方法の詳細については、「RAM ロールを作成して ECS インスタンスに付与する」および「インスタンス RAM ロールを ECI インスタンスに付与する」をご参照ください。
セキュリティ強化モードで一時的な認証情報を取得するには、credentials-java 0.3.10 以降を使用する必要があります。
5. Credentials ツール URI の使用
認証情報が見つからない場合、Credentials ツールは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数をチェックします。この変数が存在し、有効な URI を指している場合、Credentials ツールはこの URI にアクセスして STS トークンをデフォルトの認証情報として取得します。
セッションタイプの認証情報の自動更新メカニズム
セッション認証情報には、ram_role_arn、ecs_ram_role、oidc_role_arn、および credentials_uri が含まれます。このタイプの認証情報には、Credentials ツールに組み込まれた自動更新メカニズムがあります。認証情報クライアントが初めて認証情報を取得した後、Credentials ツールはその認証情報をキャッシュに保存します。後続のリクエストでは、同じ認証情報クライアントインスタンスが自動的にキャッシュから認証情報をフェッチします。キャッシュ内の認証情報が期限切れの場合、認証情報クライアントインスタンスは認証情報を再取得し、キャッシュを更新します。
`ecs_ram_role` 認証情報の場合、Credentials ツールは認証情報が期限切れになる 15 分前にキャッシュを更新します。
次の例では、シングルトンパターンで認証情報クライアントを作成します。クライアントは異なる時点で認証情報を取得して自動更新メカニズムを検証し、OpenAPI 操作を呼び出して取得した認証情報が有効であることを確認します。
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();
}
}
}
次のセクションでは、ログの結果を分析します。
最初の呼び出しでは、認証情報はキャッシュされていません。そのため、システムは設定に基づいて認証情報を取得します。認証情報が取得されると、キャッシュに保存されます。
2 回目の呼び出しで使用される認証情報は、1 回目と同じです。これは、2 回目の呼び出しの認証情報がキャッシュから取得されたことを示します。
3 回目の呼び出しでは、キャッシュ内の認証情報が期限切れになっています。これは、認証情報の有効期間 (`RoleSessionExpiration`) が 3,600 秒に設定されており、3 回目の呼び出しが最初の呼び出しから 4,200 秒後に発生するためです。したがって、SDK は自動更新メカニズムに基づいて新しい認証情報を再取得し、新しい認証情報をキャッシュに保存します。
4 回目の呼び出しで使用される認証情報は、3 回目の呼び出しで取得された新しい認証情報と同じです。これは、キャッシュ内の認証情報が期限切れになった後に更新されたことを示します。
関連ドキュメント
RAM の詳細については、「用語」をご参照ください。
AccessKey ペアの作成方法の詳細については、「AccessKey ペアの作成」をご参照ください。
RAM ユーザー、AccessKey ペア、RAM ロール、およびアクセスポリシーをプログラムで作成し、権限を付与する方法の詳細については、「RAM SDK の概要」をご参照ください。
プログラムでロールを引き受ける方法の詳細については、「STS SDK の概要」をご参照ください。
RAM および STS 関連の API 操作の詳細については、「API リファレンス」をご参照ください。