Alibaba Cloud SDK を使用して API オペレーションを呼び出してクラウド リソースを管理する場合は、有効なクレデンシャル情報を構成する必要があります。 Alibaba Cloud の Credentials ツールは、使い易い機能セットを提供し、デフォルトのクレデンシャル、AccessKey ペア、Security Token Service (STS) トークンなど、様々な種類のクレデンシャルをサポートしています。 Credentials ツールは、クレデンシャルの取得と管理に役立ちます。 このトピックでは、異なる種類のクレデンシャルを構成する方法と、Credentials ツールがデフォルトのクレデンシャルを取得する順序について説明します。 Alibaba Cloud SDK でのクレデンシャルの構成と管理について、徹底的に理解することができます。 これにより、クラウド リソースに対する操作を効率的かつ安全な方法で実行できるようになります。
背景情報
クレデンシャルとは、ユーザーの身元を証明するために使用される一連の情報です。 システムにログインする際には、有効なクレデンシャルを使用して身元認証を完了する必要があります。 一般的に使用されるクレデンシャルの種類は次のとおりです。
Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ペア。 AccessKey ペアは永続的に有効で、AccessKey ID と AccessKey シークレットで構成されます。
RAM ロールの STS トークン。 STS トークンは一時的なクレデンシャルです。 STS トークンの有効期間とアクセス権限を指定できます。 詳細については、「STS とは」をご参照ください。
ベアラトークン。 ID 認証と承認に使用されます。
前提条件
PHP 5.6 以降がインストールされていること。 Transport Layer Security (TLS) を使用して cURL 7.16.2 以降をインストールし、cURL 拡張機能を有効にすることをお勧めします。
Alibaba Cloud SDK V2.0 がインストールされていること。
Credentials ツールのインストール
システムに Composer をグローバルにインストールしている 場合は、プロジェクトのディレクトリで次のコマンドを実行して、PHP 用 Alibaba Cloud Credentials を依存関係としてインストールします。
composer require alibabacloud/credentialsPHP 用 Alibaba Cloud Credentials の最新バージョンを使用することをお勧めします。 これにより、すべてのクレデンシャルがサポートされます。
PHP 用 Alibaba Cloud Credentials のすべてのリリースバージョンについては、「CHANGELOG.md」をご参照ください。
Credentials ツールのパラメーター
AlibabaCloud\Credentials\Credential\Config クラスで Credentials ツールのパラメーターが定義されています。 クレデンシャルの種類は、構成で必須パラメーターである type パラメーターで指定されます。 クレデンシャルの種類を決定したら、クレデンシャルの種類に基づいてパラメーターを構成します。 次の表は、type パラメーターの有効な値と、各クレデンシャルの種類でサポートされているパラメーターを示しています。 表の中で、チェックマーク(✓)はパラメーターが必須であることを示し、ハイフン(-)はパラメーターがオプションであることを示し、X マーク(×)はパラメーターがサポートされていないことを示します。
次の表に記載されていないパラメーターは使用しないことをお勧めします。
type | access_key | sts | ram_role_arn | ecs_ram_role | oidc_role_arn | credentials_uri | bearer |
accessKeyId: AccessKey ID です。 | ✓ | ✓ | ✓ | × | × | × | × |
accessKeySecret: AccessKey シークレット。 | ✓ | ✓ | ✓ | × | × | × | × |
securityToken: Security Token Service (STS) トークン。 | × | ✓ | - | × | × | × | × |
roleArn: Resource Access Management (RAM) ロールのAlibaba Cloud Resource Name (ARN)。 | × | × | ✓ | × | ✓ | × | × |
roleSessionName: カスタムセッションの名前。デフォルトのフォーマットは | × | × | - | × | - | × | × |
roleName: RAM ロールの名前を指定します。 | × | × | × | - | × | × | × |
disableIMDSv1: セキュリティ強化モード(IMDSv2)を強制的に使用するかどうかを指定します。このパラメーターを true に設定すると、セキュリティ強化モード(IMDSv2)が使用されます。デフォルト値: | × | × | × | - | × | × | × |
bearerToken: ベアラトークン。 | × | × | × | × | × | × | ✓ |
policy: カスタムポリシー。 | × | × | - | × | - | × | × |
roleSessionExpiration: セッションタイムアウト期間。デフォルト値:3600。単位:秒。 | × | × | - | × | - | × | × |
oidcProviderArn: OpenID Connect(OIDC)ID プロバイダー(IdP)の ARN です。 | × | × | × | × | ✓ | × | × |
oidcTokenFilePath: OIDC トークンへの絶対パス。 | × | × | × | × | ✓ | × | × |
externalId: ロールの外部 ID。Confused Deputy 問題を防ぐために使用されます。詳細については、「外部 ID を使用して Confused Deputy 問題を防ぐ」をご参照ください。 | × | × | - | × | × | × | × |
credentialsURI: 認証情報の URI です。 | × | × | × | × | × | ✓ | × |
STSEndpoint: STS のエンドポイント。VPC エンドポイントとインターネットエンドポイントがサポートされています。デフォルト値: | × | × | - | × | - | × | × |
timeout: HTTP 読み取りリクエストのタイムアウト期間。デフォルト値:5000。単位:ミリ秒。 | × | × | - | - | - | - | × |
connectTimeout: HTTP 接続リクエストのタイムアウト期間です。デフォルト値:10000。単位:ミリ秒。 | × | × | - | - | - | - | × |
Credentials クライアントの初期化
ビジネス要件に基づいて、以下のいずれかの方法で Credentials クライアントを初期化できます:
プロジェクトでプレーンテキストの AccessKey ペアを使用すると、コードリポジトリの権限管理が不適切なために AccessKey ペアが漏洩する可能性があります。これにより、AccessKey ペアが属するアカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。 AccessKey ペアは環境変数または構成ファイルに保存することをお勧めします。
Credentials クライアントはシングルインスタンスモードで初期化することをお勧めします。このモードでは、SDK の資格情報キャッシュ機能が有効になるだけでなく、複数の API 呼び出しによって発生するトラフィック制御の問題とパフォーマンスリソースの浪費を効果的に防ぐこともできます。詳細については、この Topic の「セッション資格情報の自動更新メカニズム」セクションをご参照ください。
方法1:デフォルトの認証情報プロバイダーチェーンの使用
Credentials クライアントを初期化するメソッドを指定しない場合、デフォルトの資格情報プロバイダーチェーンが使用されます。詳細については、「デフォルトの資格情報プロバイダーチェーン」をご参照ください。
<?php
use AlibabaCloud\Credentials\Credential;
// vendor ディレクトリの autoload.php ファイルを使用して、Composer のオートローディングを有効にします。
require_once 'vendor/autoload.php';
// メソッドを指定せずに Credentials クライアントを初期化します。
$credClient = new Credential();
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
例
方法2: AccessKey ペアを使用する
この方法では、AccessKey ペアを作成して Credentials クライアントを初期化します。 詳細については、「AccessKey ペアを作成する」をご参照ください。
Alibaba Cloud アカウントは、アカウント内のリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの AccessKey ペアの漏洩は、システムにとって重大な脅威となります。
そのため、最小権限の原則(PoLP)に基づいて権限が付与された RAM ユーザーの AccessKey ペアを使用して、Credentials クライアントを初期化することをお勧めします。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// vendor ディレクトリの autoload.php ファイルを使用して、Composer のオートローディングを有効にします。
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'access_key',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
例
方法 3:STS トークンを使用する
このメソッドでは、静的 STS トークンを使用して Credentials クライアントを初期化できます。STS トークンの取得方法の詳細については、「STS とは」をご参照ください。次の例では、STS トークンを使用して Credentials クライアントを初期化する方法を示します。この例では、STS トークンの取得方法は示していません。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// vendor ディレクトリの autoload.php ファイルを使用して Composer のオートロードを有効にします。
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'sts',
// 環境変数から AccessKey ID を取得します。
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
// 環境変数から AccessKey シークレットを取得します。
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
// 環境変数から STS トークンを取得します。
'securityToken' => getenv('ALIBABA_CLOUD_SECURITY_TOKEN'),
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();例
方法 4: AccessKey ペアと RAM ロールを使用
このメソッドは、内部的には STS トークンを使用して Credentials クライアントを初期化します。 RAM ロールの ARN を指定すると、Credentials ツールは STS からセキュリティトークンを取得します。 また、policy パラメーターを使用して RAM ロールの権限を制限することもできます。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// vendor ディレクトリにある autoload.php ファイルを使用して、Composer のオートローディングを有効にします。
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'ram_role_arn',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
// ALIBABA_CLOUD_ROLE_ARN 環境変数を指定して、アプリケーションが引き受ける RAM ロールの ARN を指定します。 例: acs:ram::123456789012****:role/adminrole.
'roleArn' => '<RoleArn>',
// ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を指定して、ロールセッション名を指定します。
'roleSessionName' => '<RoleSessionName>',
// 省略可能。 RAM ロールに制限された権限を指定します。 例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
'policy' => '<Policy>',
// 省略可能。 セッションの有効期間を指定します。 単位: 秒。 デフォルト値: 3600。
'roleSessionExpiration' => 3600,
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();例
方法5:ECS インスタンスの RAM ロールを利用
ECS インスタンスと Elastic Container Instance には、RAM ロールを割り当てることができます。インスタンス上で実行されるプログラムは、Credentials ツールを使用して RAM ロールの STS トークンを自動的に取得できます。STS トークンは、Credentials クライアントを初期化するために使用できます。
デフォルトでは、Credentials ツールはセキュリティ強化モード(IMDSv2)で ECS のメタデータサーバーにアクセスします。例外がスローされた場合、Credentials ツールは通常モード(IMDSv1)に切り替えます。disableIMDSv1 パラメーターまたは ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数を構成して、例外処理ロジックを指定することもできます。有効な値:
false(デフォルト):Credentials ツールは、通常モード(IMDSv1)でアクセス認証情報の取得を続行します。
true:例外がスローされ、Credentials ツールはセキュリティ強化モード(IMDSv2)でアクセス認証情報の取得を続行します。
メタデータサーバーの構成によって、サーバーがセキュリティ強化モード(IMDSv2)をサポートするかどうかが決まります。
さらに、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true を指定して、Credentials ツールから ECS のメタデータサーバーへのアクセスを無効にすることができます。
セキュリティ強化モード(IMDSv2)で STS トークンを取得する場合は、Credentials ツールのバージョンが 1.2.0 以降であることを確認してください。
詳細については、「インスタンスメタデータの取得」をご参照ください。
ECS インスタンスに RAM ロールをアタッチする方法の詳細については、「インスタンス RAM ロール」トピックの「インスタンス RAM ロールの作成と ECS インスタンスへのアタッチ」セクションをご参照ください。Elastic Container Instance に RAM ロールをアタッチする方法の詳細については、「API オペレーションを呼び出してインスタンス RAM ロールを使用する」トピックの「Elastic Container Instance へのインスタンス RAM ロールの割り当て」セクションをご参照ください。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// vendor ディレクトリにある autoload.php ファイルを使用して、Composer のオートローディングを有効にします。
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'ecs_ram_role',
// オプション。 ALIBABA_CLOUD_ECS_METADATA 環境変数を指定して、ECS インスタンスの RAM ロール名を指定します。 このパラメーターを指定しない場合、値は自動的に取得されます。 リクエスト数を減らすために、このパラメーターを指定することを推奨します。
'roleName' => '<RoleName>',
# デフォルト値: false。 このパラメーターはオプションです。 true: セキュリティ強化モード (IMDSv2) が強制的に使用されます。 false: システムは、まずセキュリティ強化モード (IMDSv2) でアクセス資格情報の取得を試みます。 試行に失敗した場合、システムは通常モード (IMDSv1) に切り替えてアクセス資格情報を取得します。
// 'disableIMDSv1' => true,
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();例
方法 6:OIDC IdP の RAM ロールを使用する
クラウド リソースのセキュリティを確保し、信頼されていないアプリケーションが必要な STS トークンを安全に取得できるようにするには、サービスアカウントの RAM ロール (RRSA) 機能を使用して、アプリケーションに必要な最小限の権限を付与できます。ACK は、異なるアプリケーション ポッドに対応する OpenID Connect (OIDC) トークン ファイルを作成およびマウントし、関連する構成情報を環境変数に渡します。資格情報ツールは、環境変数から構成情報を取得し、STS の AssumeRoleWithOIDC 操作を呼び出して、アタッチされたロールの STS トークンを取得します。
次の環境変数がポッドに挿入されます。
ALIBABA_CLOUD_ROLE_ARN: RAM ロールの ARN。
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDC ID プロバイダー (IdP) の ARN。
ALIBABA_CLOUD_OIDC_TOKEN_FILE: OIDC トークン ファイルのパス。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
// vendor ディレクトリの autoload.php ファイルを使用して、Composer のオートロードを有効にします。
require_once 'vendor/autoload.php';
// OIDC IdP の RAM ロールを使用して、Credentials クライアントを初期化します。
$credConfig = new CredentialConfig([
// 資格情報タイプを指定します。
'type' => 'oidc_role_arn',
// ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を指定して、OIDC IdP の ARN を指定します。
'oidcProviderArn' => '<OidcProviderArn>',
// ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を指定して、OIDC トークンファイルのパスを指定します。
'oidcTokenFilePath' => '<OidcTokenFilePath>',
// ALIBABA_CLOUD_ROLE_ARN 環境変数を指定して、RAM ロールの ARN を指定します。 例: acs:ram::123456789012****:role/adminrole。
'roleArn' => '<RoleArn>',
// ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を指定して、ロールセッション名を指定します。
'roleSessionName' => '<RoleSessionName>',
// オプション。 RAM ロールの権限を制限します。 例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
'policy' => '<Policy>',
// オプション。 セッションの有効期間を指定します。
'roleSessionExpiration' => 3600,
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();
例
方法 7: URI を使用する
この方法では、アプリケーションで STS トークンをカプセル化し、外部リソースへのカスタム URI を提供できます。他のサービスは、この URI を介してのみ STS トークンを取得できます。これにより、AccessKey の漏洩リスクが最小限に抑えられます。Credentials ツールでは、サービス URI を呼び出して STS トークンを取得し、Credentials クライアントを初期化できます。
<?php
namespace AlibabaCloud\SDK\Sample;
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// vendor ディレクトリの autoload.php ファイルを使用して、Composer のオートローディングを有効にします。
require_once 'vendor/autoload.php';
// URI (Uniform Resource Identifier) を使用して Credentials クライアントを初期化します。
$credConfig = new Config([
// 認証情報タイプを指定します。
'type' => 'credentials_uri',
// ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を指定して、http://local_or_remote_uri/ 形式で認証情報の URI を取得します。
'credentialsURI' => '<CredentialsUri>',
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getAccessKeyId();
$credential->getAccessKeySecret();
$credential->getSecurityToken();URI は以下の要件を満たす必要があります。
GET リクエストがサポートされています。
HTTP 200 状態コードが返される可能性があります。
次のレスポンス本文構造が使用されます:
{ "AccessKeyId": "AccessKeyId", "AccessKeySecret": "AccessKeySecret", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
例
方法 8:ベアラートークンを使用する
ベアラートークンを使用して SDK クライアントを初期化できるのは、Cloud Call Center のみです。
<?php
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config;
// vendor ディレクトリの autoload.php ファイルを使用して、Composer のオートロードを有効にします。
require_once 'vendor/autoload.php';
$credConfig = new Config([
'type' => 'bearer',
// ベアラートークンを指定します。
'bearerToken' => '<BearerToken>',
]);
$credClient = new Credential($credConfig);
$credential = $credClient->getCredential();
$credential->getBearerToken();例
デフォルトの資格情報プロバイダーチェーン
アプリケーションの開発環境と本番環境で異なる種類の資格情報を使用する場合、通常、コードから環境情報を取得し、開発環境と本番環境で異なる資格情報を取得するためのコードブランチを記述する必要があります。 Alibaba Cloud Credentials for Java のデフォルトの資格情報プロバイダーチェーンを使用すると、アプリケーションとは独立した構成に基づいて、同じコードを使用して異なる環境の資格情報を取得できます。 $credential = new Credential(); を使用して初期化メソッドを指定せずに Credentials クライアントを初期化すると、Credentials ツールは次の順序で資格情報を取得します。
1. 環境変数から資格情報を取得する
システム属性に資格情報が見つからない場合、Credentials は引き続き環境変数を確認します。
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 IdP の RAM ロールを使用して資格情報を取得する
優先順位の高い資格情報が見つからない場合、Credentials ツールは OIDC IdP の 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:
~/.aliyun/config.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
上記のデフォルトパスは変更しないでください。この方法を使用してアクセス資格情報を構成する場合は、対応するパスに config.json ファイルを手動で作成します。例:
{
"current": "default",
"profiles": [
{
"name": "default",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "client",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name":"client1",
"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":"client2",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"client3",
"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":"client4",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
config.json ファイルでは、mode を使用して資格情報の種類を指定できます。
AK: RAM ユーザーの AccessKey ペアを使用して資格情報を取得します。
StsToken: STS トークンを資格情報として使用します。
RamRoleArn: RAM ロールの ARN を使用して資格情報を取得します。
EcsRamRole: ECS インスタンスにアタッチされた RAM ロールを使用して資格情報を取得します。
OIDC: OIDC IdP の ARN と OIDC トークンファイルを使用して資格情報を取得します。
ChainableRamRoleArn: ロールチェーンを使用して、別の JSON ファイルでアクセス資格情報を指定して資格情報を取得します。
name を資格情報名に設定し、ビジネス要件に基づいて他のパラメーターを構成します。
構成が完了すると、Credentials ツールは構成ファイルの current パラメーターで指定された資格情報を選択し、クライアントを初期化します。ALIBABA_CLOUD_PROFILE 環境変数を指定して資格情報を指定することもできます。たとえば、ALIBABA_CLOUD_PROFILE 環境変数を client1 に設定できます。
4. ECS インスタンスの RAM ロールを使用して資格情報を取得する
優先順位の高い資格情報が見つからない場合、Credentials ツールは ECS インスタンスに割り当てられた RAM ロールを使用して資格情報の取得を試みます。デフォルトでは、Credentials ツールはセキュリティ強化モード(IMDSv2)で ECS のメタデータサーバーにアクセスして、ECS インスタンスで使用される RAM ロールの STS トークンを取得し、STS トークンをデフォルトの資格情報として使用します。 Credentials ツールは ECS のメタデータサーバーに自動的にアクセスして RAM ロールの名前(RoleName)を取得し、資格情報を取得します。このプロセスでは 2 つのリクエストが送信されます。リクエストを 1 つだけ送信する場合は、ALIBABA_CLOUD_ECS_METADATA 環境変数を追加して RAM ロールの名前を指定します。セキュリティ強化モード(IMDSv2)で例外が発生した場合、Credentials ツールは通常モード(IMDSv1)でアクセス資格情報を取得します。ALIBABA_CLOUD_IMDSV1_DISABLE 環境変数を構成して、例外処理ロジックを指定することもできます。有効な値:
false: Credentials ツールは引き続き通常モード(IMDSv1)でアクセス資格情報を取得します。
true: 例外がスローされ、Credentials ツールは引き続きセキュリティ強化モードでアクセス資格情報を取得します。
メタデータサーバーの構成によって、サーバーがセキュリティ強化モード(IMDSv2)をサポートするかどうかが決まります。
さらに、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true を指定して、Credentials ツールから ECS のメタデータサーバーへのアクセスを無効にすることができます。
ECS インスタンスメタデータの詳細については、「インスタンスメタデータの取得」をご参照ください。
ECS インスタンスに RAM ロールをアタッチする方法の詳細については、「インスタンス RAM ロール」トピックの「インスタンス RAM ロールの作成と ECS インスタンスへのアタッチ」セクションをご参照ください。エラスティックコンテナインスタンスに RAM ロールをアタッチする方法の詳細については、「API 操作を呼び出してインスタンス RAM ロールを使用する」トピックの「インスタンス RAM ロールをエラスティックコンテナインスタンスに割り当てる」セクションをご参照ください。
5. URI に基づいて資格情報を取得する
上記のメソッドを使用して有効な資格情報を取得できない場合、Credentials ツールは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を確認します。この環境変数が存在し、有効な URI が指定されている場合、Credentials ツールは HTTP リクエストを開始して、STS トークンをデフォルトの資格情報として取得します。
カスタム資格情報プロバイダーチェーン
カスタム資格情報プロバイダーチェーンを使用して資格情報を取得したり、クロージャを記述してプロバイダーに渡したりできます。
<?php
use AlibabaCloud\Credentials\Providers\ChainProvider;
ChainProvider::set(
ChainProvider::ini(),
ChainProvider::env(),
ChainProvider::instance()
);セッション資格情報の自動更新メカニズム
セッション資格情報には、RAM ロールの ARN(RamRoleArn)、ECS インスタンスの RAM ロール、OIDC IdP の RAM ロール(OIDCRoleArn)、および資格情報 URI が含まれます。Credentials ツールは、セッション資格情報の組み込みの自動更新メカニズムを提供します。最初の呼び出しから資格情報を取得した後、Credentials ツールは資格情報をキャッシュに保存します。後続の呼び出しでは、資格情報の有効期限が切れていない限り、資格情報はキャッシュから読み取られます。それ以外の場合は、Credentials ツールは資格情報を再度取得するために呼び出しを行い、キャッシュ内の資格情報を更新します。
ECS インスタンスの RAM ロールの場合は、Credentials ツールはキャッシュの有効期限(TTL)が終了する 15 分前に資格情報を更新します。
次の例では、Credentials クライアントは単一インスタンスモードで作成され、クラウドサービスクライアントを初期化するために使用されます。次に、異なる期間中に API 操作が呼び出され、内部キャッシュが使用されているかどうか、およびキャッシュの有効期限が切れた後に資格情報が更新されるかどうかが確認されます。
<?php
namespace Sample;
require_once 'vendor/autoload.php';
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use Darabonba\OpenApi\Models\Config as OpenApiConfig;
use RuntimeException;
class Sample
{
/**
* @var Credential|null
*/
private static $credentialInstance = null;
/**
* @return Credential
* @throws RuntimeException
*/
private static function getCredentialClient(): Credential
{
if (self::$credentialInstance === null) {
try {
$config = new CredentialConfig([
'type' => 'ram_role_arn',
'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
'roleArn' => getenv('ALIBABA_CLOUD_ROLE_ARN'),
'roleSessionName' => 'RamRoleArnTest',
'roleSessionExpiration' => 3600,
]);
self::$credentialInstance = new Credential($config);
} catch (\Exception $e) {
throw new RuntimeException("資格情報の初期化に失敗しました: " . $e->getMessage(), 0, $e); // 翻訳済みのコメント
}
}
return self::$credentialInstance;
}
/**
* @var Ecs|null
*/
private static $ecsClientInstance = null;
/**
* @return Ecs
* @throws RuntimeException
*/
private static function getEcsClient(): Ecs
{
if (self::$ecsClientInstance === null) {
try {
$config = new OpenApiConfig([
'credential' => self::getCredentialClient(),
'endpoint' => 'ecs.cn-hangzhou.aliyuncs.com'
]);
self::$ecsClientInstance = new Ecs($config);
} catch (\Exception $e) {
throw new RuntimeException("ECS クライアントの初期化に失敗しました: " . $e->getMessage(), 0, $e); // 翻訳済みのコメント
}
}
return self::$ecsClientInstance;
}
public static function main(): void
{
$task = function () {
// 資格情報を取得して出力します。 // 翻訳済みのコメント
$credentialClient = self::getCredentialClient();
$credential = $credentialClient->getCredential();
echo date('c') . PHP_EOL;
echo "AK ID: {$credential->accessKeyId}" . PHP_EOL;
echo "AK Secret: {$credential->accessKeySecret}" . PHP_EOL;
echo "STS Token: {$credential->securityToken}" . PHP_EOL;
// ECS API 操作を呼び出して、資格情報が有効かどうかをテストします。 // 翻訳済みのコメント
$ecsClient = self::getEcsClient();
$request = new DescribeRegionsRequest();
try {
$response = $ecsClient->describeRegions($request);
echo sprintf("呼び出し結果: %d" . PHP_EOL, $response->statusCode); // 翻訳済みのコメント
} catch (\Exception $e) {
throw new RuntimeException("ECS クライアントの実行に失敗しました: " . $e->getMessage(), 0, $e); // 翻訳済みのコメント
}
};
call_user_func($task); // 操作をすぐに呼び出します。 // 翻訳済みのコメント
sleep(600); // 600 秒後に操作を呼び出します。 // 翻訳済みのコメント
call_user_func($task);
sleep(3600); // 3,600 秒後に操作を呼び出します。 // 翻訳済みのコメント
call_user_func($task);
sleep(100); // 100 秒後に操作を呼び出します。 // 翻訳済みのコメント
call_user_func($task);
}
}
// main 関数を実行します。 // 翻訳済みのコメント
Sample::main();
ログ分析:
最初の呼び出しでは、資格情報がキャッシュされていないため、システムは構成に基づいて資格情報を取得します。システムが資格情報を取得した後、資格情報はキャッシュに保存されます。
2 回目の呼び出しは、最初の呼び出しと同じ資格情報を使用します。これは、資格情報がキャッシュから取得されたことを示します。
3 回目の呼び出しでは、資格情報の有効期限が切れています。これは、3 回目の呼び出しが最初の呼び出しから 4,200 秒後であるのに対し、資格情報の TTL(RoleSessionExpiration)は 3,600 秒に設定されているためです。SDK は自動更新メカニズムに基づいて資格情報を再度取得し、キャッシュに保存します。
4 回目の呼び出しは、3 回目の呼び出しと同じ資格情報を使用します。これは、キャッシュの有効期限が切れた後に資格情報が更新されたことを示します。
参考文献
RAM の詳細については、「用語」をご参照ください。
AccessKey ペアの作成方法の詳細については、「AccessKey ペアを作成する」をご参照ください。
RAM ユーザー、AccessKey ペア、RAM ロール、およびポリシーの作成方法と RAM ユーザーへの権限の付与方法の詳細については、「RAM SDK の概要」をご参照ください。
プログラムを使用してロールを引き受ける方法の詳細については、「STS SDK の概要」をご参照ください。
RAM および STS 関連の API 操作の詳細については、「API リファレンス」をご参照ください。