Alibaba Cloud SDK を使用する場合、AccessKey ペアや Security Token Service (STS) トークンなどの認証情報は、Credentials ツールによって管理されます。このトピックでは、Credentials ツールがサポートする認証情報のタイプと、その設定方法について説明します。
背景
認証情報は、Alibaba Cloud サービスへのアクセス時にユーザーのアイデンティティを検証します。主な認証情報の種類は次のとおりです。
-
AccessKey ペアは、Alibaba Cloud アカウントまたは RAM ユーザー用の永続的な認証情報です。AccessKey ID と AccessKey Secret で構成されます。
-
STS トークンは、有効期間と権限スコープを設定できる RAM ロール用の一時的な認証情報です。詳細については、STS とはをご参照ください。
-
ベアラートークンは、認証と認可に使用されます。
前提条件
-
Node.js 8.5.0 以降がインストールされていること。
-
Alibaba Cloud SDK V2.0 が設定されていること。「IDE で Alibaba Cloud SDK for Node.js を使用する」をご参照ください。
認証情報ツールのインストール
次の npm コマンドを実行して、パッケージをインストールします。
npm install @alicloud/credentials
すべての認証情報タイプに対応するため、最新バージョンを使用してください (Releases · aliyun/credentials-nodejs · GitHub)。
認証情報パラメーター
@alicloud/credentials モジュールの Config コンストラクターを使用して認証情報を設定します。type パラメーターは必須で、他のどのパラメーターが適用されるかを決定します。次の表に、有効な type 値とそのパラメーターを示します。√ = 必須、- = オプション、× = サポート対象外。
下記の認証情報タイプとパラメーターのみがサポートされています。
|
type |
access_key |
sts |
ram_role_arn |
ecs_ram_role |
oidc_role_arn |
credentials_uri |
bearer |
|
accessKeyId: アクセスキー ID。 |
√ |
√ |
√ |
× |
× |
× |
× |
|
accessKeySecret: シークレットアクセスキー。 |
√ |
√ |
√ |
× |
× |
× |
× |
|
securityToken: Security Token Service (STS) トークン。 |
× |
√ |
- |
× |
× |
× |
× |
|
roleArn: RAM ロールの Alibaba Cloud リソースネーム (ARN)。 |
× |
× |
√ |
× |
√ |
× |
× |
|
roleSessionName: セッションのカスタム名。デフォルトのフォーマットは |
× |
× |
- |
× |
- |
× |
× |
|
roleName: RAM ロールの名前。 |
× |
× |
× |
- |
× |
× |
× |
|
disableIMDSv1: セキュリティ強化モード (IMDSv2) を強制するかどうかを指定します。デフォルト値: |
× |
× |
× |
- |
× |
× |
× |
|
bearerToken: ベアラートークン。 |
× |
× |
× |
× |
× |
× |
√ |
|
policy: カスタムポリシー。 |
× |
× |
- |
× |
- |
× |
× |
|
roleSessionExpiration: セッションの有効期限 (秒単位)。デフォルト値: 3600。 |
× |
× |
- |
× |
- |
× |
× |
|
oidcProviderArn: OpenID Connect (OIDC) ID プロバイダーの ARN。 |
× |
× |
× |
× |
√ |
× |
× |
|
oidcTokenFilePath: OpenID Connect (OIDC) トークンファイルのパス。 |
× |
× |
× |
× |
√ |
× |
× |
|
externalId: 混乱した代理問題を軽減するための外部 ID。外部 ID を使用して混乱した代理問題を防ぐ。 |
× |
× |
- |
× |
× |
× |
× |
|
credentialsURI: 認証情報の URI。 |
× |
× |
× |
× |
× |
√ |
× |
|
STS エンドポイントです。VPC エンドポイントとパブリックエンドポイントの両方をサポートします。利用可能なエンドポイント:「エンドポイント」。デフォルト: |
× |
× |
- |
× |
- |
× |
× |
|
timeout: HTTP リクエストの読み取りタイムアウト (ミリ秒単位)。デフォルト値は 5000 です。 |
× |
× |
- |
- |
- |
- |
× |
|
connectTimeout: HTTP リクエストの接続タイムアウト (ミリ秒単位)。デフォルト値は 10000 です。 |
× |
× |
- |
- |
- |
- |
× |
クレデンシャルクライアントの初期化
以下のセクションでは、Credentials ツールの使用方法を示すコード例を提供します。要件に基づいてメソッドを選択できます。
-
プロジェクトコード内に
AccessKeyをプレーンテキストで保存しないでください。キーが漏洩すると、アカウント配下のすべてのリソースが侵害されます。代わりに、環境変数または設定ファイルに保存してください。 -
認証情報ツールにはシングルトンパターンを実装してください。これにより、組み込みの認証情報キャッシュが有効になり、過剰な API コールによるレート制限を防止できます。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。
メソッド 1:デフォルトの認証情報プロバイダーチェーン
パラメーターを指定せずに認証情報クライアントを初期化すると、デフォルト認証情報プロバイダーチェーンが有効になります。
const Credential = require('@alicloud/credentials');
// デフォルトの認証情報プロバイダーチェーンを使用します
const credentialClient = new Credential.default();
const credential = credentialClient.getCredential();
credential.then(credential => {
console.log(credential);
});
import Credential from '@alicloud/credentials';
const credential = new Credential();
credential.getCredential().then(credential => {
console.log(credential);
});API 呼び出し
方法 2:アクセスキーの使用
Credentials ツールは、AccessKey をアクセス認証情報として使用します。
Alibaba Cloud アカウントは、すべてのリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩すると、システムに重大なセキュリティ上の脅威をもたらします。Alibaba Cloud アカウントの AccessKey ペアを使用することは推奨しません。
最小限の必要な権限が付与された RAM ユーザーの AccessKey ペアを使用することを推奨します。
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
// 認証情報のタイプ
type: 'access_key',
// 環境変数から取得した AccessKey ID
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// 環境変数から取得した AccessKey Secret
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
});
const credentialClient = new Credential.default(credentialsConfig);
import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
// 認証情報のタイプ
type: 'access_key',
// 環境変数から取得した AccessKey ID
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// 環境変数から取得した AccessKey Secret
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
});
const credentialClient = new Credential(credentialsConfig);API 呼び出し
方法 3:STS トークンの使用
Credentials ツールは、提供された静的な STS トークンをアクセス認証情報として使用します。
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
type: 'sts',
// 環境変数から取得した AccessKey ID
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// 環境変数から取得した AccessKey Secret
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
// 環境変数から取得したセキュリティトークン
securityToken: process.env.ALIBABA_CLOUD_SECURITY_TOKEN,
});
const cred = new Credential.default(credentialsConfig);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
// 認証情報タイプ
type: 'access_key',
// 環境変数から取得した AccessKey ID
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// 環境変数から取得した AccessKey Secret
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
});
const credentialClient = new Credential(credentialsConfig);
API 呼び出し
メソッド 4: AccessKey と RAM ロール ARN
このメソッドは内部で STS を使用します。RAM ロール ARN を指定すると、認証情報ツールは STS から STS トークンを取得します。policy パラメーターを使用すると、ロールの権限をさらに制限できます。
const { default: Credential, Config } = require('@alicloud/credentials');
const credentialsConfig = new Config({
type: 'ram_role_arn',
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
accessKeySecret: process.env.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>',
// オプション。RAM ロールの権限を制限するインラインポリシー。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
policy: '<Policy>',
roleSessionExpiration: 3600,
});
const cred = new Credential(credentialsConfig);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'ram_role_arn',
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
accessKeySecret: process.env.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>',
// オプション。RAM ロールの権限を制限するインラインポリシー。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
policy: '<Policy>',
roleSessionExpiration: 3600,
});
const cred = new Credential(credentialsConfig);API 呼び出しメソッド
メソッド 5:ECS インスタンスの RAM ロール
インスタンス RAM ロールを ECS インスタンスまたはエラスティックコンテナインスタンスにアタッチします。インスタンス上のアプリケーションは、認証情報ツールを使用して、そのロールの STS トークンを自動的に取得できます。
デフォルトでは、認証情報ツールはセキュリティ強化モード (IMDSv2) で ECS メタデータサーバーにアクセスします。エラーが発生した場合は、通常モードにフォールバックします。この動作は、disableIMDSv1 パラメーターまたは ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数で制御できます。
-
false(デフォルト): 失敗時に通常モードにフォールバックします。 -
true: セキュリティ強化モードのみを使用し、失敗時に例外をスローします。
IMDSv2 のサポートは、サーバーの設定に依存します。
環境変数 ALIBABA_CLOUD_ECS_METADATA_DISABLED=true を設定することで、ECS インスタンスメタデータ経由の認証情報アクセスを無効にすることもできます。
-
セキュリティ強化モードには、認証情報ライブラリバージョン 2.3.1 以降が必要です。
-
ECS インスタンスメタデータの概要: インスタンスメタデータ。
-
ECS またはエラスティックコンテナインスタンスに RAM ロールを付与するには: ステップ 1: RAM ロールを作成する および ECI インスタンスにインスタンス RAM ロールを付与する。
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
type: 'ecs_ram_role',
// オプション。ECS RAM ロール名。指定しない場合、システムが自動的に取得します。リクエストを減らすため、名前の指定を推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数でも設定できます。
roleName: '<RoleName>',
// オプション。デフォルト: false。true の場合、セキュリティ強化モードを強制します。false の場合、システムはまずセキュリティ強化モードを試行し、失敗した場合は通常モード (IMDSv1) にフォールバックします。
// disableIMDSv1: true,
});
const cred = new Credential.default(credentialsConfig);
import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'ecs_ram_role',
// オプション。ECS RAM ロール名。指定しない場合、システムが自動的に取得します。リクエストを減らすため、名前の指定を推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数でも設定できます。
roleName: '<RoleName>',
// オプション。デフォルト: false。true の場合、セキュリティ強化モードを強制します。false の場合、システムはまずセキュリティ強化モードを試行し、失敗した場合は通常モード (IMDSv1) にフォールバックします。
// disableIMDSv1: true,
});
const credentialClient = new Credential(credentialsConfig);API 呼び出し
メソッド 6: OIDCRoleArn の使用
OIDC を使用してOIDC プロバイダー用の RAM ロールを作成した場合は、OIDC プロバイダー ARN、OIDC トークン、および RAM ロール ARN を Credentials SDK に渡します。SDK は AssumeRoleWithOIDC API を呼び出して STS トークンを取得します。これらの認証情報は自動更新に対応しています。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。例えば、RRSA が有効な ACK クラスターでは、SDK は Pod 環境変数から OIDC 設定を読み取り、STS トークンを取得して Alibaba Cloud サービスにアクセスします。
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.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,
});
const credentialClient = new Credential.default(credentialsConfig);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = 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,
});
const credentialClient = new Credential(credentialsConfig);API 呼び出し
メソッド 7:URI 認証情報
STS サービスを URI 経由で公開すると、外部サービスは AccessKey ペアを直接処理することなく STS トークンを取得できます。認証情報ツールは、指定された URI から STS トークンを取得し、それをアクセス認証情報として使用します。自動更新にも対応しています。詳細については、セッションタイプ認証情報の自動更新メカニズムをご参照ください。
const Credential = require('@alicloud/credentials');
const config = new Credential.Config({
type: 'credentials_uri',
// 認証情報を取得するエンドポイント。例: http://local_or_remote_uri/。 ALIBABA_CLOUD_CREDENTIALS_URI 環境変数でも設定できます。
credentialsURI: '<CredentialsUri>',
});
const credentialClient = new Credential(config);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'credentials_uri',
// 認証情報を取得するエンドポイント。例: http://local_or_remote_uri/。 ALIBABA_CLOUD_CREDENTIALS_URI 環境変数でも設定できます。
credentialsURI: '<CredentialsUri>',
});
const credentialClient = new Credential(credentialsConfig);URI 応答は、次の要件を満たしている必要があります:
-
ステータスコードは 200 です。
-
レスポンスボディのフォーマットは次のとおりです。
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
API 呼び出し
方法 8:ベアラー トークンの使用
現在、ベアラートークンをサポートしているのは Cloud Call Center (CCC) のみです。
const Credential = require('@alicloud/credentials');
const config = new Credential.Config({
type: 'bearer',
// ご自身のベアラートークンに置き換えてください。
bearerToken: '<BearerToken>',
});
const credentialClient = new Credential(config);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'bearer',
// ご自身のベアラートークンに置き換えてください。
bearerToken: '<BearerToken>',
});
const credentialClient = new Credential(credentialsConfig);API 呼び出し
デフォルトの認証情報プロバイダーチェーン
デフォルトの認証情報プロバイダーチェーンを使用することで、環境をまたいで同じコードを使用し、外部設定を通じて認証情報の取得を制御できます。パラメーターを指定せずに new Credential() を呼び出すと、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 ロール
より優先度の高い認証情報が見つからない場合、SDK は ECS インスタンス RAM ロールから認証情報を取得します。拡張モード (IMDSv2) でインスタンスメタデータサービスにアクセスして、STS トークンを取得します。これには、ロール名用に 1 つ、認証情報用に 1 つ、合計 2 つのリクエストが必要です。これを 1 つのリクエストに減らすには、ALIBABA_CLOUD_ECS_METADATA 環境変数でロール名を設定します。拡張モードが失敗した場合、通常モードにフォールバックします。この動作は ALIBABA_CLOUD_IMDSV1_DISABLE で制御します:
-
false: 失敗した場合、通常モードにフォールバックします。 -
true: 拡張モードのみを使用し、失敗した場合は例外をスローします。
IMDSv2 のサポートは、インスタンスメタデータサービスの設定に依存します。
ECS インスタンスメタデータからの認証情報の取得を無効にするには、 ALIBABA_CLOUD_ECS_METADATA_DISABLED=true を設定します。
-
ECS インスタンスメタデータの概要については、「インスタンスメタデータ」をご参照ください。
-
RAM ロールを ECS または ECI インスタンスに付与するには、「ステップ 1:RAM ロールの作成」および「ECI インスタンスへのインスタンス RAM ロールの付与」をご参照ください。
5. 認証情報 URI
認証情報が見つからない場合、Credentials ツールは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数をチェックします。この変数が存在し、有効な URI を指している場合、Credentials ツールはこの URI にアクセスして STS トークンをデフォルトの認証情報として取得します。
セッション認証情報の自動更新
セッション認証情報 (ram_role_arn、ecs_ram_role、oidc_role_arn、および credentials_uri) には、組み込みの自動更新機能が含まれています。最初の取得時に、認証情報ツールは認証情報をキャッシュします。後続のリクエストでは、キャッシュされた値が失効するまでその値が返され、失効した時点で新しい認証情報が自動的にフェッチされます。
ecs_ram_role 認証情報の場合、認証情報ツールは失効する 15 分前に事前に更新します。
次の例では、シングルトンパターンを使用して認証情報クライアントを作成し、異なる間隔で認証情報を取得して自動更新を検証し、OpenAPI 呼び出しを通じて有効性を確認します。
const Credential = require('@alicloud/credentials');
const Ecs20140526 = require('@alicloud/ecs20140526');
const { Config } = require('@alicloud/openapi-client');
const { RuntimeOptions } = require('@alicloud/tea-util');
// 環境変数を取得します。
const accessKeyId = process.env.ALIBABA_CLOUD_ACCESS_KEY_ID;
const accessKeySecret = process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET;
const roleArn = process.env.ALIBABA_CLOUD_ROLE_ARN;
/**
* Credential のシングルトンクラスは、Alibaba Cloud 認証情報インスタンスを管理します。
*/
class CredentialClient {
constructor() {
if (!CredentialClient.instance) {
var credentialsConfig = new Credential.Config({
type: 'ram_role_arn',
accessKeyId: accessKeyId,
accessKeySecret: accessKeySecret,
roleArn: roleArn,
roleSessionName: 'RoleSessionNameTest',
roleSessionExpiration: 3600,
});
this.credentialsClient = new Credential.default(credentialsConfig);
CredentialClient.instance = this;
}
return CredentialClient.instance;
}
static getInstance() {
return new CredentialClient().credentialsClient;
}
}
/**
* ECS クライアントのシングルトンクラスは、ECS クライアントインスタンスを管理します。
*/
class EcsClient {
constructor(credentialClient) {
if (!EcsClient.instance) {
const config = new Config({
endpoint: 'ecs.cn-hangzhou.aliyuncs.com',
credential: credentialClient
});
this.ecsClient = new Ecs20140526.default(config);
EcsClient.instance = this;
}
return EcsClient.instance;
}
static getInstance(credentialClient) {
return new EcsClient(credentialClient).ecsClient;
}
}
/**
* タスクロジックを実行します。
*/
async function executeTask() {
try {
const credentialClient = CredentialClient.getInstance();
const credential = await credentialClient.getCredential();
console.log(new Date());
console.log(`AK ID: ${credential.accessKeyId}`);
console.log(`AK Secret: ${credential.accessKeySecret}`);
console.log(`STS Token: ${credential.securityToken}`);
// この例では、ECS API を呼び出して認証情報の有効性を検証します。必要に応じてこれを変更してください。
const ecsClient = EcsClient.getInstance(credentialClient);
const request = new Ecs20140526.DescribeRegionsRequest();
const runtime = new RuntimeOptions({});
const response = await ecsClient.describeRegionsWithOptions(request, runtime);
console.log(`Invoke result: ${response.statusCode}`);
} catch (error) {
throw new Error(`ECS client execution failed: ${error.message}`, { cause: error });
}
}
/**
* タイマーを使用してタスクの実行をスケジュールします。
*/
function scheduleTasks() {
// タスクを一度すぐに実行します。
executeTask();
// 後続のタスクに遅延を設定します。
setTimeout(executeTask, 600 * 1000); // 2 回目の実行:600 秒後。
setTimeout(executeTask, 4200 * 1000); // 3 回目の実行:4,200 秒後。
setTimeout(executeTask, 4300 * 1000); // 4 回目の実行:4,300 秒後。
}
// タスクのスケジューリングを開始します。
scheduleTasks();
import Credential, { Config as CredentialsConfig } from '@alicloud/credentials';
import Ecs20140526, * as $Ecs20140526 from '@alicloud/ecs20140526';
import { Config } from '@alicloud/openapi-client';
import { RuntimeOptions } from '@alicloud/tea-util';
// 環境変数を取得します。
const accessKeyId: string | undefined = process.env.ALIBABA_CLOUD_ACCESS_KEY_ID;
const accessKeySecret: string | undefined = process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET;
const roleArn: string | undefined = process.env.ALIBABA_CLOUD_ROLE_ARN;
if (!accessKeyId || !accessKeySecret || !roleArn) {
throw new Error('Missing required environment variables.');
}
/**
* Credential のシングルトンクラスは、Alibaba Cloud 認証情報インスタンスを管理します。
*/
class CredentialClient {
private static instance: CredentialClient;
private readonly credentialsClient: InstanceType<typeof Credential>;
private constructor() {
const credentialsConfig = new CredentialsConfig({
type: 'ram_role_arn',
accessKeyId,
accessKeySecret,
roleArn,
roleSessionName: 'RoleSessionNameTest',
roleSessionExpiration: 3600,
});
this.credentialsClient = new Credential(credentialsConfig);
}
static getInstance(): InstanceType<typeof Credential> {
if (!CredentialClient.instance) {
CredentialClient.instance = new CredentialClient();
}
return CredentialClient.instance.credentialsClient;
}
}
/**
* ECS クライアントのシングルトンクラスは、ECS クライアントインスタンスを管理します。
*/
class EcsClient {
private static instance: EcsClient;
private readonly ecsClient: InstanceType<typeof Ecs20140526>;
private constructor(credentialClient: InstanceType<typeof Credential>) {
const config = new Config({
endpoint: 'ecs.cn-hangzhou.aliyuncs.com',
credential: credentialClient
});
this.ecsClient = new Ecs20140526(config);
}
static getInstance(credentialClient: InstanceType<typeof Credential>): InstanceType<typeof Ecs20140526> {
if (!EcsClient.instance) {
EcsClient.instance = new EcsClient(credentialClient);
}
return EcsClient.instance.ecsClient;
}
}
/**
* タスクロジックを実行します。
*/
async function executeTask(): Promise<void> {
try {
const credentialClient = CredentialClient.getInstance();
const credential = await credentialClient.getCredential();
console.log(new Date());
console.log(`AK ID: ${credential.accessKeyId}`);
console.log(`AK Secret: ${credential.accessKeySecret}`);
console.log(`STS Token: ${credential.securityToken}`);
// この例では、ECS API を呼び出して認証情報の有効性を検証します。必要に応じてこれを変更してください。
const ecsClient = EcsClient.getInstance(credentialClient);
const request = new $Ecs20140526.DescribeRegionsRequest();
const runtime = new RuntimeOptions({});
const response = await ecsClient.describeRegionsWithOptions(request, runtime);
console.log(`Invoke result: ${response.statusCode}`);
} catch (error) {
throw new Error(`ECS client execution failed: ${error}`);
}
}
/**
* タイマーを使用してタスクの実行をスケジュールします。
*/
function scheduleTasks(): void {
// タスクを一度すぐに実行します。
executeTask();
// 後続のタスクに遅延を設定します。
setTimeout(executeTask, 600 * 1000); // 2 回目の実行:600 秒後。
setTimeout(executeTask, 4200 * 1000); // 3 回目の実行:4,200 秒後。
setTimeout(executeTask, 4300 * 1000); // 4 回目の実行:4,300 秒後。
}
// タスクのスケジューリングを開始します。
scheduleTasks();2025-05-28T09:22:29.584Z
AK ID: STS.NVS9xxx7DRbao
AK Secret: 9SoQxxxmVjVsED9ad47rcgMaw5XyQyXx
STS Token:
CAISyQJ1q6Ft5B2yfSjIr5Xmcu/irrxq0pWvU0PZhvVtS7hovafKjTz2IHhMeXZoA+4YsPw2mmFW6/sdlrpJTJtIfkHfdsp36LJe9A6dbpHd4xc1LGed0s/LI3OaLjKm9u2wCryLYbGwU/OpbE++5U0X6LDmdDKkckW40JmS8/BOZcgWWQ/KB1gvRq
0hRG1YpdQdKGHa0xxxWg0/ks0aH1war1bBL+tqofMP9MfMBZskvD42Hu8VtbbfE3SJq7BxHybx71qQs+02c5onAXAELvUvYa7OKo4MyCVBjBKEhALNBoeL7kfBobmFAAkgwYnynVMMisES3LOiIqKOsk1MdI9Cywly2y
vfiZZ1prmk1pV68xxxczc4yvhD2nuNe7rmc9Z3/JHusVmo7LiTxqAARdkoKCeYBvLk0ZFWccCiM0ZvdnRtv0VDOUfD1zQELQGL+xB5NrBmdzq2ePjFJbrkBGmy5EXD714jknyzM4lFic2dUQMi14NCHMVDVjGAf0qUs
F+PQW58jGb32fmFxxxTXOx82sdRQqW0/vTd2KQmIAA=
Invoke result: 200
2025-05-28T09:32:28.137Z
AK ID: STS.NVS9xxx7DRbao
AK Secret: 9SoQxxxmVjVsED9ad47rcgMaw5XyQyXx
STS Token:
CAISyQJ1q6Ft5B2yfSjIr5Xmcu/irrxq0pWvU0PZhvVtS7hovafKjTz2IHhMeXZoA+4YsPw2mmFW6/sdlrpJTJtIfkHfdsp36LJe9A6dbpHd4xc1LGed0s/LI3OaLjKm9u2wCryLYbGwU/OpbE++5U0X6LDmdDKkckW40JmS8/BOZcgWWQ/KB1gvRq
0hRG1YpdQdKGHa0xxxWg0/ks0aH1war1bBL+tqofMP9MfMBZskvD42Hu8VtbbfE3SJq7BxHybx71qQs+02c5onAXAELvUvYa7OKo4MyCVBjBKEhALNBoeL7kfBobmFAAkgwYnynVMMisES3LOiIqKOsk1MdI9Cywly2y
vfiZZ1prmk1pV68xxxczc4yvhD2nuNe7rmc9Z3/JHusVmo7LiTxqAARdkoKCeYBvLk0ZFWccCiM0ZvdnRtv0VDOUfD1zQELQGL+xB5NrBmdzq2ePjFJbrkBGmy5EXD714jknyzM4lFic2dUQMi14NCHMVDVjGAf0qUs
F+PQW58jGb32fmFxxxTXOx82sdRQqW0/vTd2KQmIAA=
Invoke result: 200
2025-05-28T10:32:29.771Z
AK ID: STS.NVuaxxxLFiPw8
AK Secret: 5dsoxxxpA5pCzfrek4KforS8MnJ6qHR9
STS Token:
CAISyQJ1q6Ft5B2yfSjIr5XAKsjd241w4PqgY1P2gDUvb8NqhpXc2jz2IHhMeXZoA+4YsPw2mmFW6/sdlrpJTJtIfkHfdsp36LJe9A6dbpHd4yVKL2Gd0s/LI3OaLjKm9u2wCryLYbGwU/OpbE++5U0X6LDmdDKkckW40JmS8/BOZcgWWQ/KB1gvRq
0hRG1YpdQdKGHa0xxxWg0/ks0aH1war1bBL+tqofMP9MfMBZskvD42Hu8VtbbfE3SJq7BxHybx71qQs+02c5onAXAELvUvYa7OKo4MyCVBjBKEhALNBoeL7kfBobmFAAkgwYnynVMMisES3LOjIqKOsk+Mdk9CiWv2y
vfiZZ1prmk1pV68xxxczc4yvhD2nuNe7rmc9Z3/KpUoQEo7LiTxqAAUyV7F+kpLHRG/yHw3JaVz14hqSj2hmxxkwgczUWIkpBLKHLeW0iI3sp2LNQO6iEAImLpSE0nRVBbcutIqxEuFzAs607jgOjHakTF7UZNoKVV
wb42xR4s4ThGd2PxxxqoUsrKfCq5lHiUiDq6L1VIAA=
Invoke result: 200
2025-05-28T10:34:08.130Z
AK ID: STS.NVuaxxxLFiPw8
AK Secret: 5dsoxxxpA5pCzfrek4KforS8MnJ6qHR9
STS Token:
CAISyQJ1q6Ft5B2yfSjIr5XAKsjd241w4PqgY1P2gDUvb8NqhpXc2jz2IHhMeXZoA+4YsPw2mmFW6/sdlrpJTJtIfkHfdsp36LJe9A6dbpHd4yVKL2Gd0s/LI3OaLjKm9u2wCryLYbGwU/OpbE++5U0X6LDmdDKkckW40JmS8/BOZcgWWQ/KB1gvRq
0hRG1YpdQdKGHa0xxxWg0/ks0aH1war1bBL+tqofMP9MfMBZskvD42Hu8VtbbfE3SJq7BxHybx71qQs+02c5onAXAELvUvYa7OKo4MyCVBjBKEhALNBoeL7kfBobmFAAkgwYnynVMMisES3LOjIqKOsk+Mdk9CiWv2y
vfiZZ1prmk1pV68xxxczc4yvhD2nuNe7rmc9Z3/KpUoQEo7LiTxqAAUyV7F+kpLHRG/yHw3JaVz14hqSj2hmxxkwgczUWIkpBLKHLeW0iI3sp2LNQO6iEAImLpSE0nRVBbcutIqxEuFzAs607jgOjHakTF7UZNoKVV
wb42xR4s4ThGd2PxxxqoUsrKfCq5lHiUiDq6L1VIAA=
Invoke result: 200
以下にログ結果の分析を示します:
最初の呼び出しでは、認証情報がキャッシュされていません。そのため、システムは設定に基づいて認証情報を取得します。認証情報が取得されると、キャッシュに保存されます。
2 回目の呼び出しで使用される認証情報は、最初の呼び出しと同じです。これは、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 リファレンス」をご参照ください。