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

Alibaba Cloud SDK:アクセスクレデンシャルの管理

最終更新日:Jul 04, 2025

Alibaba Cloud SDK を使用して API オペレーションを呼び出してクラウド リソースを管理する場合は、有効なクレデンシャル情報を構成する必要があります。 Alibaba Cloud の Credentials ツールは、使い易い機能セットを提供し、デフォルトのクレデンシャル、AccessKey ペア、Security Token Service (STS) トークンなど、様々な種類のクレデンシャルをサポートしています。 Credentials ツールは、クレデンシャルの取得と管理に役立ちます。 このトピックでは、異なる種類のクレデンシャルを構成する方法と、Credentials ツールがデフォルトのクレデンシャルを取得する順序について説明します。 Alibaba Cloud SDK でのクレデンシャルの構成と管理について、徹底的に理解することができます。 これにより、クラウド リソースに対する操作を効率的かつ安全な方法で実行できるようになります。

背景情報

クレデンシャルとは、ユーザーの身元を証明するために使用される一連の情報です。 システムにログインする際には、有効なクレデンシャルを使用して身元認証を完了する必要があります。 一般的に使用されるクレデンシャルの種類は次のとおりです。

  1. Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ペア。 AccessKey ペアは永続的に有効で、AccessKey ID と AccessKey シークレットで構成されます。

  2. RAM ロールの STS トークン。 STS トークンは一時的なクレデンシャルです。 STS トークンの有効期間とアクセス権限を指定できます。 詳細については、「STS とは」をご参照ください。

  3. ベアラトークン。 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/credentials
  • PHP 用 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: カスタムセッションの名前。デフォルトのフォーマットは phpSdkRoleSessionName です。

×

×

-

×

-

×

×

roleName: RAM ロールの名前を指定します。

×

×

×

-

×

×

×

disableIMDSv1: セキュリティ強化モード(IMDSv2)を強制的に使用するかどうかを指定します。このパラメーターを true に設定すると、セキュリティ強化モード(IMDSv2)が使用されます。デフォルト値: false

×

×

×

-

×

×

×

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 エンドポイントとインターネットエンドポイントがサポートされています。デフォルト値: sts.aliyuncs.com。有効な値の詳細については、「エンドポイント」をご参照ください。

×

×

-

×

-

×

×

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();

次のサンプルコードは、Elastic Compute Service ( ECS ) の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、PHP 用 ECS SDK をインストールする必要があります。

<?php

use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;

// vendorディレクトリにある autoload.php ファイルを使用して、Composer のオートロードを有効にします。
require_once 'vendor/autoload.php';

// デフォルトの認証情報を使用して、SDK Credentials クライアントを初期化します。
$credentialClient = new Credential();
$ecsConfig = new Config([
    // SDK Credentials パッケージを使用して認証情報を構成します。
    'credential' => $credentialClient,
    // クラウドサービスのエンドポイント。
    'endpoint' => 'ecs.aliyuncs.com'
]);
// ECS SDK クライアントを初期化します。
$ecsClient = new Ecs($ecsConfig);
// リクエストを初期化します。
$describeRegionsRequest = new DescribeRegionsRequest([]);
// ランタイム構成を初期化します。
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 状態コードを返します。
echo $resp->statusCode;
// レスポンスを取得します。
var_dump($resp);

方法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();

次のサンプルコードは、ECS の DescribeRegions 操作を呼び出す方法の例を示しています。この操作を呼び出す前に、 PHP 用 ECS SDK をインストールする必要があります。

<?php

namespace AlibabaCloud\SDK\Sample;

use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;

// vendor ディレクトリにある autoload.php ファイルを使用して、Composer のオートロードを有効にします。
require_once 'vendor/autoload.php';

// AccessKey ペアを使用して、Credentials クライアントを初期化します。
$credConfig = new CredentialConfig([
    'type' => 'access_key',
    'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
]);
$credClient = new Credential($credConfig);

