Alibaba Cloud SDK は、認証情報ツールを使用して、AccessKey や STS トークンなどの認証情報を一元管理します。このトピックでは、サポートされている認証情報の種類とその設定方法について説明します。
前提条件
-
.NET Framework 4.5 以降
-
.NET Standard 2.0 以降
-
C# 4.0 以降
-
Alibaba Cloud SDK for .NET V2.0 以降
認証情報ツールのインストール
Alibaba Cloud Credentials for .NET をすでにインストールしている場合は、この手順をスキップできます。すべての認証情報のタイプをサポートするため、最新バージョンの認証情報パッケージを使用してください。リリース済みのすべてのバージョンについては、ChangeLog.md をご参照ください。
Alibaba Cloud Credentials for .NET は、次のいずれかの方法でインストールできます:
-
.NET CLI でパッケージをインストールします。
dotnet add package Aliyun.Credentials -
NuGet パッケージ マネージャーでパッケージをインストールします。
-
[ソリューション エクスプローラー]でプロジェクトを右クリックし、[NuGet パッケージの管理]を選択します。 -
[NuGet パッケージマネージャー]で、[参照]タブをクリックし、Aliyun.Credentialsと入力します。 -
リストから、
AuthorsがAlibaba Cloudである公式パッケージを選択し、インストールをクリックします。
-
インストールが完了したら、次のコマンドを実行します。出力には Aliyun.Credentials とそのバージョン番号が表示されます:
dotnet list package
認証情報ツールのパラメーター
認証情報ツールの設定パラメーターは、Aliyun.Credentials.Models.Config で定義されています。必須パラメーター type は、認証情報タイプを指定します。認証情報タイプを選択した後、対応するパラメーターを設定します。次の表に、type の有効な値と、各認証情報タイプでサポートされているパラメーターの詳細を示します。表では、√ は必須パラメーター、- はオプションのパラメーター、× はサポートされていないパラメーターを示します。
次の表に記載されている認証情報タイプとパラメーターのみを使用してください。
|
タイプ |
access_key |
sts |
ram_role_arn |
ecs_ram_role |
oidc_role_arn |
credentials_uri |
bearer |
|
AccessKeyId :アクセスキー ID。 |
√ |
√ |
√ |
× |
× |
× |
× |
|
AccessKeySecret :シークレットアクセスキー。 |
√ |
√ |
√ |
× |
× |
× |
× |
|
SecurityToken :セキュリティトークン。 |
× |
√ |
- |
× |
× |
× |
× |
|
RoleArn :RAM ロールの ARN。 |
× |
× |
√ |
× |
√ |
× |
× |
|
RoleSessionName: カスタムセッションの名前を指定します。デフォルトの形式は |
× |
× |
- |
× |
- |
× |
× |
|
RoleName :RAM ロールの名前。 |
× |
× |
× |
- |
× |
× |
× |
|
DisableIMDSv1: IMDSv1 を無効にしてセキュリティ強化モード (IMDSv2) を強制するかどうかを指定します。デフォルト値は |
× |
× |
× |
- |
× |
× |
× |
|
BearerToken :ベアラートークン。 |
× |
× |
× |
× |
× |
× |
√ |
|
Policy :カスタムポリシー。 |
× |
× |
- |
× |
- |
× |
× |
|
RoleSessionExpiration :セッションタイムアウト期間 (秒単位)。デフォルト値は 3600 です。 |
× |
× |
- |
× |
- |
× |
× |
|
OidcProviderArn :OIDC ID プロバイダーの ARN。 |
× |
× |
× |
× |
√ |
× |
× |
|
OidcTokenFilePath :OIDC トークンのファイルパス。 |
× |
× |
× |
× |
√ |
× |
× |
|
ExternalId :混乱した使節の問題を防ぐための外部 ID。詳細については、「外部 ID を使用した混乱した使節問題の防止」をご参照ください。 |
× |
× |
- |
× |
× |
× |
× |
|
CredentialsURI :認証情報の URI。 |
× |
× |
× |
× |
× |
√ |
× |
|
STSEndpoint: STS のエンドポイントです。 VPC エンドポイントとパブリックエンドポイントの両方がサポートされています。 有効な値の一覧については、「エンドポイント」をご参照ください。 デフォルト値は |
× |
× |
- |
× |
- |
× |
× |
|
Timeout :HTTP リクエストの読み取りタイムアウト (ミリ秒単位)。デフォルト値は 5000 です。 |
× |
× |
- |
- |
- |
- |
× |
|
ConnectTimeout :HTTP リクエストの接続タイムアウト (ミリ秒単位)。デフォルト値は 10000 です。 |
× |
× |
- |
- |
- |
- |
× |
認証情報クライアントの初期化
前のセクションでは、Credentials ツールがサポートする認証情報の種類と設定パラメーターを説明しました。以降のセクションでは、このツールの使用方法を示すコード例を紹介します。シナリオに最も適した方法を選択してください。
-
プロジェクトに AccessKey をハードコーディングすると、セキュリティリスクが生じます。リポジトリの権限が適切に管理されていない場合、アカウント内のすべてのリソースが公開される可能性があります。AccessKey は環境変数または設定ファイルに保存することを推奨します。
-
Credentials ツールではシングルトンパターンを使用してください。このパターンにより、ツールに組み込まれた認証情報キャッシングが有効になり、頻繁な API 呼び出しによるレート制限を防ぎ、複数のインスタンスを作成することによるリソースの浪費を回避できます。詳細については、「セッション認証情報の自動更新」をご参照ください。
メソッド 1:デフォルトの認証情報プロバイダーチェーン
パラメーターを指定せずに Credentials クライアントを初期化した場合、Credentials ツールはデフォルトの認証情報プロバイダーチェーンを使用します。 SDK がデフォルトの認証情報をロードする方法については、デフォルトの認証情報プロバイダーチェーンをご参照ください。
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 アカウント (ルートアカウント) は、そのすべてのリソースに対する完全な権限を持っているため、AK が公開されると重大なセキュリティリスクが生じます。ルートアカウントの AK は使用しないでください。
最小権限を持つ RAM ユーザーの AK を使用してください。
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",
// 環境変数からアクセスキー ID を取得
AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 環境変数からアクセスキーシークレットを取得
AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
// 環境変数からセキュリティトークンを取得
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:アクセスキーと RAM ロールの ARN
このメソッドは、内部的に STS トークンを使用します。RAM ロールの ARN (Alibaba Cloud Resource Name) を指定すると、認証情報ツールは 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。環境変数 ALIBABA_CLOUD_ROLE_ARN で設定することもできます。
RoleArn = "<RoleArn>",
// ロールセッション名。環境変数 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: ECS インスタンスの RAM ロール
インスタンス RAM ロールを ECS および ECI インスタンスにアタッチすると、インスタンス上のアプリケーションは Credentials ツールを使用してロールの STS トークンを自動的に取得して認証情報クライアントを初期化できます。
デフォルトでは、Credentials ツールはセキュリティ強化モード (IMDSv2) を使用して ECS メタデータサーバーにアクセスします。エラーが発生した場合、ツールは通常モードにフォールバックしてアクセス認証情報を取得します。このフォールバック動作は、disableIMDSv1 パラメーターまたは ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数を設定することで構成できます:
-
値が
false(デフォルト) の場合、ツールは通常モードでアクセス認証情報の取得を続行します。 -
値が
trueの場合、ツールはセキュリティ強化モードのみを使用します。取得に失敗した場合、例外がスローされます。
IMDSv2 のサポートは、サーバー構成に依存します。
ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定して、ECS インスタンスメタデータからの認証情報の取得を無効にすることもできます。
-
セキュリティ強化モードで一時的なセキュリティ認証情報を取得するには、Credentials ツールのバージョンが 1.4.2 以降であることを確認してください。
-
ECS インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
-
ECS および ECI インスタンスにインスタンス RAM ロールをアタッチする方法については、「ステップ 1: RAM ロールの作成」および「ECI インスタンスへのインスタンス RAM ロールの付与」をご参照ください。
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
var config = new Config()
{
Type = "ecs_ram_role",
// 任意。 ECS RAM ロール名。 リクエスト数を減らすには、このパラメーターを指定します。 省略した場合、システムは自動的にロール名を取得します。 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 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 サービスにアクセスできます。
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "oidc_role_arn",
// 引き受ける RAM ロールの ARN。環境変数 ALIBABA_CLOUD_ROLE_ARN で設定します。
RoleArn = "<RoleArn>",
// OIDC IdP の ARN。環境変数 ALIBABA_CLOUD_OIDC_PROVIDER_ARN で設定します。
OIDCProviderArn = "<OidcProviderArn>",
// OIDC トークンファイルのパス。環境変数 ALIBABA_CLOUD_OIDC_TOKEN_FILE で設定します。
OIDCTokenFilePath = "<OidcTokenFilePath>",
// ロールセッション名。環境変数 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
Security Token Service (STS) をサービス URI でカプセル化することで、外部サービスが AK などの機密情報を公開せずに STS トークンを取得できるようになります。その後、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/)。または、ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を設定することもできます。
CredentialsURI = "<CredentialsURI>"
};
}
}
}
API の例
方法 8: Bearer トークン
ベアラートークンによる認証情報の初期化は、Cloud Call Center (CCC) のみがサポートしています。
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "bearer",
// ベアラー トークンを入力してください。
BearerToken = "<BearerToken>"
};
var bearerCredential = new Aliyun.Credentials.Client(config);
string bearerToken = bearerCredential.GetBearerToken();
string credentialType = bearerCredential.GetType();
}
}
}
API の例
デフォルトの認証情報プロバイダーチェーン
アプリケーションが開発環境と本番環境で異なる認証情報を使用する場合、開発者は通常、条件付きコードを記述して各環境に適した認証情報を読み込みます。デフォルトの認証情報プロバイダーチェーンを使用すると、同じコードを使用し、外部設定を通じてさまざまな環境の認証情報を管理できます。認証情報クライアントを初期化する際、new Client(config) をパラメーターなしで、または null を指定して呼び出すと、Alibaba Cloud SDK は次の順序で認証情報の検索を試みます。
1. 環境変数の使用
システムプロパティで認証情報が見つからない場合、プロバイダーチェーンは次に環境変数を確認します。
-
ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET が設定されており、空でない場合、プロバイダーチェーンはそれらをデフォルトの認証情報として使用します。
-
ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET と ALIBABA_CLOUD_SECURITY_TOKEN も設定されている場合、プロバイダーチェーンは STS トークンをデフォルトの認証情報として使用します。
2. OIDC RAM ロールの使用
認証情報が見つからない場合、プロバイダーチェーンは OIDC RAM ロールに関連する次の環境変数を確認します:
-
ALIBABA_CLOUD_ROLE_ARN: RAM ロールの ARN。
-
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDC プロバイダーの ARN。
-
ALIBABA_CLOUD_OIDC_TOKEN_FILE: OIDC トークンのファイルパス。
3 つの環境変数がすべて設定されており、空でない場合、プロバイダーチェーンはこれらの値を使用して Security Token Service (STS) の AssumeRoleWithOIDC API を呼び出して、STS トークンを取得します。
3. config.json の使用
認証情報が見つからない場合、プロバイダーチェーンはデフォルトの場所から共有認証情報ファイル config.json を読み込み、ファイルに指定されている認証情報を使用します。
-
Linux/macOS:
~/.aliyun/config.json -
Windows:
C:\Users\USER_NAME\.aliyun\config.json
この方法で資格情報を設定するには、Alibaba Cloud CLI を使用するか、適切なパスに config.json ファイルを手動で作成します。コンテンツ形式の例は次のとおりです。
{
"current": "<PROFILE_NAME>",
"profiles": [
{
"name": "<PROFILE_NAME>",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "<PROFILE_NAME1>",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name":"<PROFILE_NAME2>",
"mode":"RamRoleArn",
"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME3>",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"<PROFILE_NAME4>",
"mode":"OIDC",
"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
"oidc_token_file":"<OIDC_TOKEN_FILE>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME5>",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
|
パラメーター |
説明 |
|
current |
対応する認証情報設定を取得するには、認証情報名を指定します。 認証情報名は、 |
|
profiles |
認証情報構成のコレクションが含まれます。
|
4. ECS インスタンスの RAM ロール
アプリケーションが、RAM ロールが割り当てられた Elastic Compute Service (ECS) または Elastic Container Instance (ECI) インスタンスで実行されている場合、Credentials ツールはインスタンスメタデータから STS トークンを取得し、アクセス資格情報として使用します。インスタンスメタデータにアクセスする際、ツールはまずインスタンスに割り当てられた RAM ロールの名前を取得します。roleName パラメーターまたは ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して RAM ロール名を指定することで、取得時間を短縮し、効率を向上させることができます。この方法で取得した資格情報は、自動更新に対応しています。詳細については、「セッション資格情報の自動更新」をご参照ください。
-
false(デフォルト) に設定すると、ツールは通常モードにフォールバックし、認証情報を取得します。 -
trueに設定すると、ツールはセキュアモードのみを使用し、アクセスが失敗した場合は例外をスローします。
サーバーが IMDSv2 をサポートするかどうかは、その設定によって異なります。
インスタンスメタデータからの認証情報アクセスを無効にするには、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定してください。
-
インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
-
ECS または ECI インスタンスに RAM ロールを付与する方法については、「ステップ1:RAM ロールの作成」および「ECI インスタンスへのインスタンス RAM ロールの付与」をご参照ください。
-
セキュアモードで一時認証情報を取得するには、credentials-java バージョン 0.3.10 以降が必要です。
5. 認証情報ツールの URI
認証情報が見つからない場合、プロバイダーチェーンは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を確認します。この環境変数に有効な URI が設定されている場合、チェーンはその URI にアクセスして STS トークンを取得します。
セッション認証情報の自動更新
ram_role_arn、ecs_ram_role、oidc_role_arn、credentials_uri などのセッション認証情報の種類は、認証情報プロバイダーに組み込まれたメカニズムにより自動更新をサポートします。認証情報クライアントが初めて認証情報を取得すると、プロバイダーはそれをキャッシュに保存します。以降のオペレーションでは、同じクライアントインスタンスがこのキャッシュから認証情報を自動的に取得します。キャッシュされた認証情報の有効期限が切れている場合、クライアントインスタンスは新しい認証情報を取得してキャッシュを更新します。
ecs_ram_role 認証情報の場合、認証情報プロバイダーは有効期限の 15 分前に事前に更新します。
次の例では、シングルトンパターンを使用して認証情報クライアントを作成します。異なる時間間隔で認証情報を取得し、OpenAPI オペレーションを呼び出して認証情報が使用可能であることを確認することで、更新メカニズムを示します。
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();
}
}
}2025/5/29 10:33:24
AK ID: STS.NVR3xxx P8KrfgTK, AK Secret: 6hsZk211xxx
PeZZ8NHSBeQo, STS Token: CAISxAJ1q6Ft5B2yf5jIr5XneN+ChrwS1It+pcEXr0DkFNMReiaL/qTz2IHhMeXZoA+4YsPu2mmFW6/sdlqdJQpp/QkjJRNF20plM7VtBkQt5I
pbng4YfgbiJREKxaXeirukwDsz9SNTCA JlhHL91N0vCGlgpPtpNIRZ4o8I3LGbYMe3XUiTmM3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWsMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif51/DXQEIvUIYbreL6L9mNxRkY6UgHkpJ
vCxxBmi0fUW5fe3VvPUtVVk900y3LAsg 3PjcmYvy1dKzlhvI856BxNHBq+A748VMgj01iX9IIPPtJO3TwsQdpz0agaAFJZJGZS4RxwNkWL934H/nip/ameLEvxylbsU0x8]AMGRtHmlzYuolmGovqyeKhpDOT+H0am7tG2LvzKHoyVN8Kuck/qb/JAX/
xV1mHcLp3iPma8q+9xboP81YeU06c0vy bzA2n7QI37852WyAA
Invoke result: 200
2025/5/29 10:43:25
AK ID: STS.NVR3xxx P8KrfgTK, AK Secret: 6hsZk211xxx
PeZZ8NHSBeQo, STS Token: CAISxAJ1q6Ft5B2yf5jIr5XneN+ChrwS1It+pcEXr0DkFNMReiaL/qTz2IHhMeXZoA+4YsPu2mmFW6/sdlqdJQpp/QkjJRNF20plM7VtBkQt5I
pbng4YfgbiJREKxaXeirukwDsz9SNTCA JlhHL91N0vCGlgpPtpNIRZ4o8I3LGbYMe3XUiTmM3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWsMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif51/DXQEIvUIYbreL6L9mNxRkY6UgHkpJ
vCxxBmi0fUW5fe3VvPUtVVk900y3LAsg 3PjcmYvy1dKzlhvI856BxNHBq+A748VMgj01iX9IIPPtJO3TwsQdpz0agaAFJZJGZS4RxwNkWL934H/nip/ameLEvxylbsU0x8]AMGRtHmlzYuolmGovqyeKhpDOT+H0am7tG2LvzKHoyVN8Kuck/qb/JAX/
xV1mHcLp3iPma8q+9xboP81YeU06c0vy bzA2n7QI37852WyAA
Invoke result: 200
2025/5/29 11:43:25
AK ID: STS.NWuFxxx BwvauFkU, AK Secret: 6fBbjmvd2T
ChJTi9gPixZE, STS Token: CAISxAJ1q6Ft5B2yf5jIrSTAG/74uLB13aeARFwQlYXe/lNmoPAtzz2IHhMeXZoA+4YsPu2mmFW6/sdlqdJQpp/QkjJRNF20plM7VtdxAt7I
pbng4YfgbiJREKxaXeirukwDsz9SNTCA iJlhHL91N0vCGlgpPtpNIRZ4o8I3LGbYMe3XUiTmM3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWsMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif51/DXQEIvUIYbreL6L9mNxRkY6UgHkpJ
vCxxBmi0fUW5fe3VvPUtVVk900y3LAtQ JU1tKDlwTxgBGOFKIQQrKj9PMSqhAcLJtS6MDE7NJKbt10KxV8Qdpz0agaAE7zrIhzsIKFMhIAyquB0Z8/YXeYdmswQUMbqmr+0gX306/0U9iWS612r6AalQSomcAD0eijKFnE8PFyx3YifekzIBCjr17TR
ujPRXpMzvxuXfvzz9eszDB0o0AXX5gTQ IKDI4Y7necJANrPiAA
Invoke result: 200
2025/5/29 11:45:05
AK ID: STS.NWuPxxx bwvauFkU, AK Secret: 6fBbjmvd2T
ChJTi9gPixZE, STS Token: CAISxAJ1q6Ft5B2yf5jIrSTAG/74uLB13aeARFwQlYXe/lNmoPAtzz2IHhMeXZoA+4YsPu2mmFW6/sdlqdJQpp/QkjJRNF20plM7VtdxAt7I
pbng4YfgbiJREKxaXeirukwDsz9SNTCA iJlhHL91N0vCGlgpPtpNIRZ4o8I3LGbYMe3XUiTmM3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWsMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif51/DXQEIvUIYbreL6L9mNxRkY6UgHkpJ
vCxxBmi0fUW5fe3VvPUtVVk900y3LAtQ U1U1tKDlwTxgBGOFKIQQrKj9PMSqhAcLJtS6MDE7NJKbt10KxV8Qdpz0agaAE7zrIhzsIKFMhIAyquB0Z8/YXeYdmswQUMbqmr+0gX306/0U9iWS612r6AalQSomcAD0eijKFnE8PFyx3YifekZIBCjr17TR
ujPRXpMzvxuXfvzz9eszDB0o0AXX5gTQ IKDI4Y7necJANrPiAA
Invoke result: 200
All tasks completed.ログ出力に基づく分析:
-
1 回目の呼び出しでは、キャッシュは空です。システムは設定に基づいて認証情報を取得してキャッシュに保存します。
-
2 回目の呼び出しでは 1 回目と同じ認証情報が使用されており、キャッシュから取得されたことが分かります。
-
3 回目の呼び出しでは、キャッシュされた認証情報の有効期限が切れています。有効期限 (
RoleSessionExpiration) は 3,600 秒ですが、この呼び出しは 1 回目から 4,200 秒後に行われています。そのため、SDK の自動更新メカニズムによって新しい認証情報が取得され、キャッシュが更新されます。 -
4 回目の呼び出しでは 3 回目と同じ認証情報が使用されており、キャッシュが更新されたことが確認できます。
関連ドキュメント
-
RAM の基本的な概念の概要については、「基本的な概念」をご参照ください。
-
AccessKey を作成するには、「AccessKey の作成」をご参照ください。
-
プログラムで RAM ユーザー、AccessKey、RAM ロールを作成し、権限ポリシーを定義して権限を付与するには、「RAM SDK 概要」をご参照ください。
-
プログラムでロールを引き受けるには、「STS SDK 概要」をご参照ください。
-
RAM および STS API の詳細については、「API リファレンス」をご参照ください。