Alibaba Cloud SDK を使用する場合、AccessKey ペアや Security Token Service (STS) トークンなどの認証情報は、Credentials ツールによって管理されます。このトピックでは、Credentials ツールがサポートする認証情報のタイプと、その設定方法について説明します。
前提条件
Credentials ツールには Java 8 以降が必要です。詳細については、「Alibaba Cloud SDK サポートポリシー」をご参照ください。
Alibaba Cloud SDK V2.0 を使用するには、「V2.0 SDK と V1.0 SDK」をご参照ください。
Credentials ツールをインストールする
すべての機能がサポートされるように、最新バージョンの Credentials 依存関係パッケージを使用してください。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>latest-version</version>
</dependency>
<!-- credentials-java を単独で使用する場合は、tea パッケージを追加する必要があります。 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea</artifactId>
<version>latest-version</version>
</dependency>Credentials パッケージの最新バージョンについては、「GitHub」または「Maven Repository」をご参照ください。Tea パッケージの最新バージョンについては、「GitHub」または「Maven Repository」をご参照ください。
Credentials ツールでサポートされる認証情報タイプとその設定パラメーター
Credentials ツールでサポートされる認証情報タイプとその設定パラメーターは、com.aliyun.credentials.models.Config クラスで定義されます。認証情報タイプは type パラメーターで指定され、必要な設定パラメーターは認証情報タイプごとに異なります。次の表に、type パラメーターの有効な値と、各認証情報タイプでサポートされる設定パラメーターを示します。表では、 は必須パラメーター、- はオプションパラメーター、 はサポートされていないパラメーターを示します。
次の表に記載されていない認証情報タイプやパラメーターは使用しないことを推奨します。
type | |||||||
accessKeyId: AccessKey ID。 | |||||||
accessKeySecret: AccessKey Secret。 | |||||||
securityToken: STS トークン。 | - | ||||||
roleArn: RAM ロールの Alibaba Cloud リソースネーム (ARN)。 | |||||||
roleSessionName: カスタムセッション名。デフォルトのフォーマットは | - | - | |||||
roleName: RAM ロールの名前。 | - | ||||||
disableIMDSv1: セキュリティ強化モード (IMDSv2) を強制するかどうかを指定します。デフォルト値は | - | ||||||
bearerToken: ベアラートークン。 | |||||||
policy: カスタムポリシー。 | - | - | |||||
roleSessionExpiration: セッションの有効期間。デフォルト値: 3600。単位: 秒。最小値は 900 秒です。最大値は、RAM ロールでサポートされる最大セッション期間です。 | - | - | |||||
oidcProviderArn: OIDC IdP の ARN。 | |||||||
oidcTokenFilePath: OIDC トークンファイルのパス。 | |||||||
externalId: ロールの外部 ID。Confused Deputy 問題を防ぐために使用されます。詳細については、「外部 ID を使用して Confused Deputy 問題を防ぐ」をご参照ください。 | - | ||||||
credentialsURI: 外部認証情報の URI。 | |||||||
STSEndpoint: Security Token Service (STS) のサービスエンドポイント。VPC サービスエンドポイントとインターネットサービスエンドポイントをサポートします。有効な値のリストについては、「エンドポイント」をご参照ください。デフォルト値は | - | - | |||||
timeout: リクエストの読み取りタイムアウト期間。デフォルト値: 5000 ミリ秒。 | - | - | - | - | |||
connectTimeout: リクエストの接続タイムアウト期間。デフォルト値: 10000 ミリ秒。 | - | - | - | - |
Credentials ツールの使用
以下のセクションでは、Credentials ツールの使用方法を示すコード例を提供します。要件に基づいてメソッドを選択できます。
AccessKey ペアは環境変数または設定ファイルに保存することを推奨します。
Credentials ツールを使用する際は、シングルトンパターンを使用することを推奨します。この方法により、組み込みの認証情報キャッシュ機能が有効になります。これにより、複数の API 呼び出しによるスロットリングの問題を防ぎ、複数のインスタンスを作成することによるリソースの無駄を避けることができます。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。
方法 1: デフォルトの認証情報プロバイダーチェーン
これは、OpenAPI Portal のサンプルコードで使用されるデフォルトのメソッドです。
設定パラメーターを渡さずに Credentials ツールを使用すると、ツールはデフォルトの認証情報プロバイダーチェーンから認証情報を取得し、それらをアクセス認証情報として使用します。このメソッドを使用する場合、デフォルトの認証情報プロバイダーチェーンでサポートされている認証情報取得方法がアプリケーション実行環境で設定されていることを確認する必要があります。
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
// 設定パラメーターを指定しません。認証情報は、デフォルトの認証情報プロバイダーチェーンから取得されます。
Client credentialClient = new Client();
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Alibaba Cloud サービスの V2.0 SDK を使用する場合は、com.aliyun.teaopenapi.models.Config を使用して認証情報を渡します。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// config を使用してクラウドサービスクライアントを初期化するコードは省略されています。
}
}方法 2: AccessKey ペア
Credentials ツールは、AccessKey をアクセス認証情報として使用します。
Alibaba Cloud アカウントは、すべてのリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩すると、システムに重大なセキュリティ上の脅威をもたらします。Alibaba Cloud アカウントの AccessKey ペアを使用することは推奨しません。
最小限の必要な権限が付与された RAM ユーザーの AccessKey ペアを使用することを推奨します。
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("access_key");
// 必須。この例では、環境変数から AccessKey ID を取得する方法を示します。
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// 必須。この例では、環境変数から AccessKey Secret を取得する方法を示します。
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Alibaba Cloud サービスの V2.0 SDK を使用する場合は、com.aliyun.teaopenapi.models.Config を使用して認証情報を渡します。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// config を使用してクラウドサービスクライアントを初期化するコードは省略されています。
}
}方法 3: STS トークン
Credentials ツールは、提供された静的な STS トークンをアクセス認証情報として使用します。
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) {
Config credentialConfig = new Config();
credentialConfig.setType("sts");
// 必須。この例では、環境変数から AccessKey ID を取得する方法を示します。
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// 必須。この例では、環境変数から AccessKey Secret を取得する方法を示します。
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// 必須。この例では、環境変数から一時的なセキュリティトークンを取得する方法を示します。
credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Alibaba Cloud サービスの V2.0 SDK を使用する場合は、com.aliyun.teaopenapi.models.Config を使用して認証情報を渡します。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// config を使用してクラウドサービスクライアントを初期化するコードは省略されています。
}
}方法 4: AccessKey ペアと RamRoleArn
Credentials ツールは、提供された AccessKey ペアと RAM ロール ARN を使用して AssumeRole 操作を呼び出し、STS トークンを取得します。このトークンは、アクセス認証情報として使用されます。この方法で取得した認証情報は、自動更新をサポートします。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("ram_role_arn");
// 必須。この例では、環境変数から AccessKey ID を取得する方法を示します。
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// 必須。この例では、環境変数から AccessKey Secret を取得する方法を示します。
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// オプション。一時的な認証情報を使用して、別の RAM ロールを偽装できます。
credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
// 必須。偽装する RAM ロールの ARN。例: acs:ram::123456789012****:role/adminrole。このパラメーターは、ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
credentialConfig.setRoleArn("<RoleArn>");
// オプション。ロールセッションの名前。デフォルトのフォーマットは credentials-java-current timestamp です。このパラメーターは、ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
credentialConfig.setRoleSessionName("<RoleSessionName>");
// オプション。より制限の厳しいポリシーを指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
credentialConfig.setPolicy("<Policy>");
// オプション。ロールの外部 ID。このパラメーターは、confused deputy 問題を防ぐために使用されます。
credentialConfig.setExternalId("<ExternalId>");
// オプション。セッションの有効期間。デフォルト値: 3600 秒。
credentialConfig.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Alibaba Cloud サービスの V2.0 SDK を使用する場合は、com.aliyun.teaopenapi.models.Config を使用して認証情報を渡します。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// config を使用してクラウドサービスクライアントを初期化するコードは省略されています。
}
}方法 5: インスタンス RAM ロール
アプリケーションが RAM ロールを付与された ECS または ECI インスタンスで実行されている場合、Credentials ツールはインスタンスメタデータから RAM ロールの STS トークンを取得し、それをアクセス認証情報として使用できます。インスタンスメタデータにアクセスする際、アプリケーションはまず現在のインスタンスに付与されている RAM ロールの名前を取得し、そのロールに基づいて対応する STS トークンを取得します。roleName パラメーターまたは ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して RAM ロール名を指定することで、認証情報を取得するために必要な時間を短縮し、効率を向上させることができます。この方法で取得した認証情報は、自動更新をサポートします。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。
デフォルトでは、Credentials ツールはセキュリティ強化モード (IMDSv2) を使用してインスタンスメタデータにアクセスします。セキュリティ強化モードで例外が発生した場合、disableIMDSv1 パラメーターまたは ALIBABA_CLOUD_IMDSV1_DISABLED 環境変数を使用して例外処理ロジックを制御できます:
値が
false(デフォルト) の場合、システムは一般モードに切り替えて認証情報の取得を続行しようとします。値が
trueの場合、セキュリティ強化モードのみを使用して認証情報を取得できます。このモードでのアクセスが失敗すると、例外がスローされます。
サーバーが IMDSv2 をサポートするかどうかは、サーバーの設定によって異なります。
さらに、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定することで、インスタンスメタデータからの認証情報アクセスを無効にできます。
インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
ECS または ECI インスタンスに RAM ロールを付与する方法の詳細については、「RAM ロールを作成して ECS インスタンスに付与する」および「インスタンス RAM ロールを ECI インスタンスに付与する」をご参照ください。
セキュリティ強化モードで一時的な認証情報を取得するには、credentials-java 0.3.10 以降を使用する必要があります。
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("ecs_ram_role");
// オプション。ECS インスタンスに付与された RAM ロールの名前。このパラメーターを設定しない場合、名前は自動的に取得されます。リクエスト数を減らすために、このパラメーターを設定することを推奨します。このパラメーターは、ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して設定できます。
credentialConfig.setRoleName("<RoleName>");
// オプション。true の値は、セキュリティ強化モードが強制的に使用されることを示します。デフォルト値: false。システムはまずセキュリティ強化モードで認証情報を取得しようとします。試行が失敗した場合、システムは通常モードに切り替わります。
credentialConfig.setDisableIMDSv1(false);
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Alibaba Cloud サービスの V2.0 SDK を使用する場合は、com.aliyun.teaopenapi.models.Config を使用して認証情報を渡します。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// config を使用してクラウドサービスクライアントを初期化するコードは省略されています。
}
}方法 6: OIDCRoleArn
OIDC 認証プロトコルを使用し、OIDC IdP の RAM ロールを作成している場合、OIDC IdP ARN、OIDC トークン、および RAM ロール ARN を Credentials ツールに渡すことができます。その後、システムは自動的に AssumeRoleWithOIDC 操作を呼び出して RAM ロールの STS トークンを取得し、このトークンをアクセス認証情報として使用します。この方法で取得した認証情報は、自動更新をサポートします。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。たとえば、アプリケーションが RRSA 機能が有効になっている ACK クラスターで実行されている場合、Credentials ツールは Pod の環境変数から OIDC 設定情報を読み取り、AssumeRoleWithOIDC 操作を呼び出してサービスロールの STS トークンを取得し、このトークンを使用して関連する Alibaba Cloud サービスにアクセスします。
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("oidc_role_arn");
// 必須。RAM ロールの ARN。このパラメーターは、ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
credentialConfig.setRoleArn("<RoleArn>");
// 必須。OIDC IdP の ARN。このパラメーターは、ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を使用して設定できます。
credentialConfig.setOidcProviderArn("<OidcProviderArn>");
// 必須。OIDC トークンファイルのパス。このパラメーターは、ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を使用して設定できます。
credentialConfig.setOidcTokenFilePath("<OidcTokenFilePath>");
// オプション。ロールセッションの名前。このパラメーターは、ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
credentialConfig.setRoleSessionName("<RoleSessionName>");
// オプション。より制限の厳しいポリシーを指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
credentialConfig.setPolicy("<Policy>");
// オプション。セッションの有効期間。デフォルト値: 3600 秒。
credentialConfig.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Alibaba Cloud サービスの V2.0 SDK を使用する場合は、com.aliyun.teaopenapi.models.Config を使用して認証情報を渡します。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// config を使用してクラウドサービスクライアントを初期化するコードは省略されています。
}
}方法 7: URI 認証情報
STS サービスをカプセル化し、その URI を公開することで、外部サービスは URI を通じて STS トークンを取得できます。これにより、AccessKey ペアなどの機密情報が漏洩するリスクが軽減されます。Credentials ツールは、提供された URI にアクセスして STS トークンを取得し、このトークンをアクセス認証情報として使用します。この方法で取得した認証情報は、自動更新をサポートします。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。
URI は次の条件を満たす必要があります:
GET リクエストをサポートする必要があります。
応答状態コードは 2xx である必要があります。
応答本文は次の構造である必要があります:
{ "Code": "Success", "AccessKeySecret": "yourAccessKeySecret", "AccessKeyId": "STS.****************", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "yourSecurityToken" }
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("credentials_uri");
// 必須。外部認証情報を取得するための URI。フォーマットは http://local_or_remote_uri/ です。このパラメーターは、ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を使用して設定できます。
credentialConfig.setCredentialsUri("<CredentialsUri>");
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// Alibaba Cloud サービスの V2.0 SDK を使用する場合は、com.aliyun.teaopenapi.models.Config を使用して認証情報を渡します。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// config を使用してクラウドサービスクライアントを初期化するコードは省略されています。
}
}方法 8: ベアラートークン
現在、ベアラートークンをサポートしているのは Cloud Call Center (CCC) のみです。
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("bearer");
// 必須。ベアラートークンを入力してください。
credentialConfig.setBearerToken("<BearerToken>");
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// CCC の V2.0 SDK を使用する場合は、com.aliyun.teaopenapi.models.Config を使用して認証情報を渡します。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// config を使用してクラウドサービスクライアントを初期化するコードは省略されています。
}
}デフォルトの認証情報プロバイダーチェーン
デフォルトの認証情報プロバイダーチェーンは、事前定義された順序で認証情報を検索するフォールバック戦略です。ツールは、認証情報が見つかるまでチェーンを順に進みます。チェーン内のどのプロバイダーからも認証情報を取得できない場合、`CredentialException` がスローされます。検索順序は次のとおりです:
1. システムプロパティ
Credentials ツールは、まずシステムプロパティから認証情報を取得しようとします。
`alibabacloud.accessKeyId` と `alibabacloud.accessKeySecret` がシステムプロパティで定義されている場合、AccessKey ペアがデフォルトの認証情報として使用されます。
`alibabacloud.accessKeyId`、`alibabacloud.accessKeySecret`、および `alibabacloud.sessionToken` がシステムプロパティで定義されている場合、STS トークンがデフォルトの認証情報として使用されます。
Java プログラムを実行する際に、次の JVM パラメーターを追加してこれらの値を指定できます:
-Dalibabacloud.accessKeyId=your-access-key-id -Dalibabacloud.accessKeySecret=your-access-key-secret
2. 環境変数
システムプロパティに認証情報が見つからない場合、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 トークンがデフォルトの認証情報として使用されます。
3. 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 トークンをデフォルトの認証情報として取得します。
4. config.json 設定ファイル
この機能には credentials-java 0.3.8 以降が必要です。
それでも認証情報が見つからない場合、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 | 認証情報のコレクション。
|
5. インスタンス RAM ロール
認証情報が見つからない場合、Credentials ツールはインスタンスメタデータからインスタンスに付与された RAM ロールの STS トークンを取得し、それをデフォルトの認証情報として使用しようとします。インスタンスメタデータにアクセスする際、プログラムはまず現在のインスタンスにアタッチされている RAM ロールの名前を取得し、そのロールに基づいて対応する STS トークンを取得します。また、ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して RAM ロール名を指定することで、認証情報を取得するために必要な時間を短縮し、効率を向上させることもできます。
デフォルトでは、Credentials ツールはセキュリティ強化モード (IMDSv2) でメタデータにアクセスします。セキュリティ強化モードで例外が発生した場合、ALIBABA_CLOUD_IMDSV1_DISABLED 環境変数を使用して例外処理ロジックを制御できます:
値が
false(デフォルト) の場合、システムは一般モードに切り替えて認証情報の取得を続行しようとします。値が
trueの場合、セキュリティ強化モードのみが認証情報の取得に許可されます。セキュリティ強化モードでのアクセスが失敗した場合、例外がスローされます。
さらに、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定することで、インスタンスメタデータからの認証情報アクセスを無効にできます。
インスタンスメタデータの詳細については、「インスタンスメタデータの取得」をご参照ください。
ECS または ECI インスタンスに RAM ロールを付与する方法の詳細については、「RAM ロールを作成して ECS インスタンスにアタッチする」および「インスタンス RAM ロールを ECI インスタンスにアタッチする」をご参照ください。
セキュリティ強化モードで一時的な認証情報を取得するには、
credentials-java0.3.10 以降を使用する必要があります。
6. CredentialsURI
認証情報が見つからない場合、Credentials ツールは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数をチェックします。この変数が存在し、有効な URI を指している場合、Credentials ツールはこの URI にアクセスして STS トークンをデフォルトの認証情報として取得します。
セッション認証情報の自動更新メカニズム
セッション認証情報には、ram_role_arn、ecs_ram_role、oidc_role_arn、および credentials_uri が含まれます。このタイプの認証情報には、Credentials ツールに組み込みの自動更新メカニズムがあります。認証情報クライアントが初めて認証情報を取得した後、Credentials ツールは認証情報をキャッシュに保存します。後続のリクエストでは、同じ認証情報クライアントインスタンスが自動的にキャッシュから認証情報をフェッチします。キャッシュ内の認証情報の有効期限が切れている場合、認証情報クライアントインスタンスは認証情報を再取得し、キャッシュを更新します。
`ecs_ram_role` 認証情報の場合、Credentials ツールは認証情報の有効期限が切れる 15 分前にキャッシュをリフレッシュします。
次の例では、シングルトンパターンで認証情報クライアントを作成します。クライアントは、異なる時点で認証情報を取得して自動更新メカニズムを検証し、OpenAPI 操作を呼び出して取得した認証情報が有効であることを確認します。
import com.aliyun.credentials.models.CredentialModel;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.Date;
import java.util.concurrent.*;
public class Sample {
/**
* Credential クラスは、シングルトンパターンで Alibaba Cloud 認証情報インスタンスを管理するために使用されます。
*/
private static class Credential {
private static volatile com.aliyun.credentials.Client instance;
private Credential() {
}
public static com.aliyun.credentials.Client getInstance() {
if (instance == null) {
synchronized (Credential.class) {
if (instance == null) {
try {
com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
config.setType("ram_role_arn");
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.setRoleArn(System.getenv("ALIBABA_CLOUD_ROLE_ARN"));
config.setRoleSessionName("RamRoleArnTest");
config.setRoleSessionExpiration(3600);
instance = new com.aliyun.credentials.Client(config);
} catch (Exception e) {
throw new RuntimeException("Credential initialization failed: " + e.getMessage(), e);
}
}
}
}
return instance;
}
}
/**
* EcsClient クラスは、シングルトンパターンで ECS クライアントを管理するために使用されます。
*/
private static class EcsClient {
private static volatile Client instance;
private EcsClient() {
}
public static Client getInstance(com.aliyun.credentials.Client credentialClient) {
if (instance == null) {
synchronized (EcsClient.class) {
if (instance == null) {
try {
Config ecsConfig = new Config();
ecsConfig.setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
ecsConfig.setCredential(credentialClient);
instance = new Client(ecsConfig);
} catch (Exception e) {
throw new RuntimeException("ECS client initialization failed: " + e.getMessage(), e);
}
}
}
}
return instance;
}
}
public static void main(String[] args) {
// ThreadPoolExecutor を使用して、スケジュールされたスレッドプールを作成します。
ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(
1,
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
scheduler.setKeepAliveTime(0L, TimeUnit.SECONDS);
scheduler.allowCoreThreadTimeOut(false); // コアスレッドのタイムアウトを許可しません。
// 呼び出しロジックを実行する Runnable タスクを定義します。
Runnable task = () -> {
try {
com.aliyun.credentials.Client credentialClient = Credential.getInstance();
CredentialModel credential = credentialClient.getCredential();
System.out.println(new Date());
System.out.printf("AK ID:%s, AK Secret:%s, STS Token:%s%n", credential.accessKeyId, credential.accessKeySecret, credential.securityToken);
// この例では、ECS API 操作を呼び出して、認証情報が利用可能かどうかを確認します。必要に応じて変更できます。
Client ecsClient = EcsClient.getInstance(credentialClient);
DescribeRegionsRequest request = new DescribeRegionsRequest();
RuntimeOptions runtime = new RuntimeOptions();
DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(request, runtime);
System.out.printf("Invoke result:%s%n", response.statusCode);
} catch (Exception e) {
throw new RuntimeException("ECS client execution failed: " + e.getMessage(), e);
}
};
try {
// タスクを初めて (すぐに) 実行します。
scheduler.execute(task);
// 600 秒の遅延後にタスクを 2 回目に実行します。
scheduler.schedule(task, 600, TimeUnit.SECONDS);
// 開始から 4200 秒後にタスクを 3 回目に実行します。
scheduler.schedule(task, 4200, TimeUnit.SECONDS);
// 開始から 4300 秒後にタスクを 4 回目に実行します。
scheduler.schedule(task, 4300, TimeUnit.SECONDS);
} finally {
// すべてのタスクが完了した後にスレッドプールが閉じられるように、スレッドプールをシャットダウンします。
scheduler.shutdown();
try {
if (!scheduler.awaitTermination(4500, TimeUnit.SECONDS)) {
scheduler.shutdownNow();
}
} catch (InterruptedException e) {
scheduler.shutdownNow();
Thread.currentThread().interrupt();
}
}
}
}
以下にログ結果の分析を示します:
最初の呼び出しでは、認証情報がキャッシュされていません。そのため、システムは設定に基づいて認証情報を取得します。認証情報が取得されると、キャッシュに保存されます。
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 リファレンス」をご参照ください。