$ecsConfig = new Config([
    // SDK Credentials パッケージを使用してクレデンシャルを構成します。
    'credential' => $credClient,
    // ECS のエンドポイントを指定します。
    'endpoint' => 'ecs.aliyuncs.com'
]);
// ECS SDK クライアントを初期化します。
$ecsClient = new Ecs($ecsConfig);
// リクエストを初期化します。
$describeRegionsRequest = new DescribeRegionsRequest([]);
// ランタイム構成を初期化します。
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 状態コードを返します。
echo $resp->statusCode;
// 応答を取得します。
var_dump($resp);

方法 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();

次のサンプルコードは、ECS の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、PHP 用 ECS SDKPHP 用 STS SDK をインストールする必要があります。

<?php

namespace AlibabaCloud\SDK\Sample;

use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\SDK\Sts\V20150401\Models\AssumeRoleRequest;
use AlibabaCloud\SDK\Sts\V20150401\Sts;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;

// Composer の自動読み込みを有効にするには、vendor ディレクトリの autoload.php ファイルを使用します。
require_once 'vendor/autoload.php';

// STS クライアントを作成し、AssumeRole オペレーションを呼び出して STS トークンを取得します。
$config = new Config([
    // 環境変数から AccessKey ID と AccessKey シークレットを取得します。環境変数が指定されていない場合は、指定します。
    'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    'endpoint' => 'sts.aliyuncs.com',
]);
$stsClient = new Sts($config);
$request = new AssumeRoleRequest([
    // アプリケーションがアシュームする RAM ロールの ARN を、ALIBABA_CLOUD_ROLE_ARN 環境変数を指定することで指定します。例: acs:ram::123456789012****:role/adminrole。
    'roleArn' => '<RoleArn>',
    // ロールのセッション名を、ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を指定することで指定します。
    'roleSessionName' => '<RoleSessionName>',
]);
$assumeRoleResp = $stsClient->assumeRole($request);
$assumeRoleCredentials = $assumeRoleResp->body->credentials;

// STS トークンを使用して Credentials クライアントを初期化します。
$credentialConfig = new CredentialConfig([
    // 認証情報の種類を指定します。
    'type' => 'sts',
    'accessKeyId' => $assumeRoleCredentials->accessKeyId,
    'accessKeySecret' => $assumeRoleCredentials->accessKeySecret,
    'securityToken' => $assumeRoleCredentials->securityToken,
]);
$credentialClient = new Credential($credentialConfig);
$ecsConfig = new Config([
    // SDK Credentials パッケージを使用して認証情報を構成します。
    'credential' => $credentialClient,
    // ECS のエンドポイントを指定します。
    'endpoint' => 'ecs.aliyuncs.com'
]);// ECS SDK クライアントを初期化します。
$ecsClient = new Ecs($ecsConfig);// リクエストを初期化します。
$describeRegionsRequest = new DescribeRegionsRequest([]);// ランタイム構成を初期化します。
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);// 状態コードを返します。
echo $resp->statusCode;// レスポンスを取得します。
var_dump($resp);

方法 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();

次のサンプルコードは、ECS の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、PHP 用 ECS SDK をインストールする必要があります。

<?php

namespace AlibabaCloud\SDK\Sample;

// vendorディレクトリにある autoload.php ファイルを使用して、Composer のオートロードを有効にします。
require_once 'vendor/autoload.php';

use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;

// AccessKey ペアと RAM ロールを使用して、Credentials クライアントを初期化します。
$credentialConfig = new CredentialConfig([
    // 認証情報の種類を指定します。
    'type' => 'ram_role_arn',
    // 環境変数から AccessKey ID を取得します。
    'accessKeyId' => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    // 環境変数から AccessKey シークレットを取得します。
    'accessKeySecret' => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    // アプリケーションが引き受ける RAM ロールの ARN を、環境変数 ALIBABA_CLOUD_ROLE_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,
]);
$credentialClient = new Credential($credentialConfig);

$ecsConfig = new Config([
    // SDK Credentials パッケージを使用して認証情報を構成します。
    'credential' => $credentialClient,
    // ECS のエンドポイントを指定します。
    'endpoint' => 'ecs.aliyuncs.com'
]);
// ECS SDK クライアントを初期化します。
$ecsClient = new Ecs($ecsConfig);
// リクエストを初期化します。
$describeRegionsRequest = new DescribeRegionsRequest([]);
// ランタイム構成を初期化します。
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 状態コードを返します。
echo $resp->statusCode;
// レスポンスを取得します。
var_dump($resp);

方法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();

次のサンプルコードは、ECS の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、PHP 用 ECS SDK をインストールする必要があります。

<?php

namespace AlibabaCloud\SDK\Sample;

// vendorディレクトリにある autoload.php ファイルを使用して、Composer のオートロードを有効にします。
require_once 'vendor/autoload.php';

use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;

// ECSインスタンスのRAMロールを使用して、Credentialsクライアントを初期化します。
$credConfig = new CredentialConfig([
    'type' => 'ecs_ram_role',
    // オプション。 ALIBABA_CLOUD_ECS_METADATA 環境変数を指定して、ECS インスタンスの RAM ロールの名前を指定します。 このパラメータを指定しない場合、値は自動的に取得されます。 リクエスト数を減らすために、このパラメータを指定することをお勧めします。
    'roleName' => '<RoleName>',
]);
$credClient = new Credential($credConfig);

$ecsConfig = new Config([
    // SDK Credentials パッケージを使用してクレデンシャルを設定します。
    'credential' => $credClient,
    // ECS のエンドポイントを指定します。
    'endpoint' => 'ecs.aliyuncs.com'
]);
// ECS SDK クライアントを初期化します。
$ecsClient = new Ecs($ecsConfig);
// リクエストを初期化します。
$describeRegionsRequest = new DescribeRegionsRequest([]);
// ランタイム設定を初期化します。
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// ステータスコードを返します。
echo $resp->statusCode;
// レスポンスを取得します。
var_dump($resp);

方法 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();

次のサンプルコードは、ECS の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、 PHP 用 ECS SDK をインストールする必要があります。

<?php

namespace AlibabaCloud\SDK\Sample;

// Composer の自動読み込みを有効にするには、vendor ディレクトリの autoload.php ファイルを使用します。
require_once 'vendor/autoload.php';

use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig;
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;

// 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);

$ecsConfig = new Config([
    // SDK Credentials パッケージを使用して認証情報を構成します。
    'credential' => $credClient,
    // ECS のエンドポイントを指定します。
    'endpoint' => 'ecs.aliyuncs.com'
]);
// ECS SDK クライアントを初期化します。
$ecsClient = new Ecs($ecsConfig);
// リクエストを初期化します。
$describeRegionsRequest = new DescribeRegionsRequest([]);
// ランタイム構成を初期化します。
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// ステータスコードを返します。
echo $resp->statusCode;
// レスポンスを取得します。
var_dump($resp);

方法 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"
    }

次のサンプルコードは、ECS の DescribeRegions オペレーションを呼び出す方法の例を示しています。このオペレーションを呼び出す前に、 PHP 用 ECS SDK をインストールする必要があります。

<?php

namespace AlibabaCloud\SDK\Sample;

// Composer の自動読み込みを有効にするには、vendor ディレクトリの autoload.php ファイルを使用します。
// vendorディレクトリにあるautoload.phpファイルを使用して、Composerのオートロードを有効にします。
require_once 'vendor/autoload.php';

use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig; 
use AlibabaCloud\SDK\Ecs\V20140526\Ecs as Ecs;
use AlibabaCloud\SDK\Ecs\V20140526\Models\DescribeRegionsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use Darabonba\OpenApi\Models\Config;

// URI を使用して Credentials クライアントを初期化します。
// URIを使用してCredentialsクライアントを初期化します。
$credConfig = new CredentialConfig([
    // 認証情報の種類を指定します。
    // 資格情報の種類を指定します。
    'type' => 'credentials_uri',
    // ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を指定して、http://local_or_remote_uri/ 形式の認証情報の URI を取得します。
    // ALIBABA_CLOUD_CREDENTIALS_URI環境変数を指定することで、http://local_or_remote_uri/形式の資格情報のURIを取得します。
    'credentialsURI' => '<CredentialsUri>',
]);
$credClient = new Credential($credConfig);

$ecsConfig = new Config([
    // SDK Credentials パッケージを使用して認証情報を構成します。
    // SDK Credentialsパッケージを使用して資格情報を構成します。
    'credential' => $credClient,
    // ECS のエンドポイントを指定します。
    // ECSのエンドポイントを指定します。
    'endpoint' => 'ecs.aliyuncs.com'
]);
// ECS SDK クライアントを初期化します。
// ECS SDKクライアントを初期化します。
$ecsClient = new Ecs($ecsConfig);
// リクエストを初期化します。
// リクエストを初期化します。
$describeRegionsRequest = new DescribeRegionsRequest([]);
// ランタイム構成を初期化します。
// ランタイム設定を初期化します。
$runtime = new RuntimeOptions([]);
$resp = $ecsClient->describeRegionsWithOptions($describeRegionsRequest, $runtime);
// 状態コードを返します。
// ステータスコードを返します。
echo $resp->statusCode;
// 応答を取得します。
// レスポンスを取得します。
var_dump($resp);

方法 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();

次のサンプルコードは、Cloud Call Center の GetInstance 操作を呼び出す方法の例を示しています。この操作を呼び出す前に、PHP 用 Cloud Call Center SDK をインストールする必要があります。

<?php

namespace AlibabaCloud\SDK\Sample;

// Composer の自動ロードを有効にするには、vendor ディレクトリの autoload.php ファイルを使用します。
require_once 'vendor/autoload.php';

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\Credentials\Credential\Config as CredentialConfig; 
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use AlibabaCloud\SDK\CCC\V20200701\CCC;
use AlibabaCloud\SDK\CCC\V20200701\Models\GetInstanceRequest;

// ベアラトークンを使用して Credentials クライアントを初期化します。
$credConfig = new CredentialConfig([
    // 認証情報の種類を指定します。
    'type' => 'bearer',
    // ベアラトークンを指定します。
    'bearerToken' => '<BearerToken>',
]);
$credClient = new Credential($credConfig);

$config = new Config([
    // SDK Credentials パッケージを使用して認証情報を構成します。
    'credential' => $credClient,
    // ECS のエンドポイントを指定します。
    'endpoint' => 'ccc.cn-shanghai.aliyuncs.com'
]);
$cccClient = new CCC($config);
// リクエストを初期化します。
$getInstanceRequest = new GetInstanceRequest([
    "instanceId" => "ccc-test"
]);
// ランタイム構成を初期化します。
$runtime = new RuntimeOptions([]);
$resp = $cccClient->getInstanceWithOptions($getInstanceRequest, $runtime);
// 状態コードを返します。
echo $resp->statusCode;
// レスポンスを取得します。
var_dump($resp);

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

アプリケーションの開発環境と本番環境で異なる種類の資格情報を使用する場合、通常、コードから環境情報を取得し、開発環境と本番環境で異なる資格情報を取得するためのコードブランチを記述する必要があります。 Alibaba Cloud Credentials for Java のデフォルトの資格情報プロバイダーチェーンを使用すると、アプリケーションとは独立した構成に基づいて、同じコードを使用して異なる環境の資格情報を取得できます。 $credential = new Credential(); を使用して初期化メソッドを指定せずに Credentials クライアントを初期化すると、Credentials ツールは次の順序で資格情報を取得します。

1. 環境変数から資格情報を取得する

システム属性に資格情報が見つからない場合、Credentials は引き続き環境変数を確認します。

  • ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_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.json

  • Windows: 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 環境変数を構成して、例外処理ロジックを指定することもできます。有効な値:

  1. false: Credentials ツールは引き続き通常モード(IMDSv1)でアクセス資格情報を取得します。

  2. 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();

image

ログ分析:

  • 最初の呼び出しでは、資格情報がキャッシュされていないため、システムは構成に基づいて資格情報を取得します。システムが資格情報を取得した後、資格情報はキャッシュに保存されます。

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

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

  • 4 回目の呼び出しは、3 回目の呼び出しと同じ資格情報を使用します。これは、キャッシュの有効期限が切れた後に資格情報が更新されたことを示します。

参考文献