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

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

最終更新日:May 13, 2025

Alibaba Cloud SDK を使用して API オペレーションを呼び出してクラウドリソースを管理する場合、有効なクレデンシャル情報を設定する必要があります。Alibaba Cloud の Credentials ツールは、使いやすい機能セットを提供し、デフォルトクレデンシャル、AccessKey ペア、セキュリティトークンサービス (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 認証と承認に使用されます。

前提条件

Credentials ツールのインストール

次の Maven 依存関係を追加して、Alibaba Cloud Credentials for Java をインストールします。

<dependency>
   <groupId>com.aliyun</groupId>
   <artifactId>credentials-java</artifactId>
   <version>{VERSION}</version>
</dependency>
  • Alibaba Cloud Credentials for Java のすべてのリリースバージョンについては、「ChangeLog.txt」をご参照ください。

  • Alibaba Cloud Credentials for Java の最新バージョンを使用することをお勧めします。これにより、すべてのクレデンシャルがサポートされます。

  • Alibaba Cloud SDK V2.0 を使用することをお勧めします。Alibaba Cloud SDK V2.0 を使用せずに credentials-java モジュールに依存している場合は、次の依存関係を追加する必要があります。追加しないと、com.aliyun.tea.TeaModel クラスファイルが存在しないことを示すエラーが報告されます。

    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>tea</artifactId>
      <version>{VERSION}</version>
    </dependency>
    説明

    tea パッケージのバージョンについては、「tea-java」をご参照ください。

Credentials クライアントの初期化

ビジネス要件に基づいて、次のいずれかの方法を使用して Credentials クライアントを初期化できます。

重要
  • プロジェクトでプレーンテキストの AccessKey ペアを使用する場合、コードリポジトリの権限管理が不適切なために AccessKey ペアが漏洩する可能性があります。これは、AccessKey ペアが属するアカウント内のすべてのリソースのセキュリティを脅かす可能性があります。 AccessKey ペアは環境変数または構成ファイルに保存することをお勧めします。

  • Credentials クライアントはシングルインスタンスモードで構築することをお勧めします。このモードでは、SDK のクレデンシャルキャッシュ機能が有効になるだけでなく、複数の API 呼び出しによって発生するトラフィック制御の問題とパフォーマンスリソースの浪費を効果的に防ぐことができます。

方法 1:デフォルトのクレデンシャルプロバイダーチェーンを使用する

Credentials クライアントを初期化する方法を指定しない場合、デフォルトのクレデンシャルプロバイダーチェーンが使用されます。詳細については、「デフォルトのクレデンシャルプロバイダーチェーン」をご参照ください。

import com.aliyun.credentials.Client;

public class DemoTest {
    public static void main(String[] args) throws Exception{
        // Credentials クライアントを初期化する方法を指定しません。
        Client credentialClient = new Client();
        // new Client() に値は指定されていません。
    }
}

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

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;

public class Sample {
    public static void main(String[] args) throws Exception {
        // デフォルトのクレデンシャルを使用して、SDK Credentials クライアントを初期化します。
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();

        // Credentials クライアントを使用して、ECS SDK クライアントを初期化します。
        Config ecsConfig = new Config();
        ecsConfig.setCredential(credentialClient);
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        Client ecsClient = new Client(ecsConfig);
        // DescribeRegions オペレーションを呼び出すリクエストを初期化します。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // ランタイム設定を初期化します。
        RuntimeOptions runtime = new RuntimeOptions();
        // DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方法 2:AccessKey ペアを使用する

Alibaba Cloud アカウントまたは RAM ユーザーの API オペレーションを呼び出すために使用される AccessKey ペアを作成できます。詳細については、「AccessKey ペアの作成」をご参照ください。その後、AccessKey ペアを使用して Credentials クライアントを初期化できます。

警告

Alibaba Cloud アカウントは、アカウント内のリソースに対するすべての権限を持っています。Alibaba Cloud アカウントの AccessKey ペアの漏洩は、システムに重大な脅威をもたらします。

したがって、最小権限の原則 (PoLP) に基づいて権限が付与された RAM ユーザーの AccessKey ペアを使用して、Credentials クライアントを初期化することをお勧めします。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
    public static void main(String[] args) throws Exception{
        Config credentialConfig = new Config();
        credentialConfig.setType("access_key");
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        Client credentialClient = new Client(credentialConfig);
        // new Client() に値は指定されていません。
    }
}

Credentials ツールを使用して AccessKey ペアを読み取り、Alibaba Cloud サービスの API オペレーションを呼び出すことができます。

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

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;

public class Sample {
    public static void main(String[] args) throws Exception {
        // AccessKey ペアを使用して Credentials クライアントを初期化します。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // クレデンシャルのタイプを指定します。
        credentialsConfig.setType("access_key");
        // AccessKey ID を指定します。
        credentialsConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // AccessKey シークレットを指定します。
        credentialsConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        // Credentials クライアントを使用して、ECS SDK クライアントを初期化します。
        Config ecsConfig = new Config();
        ecsConfig.setCredential(credentialClient);
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        Client ecsClient = new Client(ecsConfig);
        // DescribeRegions オペレーションを呼び出すリクエストを初期化します。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // ランタイム設定を初期化します。
        RuntimeOptions runtime = new RuntimeOptions();
        // DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方法 3:STS トークンを使用する

RAM ユーザーとして STS の AssumeRole オペレーションを呼び出して、STS トークンを取得できます。STS トークンの最大有効期間を指定できます。次の例は、STS トークンを使用して Credentials クライアントを初期化する方法を示しています。この例では、STS トークンを取得する方法は示していません。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

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 シークレットを取得します。
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // 環境変数から一時的な STS トークンを取得します。
        credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
        Client credentialClient = new Client(credentialConfig);
        // new Client() に値は指定されていません。
    }
}

Credentials ツールを使用して STS トークンを読み取り、Alibaba Cloud サービスの API オペレーションを呼び出すことができます。

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

import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.sts20150401.Client;
import com.aliyun.sts20150401.models.AssumeRoleRequest;
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // StsClient オブジェクトを作成し、AssumeRole オペレーションを呼び出して STS トークンを取得します。
        Config config = new Config()
                // 環境変数から AccessKey ID を取得します。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 環境変数から AccessKey シークレットを取得します。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        config.endpoint = "sts.cn-hangzhou.aliyuncs.com";
        Client client = new Client(config);
        AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
                // アプリケーションにアシュームさせたい RAM ロールの Alibaba Cloud Resource Name (ARN) を、ALIBABA_CLOUD_ROLE_ARN 環境変数を指定することで指定します。例: acs:ram::123456789012****:role/adminrole。
                .setRoleArn("<RoleArn>")
                // ロールセッション名を指定します。ロールセッション名は、ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数として設定できます。
                .setRoleSessionName("<RoleSessionName>");
        RuntimeOptions runtime = new RuntimeOptions();
        AssumeRoleResponse assumeRoleResponse = client.assumeRoleWithOptions(assumeRoleRequest, runtime);
        AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials assumeRoleResponseBodyCredentials = assumeRoleResponse.body.credentials;

        // STS トークンを使用して Credentials クライアントを初期化します。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        credentialsConfig.setType("sts"); // クレデンシャルのタイプを指定します。
        credentialsConfig.setAccessKeyId(assumeRoleResponseBodyCredentials.accessKeyId);
        credentialsConfig.setAccessKeySecret(assumeRoleResponseBodyCredentials.accessKeySecret);
        credentialsConfig.setSecurityToken(assumeRoleResponseBodyCredentials.securityToken);
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        // DescribeRegions オペレーションを呼び出すリクエストを初期化します。
        Config ecsConfig = new Config();
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        ecsConfig.setCredential(credentialClient);
        com.aliyun.ecs20140526.Client ecsClient = new com.aliyun.ecs20140526.Client(ecsConfig);
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        RuntimeOptions describeRegionsRuntime = new RuntimeOptions();

        // DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, describeRegionsRuntime);
        System.out.println(response.body.toMap());
    }
}

方法 4:AccessKey ペアと RAM ロールを使用する

この方法の基本的なロジックは、STS トークンを使用して Credentials クライアントを初期化することです。RAM ロールの ARN を指定すると、Credentials ツールは STS から STS トークンを取得できます。setPolicy メソッドを使用して、RAM ロールの権限を制限することもできます。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
  public static void main(String[] args) throws Exception {
    Config credentialConfig = new Config();
    credentialConfig.setType("ram_role_arn");
    credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
    credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    // アプリケーションにアシュームさせたい RAM ロールの ARN を、ALIBABA_CLOUD_ROLE_ARN 環境変数を指定することで指定します。例: acs:ram::123456789012****:role/adminrole。
    credentialConfig.setRoleArn("<RoleArn>");
    // ロールセッション名を指定します。ロールセッション名は、ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数として設定できます。
    credentialConfig.setRoleSessionName("<RoleSessionName>");
    // オプション。RAM ロールの制限付き権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
    credentialConfig.setPolicy("<Policy>");
    // 必須ではありません。RAM ロールの外部 ID
    // このパラメーターは外部の当事者によって提供され、なりすまし副官問題を防ぐために使用されます。
    credentialConfig.setExternalId("<ExternalId>");
    credentialConfig.setRoleSessionExpiration(3600);
    Client credentialClient = new Client(credentialConfig);
    // new Client() に値は指定されていません。
  }
}

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

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;

public class Sample {
    public static void main(String[] args) throws Exception {
        // AccessKey ペアと RAM ロールを使用して Credentials クライアントを初期化します。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // クレデンシャルのタイプを指定します。
        credentialsConfig.setType("ram_role_arn");
        // 環境変数から AccessKey ID を取得します。
        credentialsConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // 環境変数から AccessKey シークレットを取得します。
        credentialsConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // アプリケーションにアシュームさせたい RAM ロールの ARN を、ALIBABA_CLOUD_ROLE_ARN 環境変数を指定することで指定します。例: acs:ram::123456789012****:role/adminrole。
        credentialsConfig.setRoleArn("<RoleArn>");
        // ロールセッション名を指定します。ロールセッション名は、ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数として設定できます。
        credentialsConfig.setRoleSessionName("<RoleSessionName>");
        // オプション。RAM ロールの制限付き権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
        credentialsConfig.setPolicy("<Policy>");
        // 必須ではありません。RAM ロールの外部 ID
        // このパラメーターは外部の当事者によって提供され、なりすまし副官問題を防ぐために使用されます。
        credentialsConfig.setExternalId("<ExternalId>");
        // セッションの有効期間を指定します。
        credentialsConfig.setRoleSessionExpiration(3600);
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        // DescribeRegions オペレーションを呼び出すリクエストを初期化します。
        Config ecsConfig = new Config();
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        ecsConfig.setCredential(credentialClient);
        Client ecsClient = new Client(ecsConfig);
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        RuntimeOptions runtime = new RuntimeOptions();
        // DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方法 5:ECS インスタンスの RAM ロールを使用する

ECS インスタンスとエラスティックコンテナインスタンスには、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-java のバージョンが 0.3.10 以降であることを確認してください。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

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 の値は、セキュリティ強化モード (IMDSv2) が強制的に使用されることを指定します。デフォルト値は false で、システムが最初にセキュリティ強化モード (IMDSv2) でアクセスクレデンシャルの取得を試みることを指定します。アクセスクレデンシャルの取得に失敗した場合、通常モード (IMDSv1) が使用されます。
        // credentialConfig.setDisableIMDSv1(true);
        Client credentialClient = new Client(credentialConfig);
        // new Client() に値は指定されていません。
    }
}

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

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;

public class Sample {
    public static void main(String[] args) throws Exception {
        // ECS インスタンスの RAM ロールを使用して Credentials クライアントを初期化します。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // クレデンシャルのタイプを指定します。
        credentialsConfig.setType("ecs_ram_role");
        // オプション。ECS インスタンスの RAM ロールの名前を指定します。このパラメーターを指定しない場合、その値は自動的に取得されます。リクエスト数を減らすために、このパラメーターを指定することをお勧めします。値は、ALIBABA_CLOUD_ECS_METADATA 環境変数から取得できます。
        credentialsConfig.setRoleName("<RoleName>");
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        // Credentials クライアントを使用して、ECS SDK クライアントを初期化します。
        Config ecsConfig = new Config();
        ecsConfig.setCredential(credentialClient);
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        Client ecsClient = new Client(ecsConfig);
        // DescribeRegions オペレーションを呼び出すリクエストを初期化します。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // ランタイム設定を初期化します。
        RuntimeOptions runtime = new RuntimeOptions();
        // DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方法 6:OIDC IdP の RAM ロールを使用する

Container Service for Kubernetes のワーカーノードに RAM ロールをアタッチした後、ワーカーノード上のポッド内のアプリケーションは、ECS インスタンス上のアプリケーションと同じ方法でメタデータサーバーを使用して STS トークンを取得できます。ただし、信頼されていないアプリケーション(顧客が送信したアプリケーションや、コードが利用できないアプリケーションなど)がワーカーノードにデプロイされている場合、アプリケーションがメタデータサーバーを使用してワーカーノードにアタッチされている RAM ロールの STS トークンを取得することを望まない場合があります。クラウドリソースのセキュリティを確保し、信頼されていないアプリケーションが必要な STS トークンを安全に取得できるようにするには、RAM Roles for Service Accounts (RRSA) 機能を使用して、PoLP に基づいてアプリケーションに権限を付与できます。この場合、ACK クラスタはサービスアカウント OpenID Connect (OIDC) トークンファイルを作成し、トークンファイルをポッドに関連付けて、関連する環境変数をポッドに挿入します。その後、Credentials ツールは環境変数を使用して STS の AssumeRoleWithOIDC オペレーションを呼び出し、RAM ロールの STS トークンを取得します。RRSA 機能の詳細については、「RRSA を使用して異なるポッドに異なるクラウドサービスへのアクセスを承認する」をご参照ください。

次の環境変数がポッドに挿入されます。

ALIBABA_CLOUD_ROLE_ARN: RAM ロールの ARN。

ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDC ID プロバイダー (IdP) の ARN。

ALIBABA_CLOUD_OIDC_TOKEN_FILE: OIDC トークンファイルのパス。

説明

credentials-java のバージョンが 0.2.10 以降であることを確認してください。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

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>");
    // ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を指定することで、OIDC IdP の ARN を指定します。
    credentialConfig.setOidcProviderArn("<OidcProviderArn>");
    // ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を指定することで、OIDC トークンファイルのパスを指定します。
    credentialConfig.setOidcTokenFilePath("<OidcTokenFilePath>");
    // ロールセッション名を指定します。ロールセッション名は、ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数として設定できます。
    credentialConfig.setRoleSessionName("<RoleSessionName>");
    // オプション。RAM ロールの制限付き権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
    credentialConfig.setPolicy("<Policy>");
    // セッションの有効期間を指定します。
    credentialConfig.setRoleSessionExpiration(3600);
    Client credentialClient = new Client(credentialConfig);
    // new Client() に値は指定されていません。
  }
}

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

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;

public class Sample {
    public static void main(String[] args) throws Exception {
        // OIDC IdP の RAM ロールを使用して Credentials クライアントを初期化します。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // クレデンシャルのタイプを指定します。
        credentialsConfig.setType("oidc_role_arn");
        // ALIBABA_CLOUD_ROLE_ARN 環境変数を指定することで、OIDC IdP の ARN を指定します。
        credentialsConfig.setRoleArn("<RoleArn>");
        // ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を指定することで、OIDC IdP の ARN を指定します。
        credentialsConfig.setOidcProviderArn("<OidcProviderArn>");
        // ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を指定することで、OIDC トークンファイルのパスを指定します。
        credentialsConfig.setOidcTokenFilePath("<OidcTokenFilePath>");
        // ロールセッション名を指定します。ロールセッション名は、ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数として設定できます。
        credentialsConfig.setRoleSessionName("<RoleSessionName>");
        // オプション。RAM ロールの制限付き権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
        credentialsConfig.setPolicy("<Policy>");
        // セッションの有効期間を指定します。
        credentialsConfig.setRoleSessionExpiration(3600);
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        // Credentials クライアントを使用して、ECS SDK クライアントを初期化します。
        Config ecsConfig = new Config();
        ecsConfig.setCredential(credentialClient);
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        Client ecsClient = new Client(ecsConfig);
        // DescribeRegions オペレーションを呼び出すリクエストを初期化します。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // ランタイム設定を初期化します。
        RuntimeOptions runtime = new RuntimeOptions();
        // DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方法 7:クレデンシャル URI を使用する

この方法の基本的なロジックは、STS トークンを使用して Credentials クライアントを初期化することです。Credentials ツールは、提供された Uniform Resource Identifier (URI) を使用して STS トークンを取得します。 następnie STS トークンを使用して、Credentials クライアントが初期化されます。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

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);
        // new Client() に値は指定されていません。
    }
}

Alibaba Cloud サービスの API オペレーションを呼び出すには、クレデンシャルのローカルまたはリモート URI を指定し、Credentials ツールを使用して、ローカルまたはリモート URI に基づいて STS トークンを取得し、自動的に更新できます。

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

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;

public class Sample {
    public static void main(String[] args) throws Exception {
        // URI を使用して Credentials クライアントを初期化します。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // クレデンシャルのタイプを指定します。
        credentialsConfig.setType("credentials_uri");
        // ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を指定することで、クレデンシャルの URI を http://local_or_remote_uri/ 形式で取得します。
        credentialsConfig.setCredentialsUri("<CredentialsUri>");
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        // Credentials クライアントを使用して、ECS SDK クライアントを初期化します。
        Config ecsConfig = new Config();
        ecsConfig.setCredential(credentialClient);
        ecsConfig.setEndpoint("ecs.aliyuncs.com");
        Client ecsClient = new Client(ecsConfig);
        // DescribeRegions オペレーションを呼び出すリクエストを初期化します。
        DescribeRegionsRequest describeInstancesRequest = new DescribeRegionsRequest();
        // ランタイム設定を初期化します。
        RuntimeOptions runtime = new RuntimeOptions();
        // DescribeRegions オペレーションを呼び出し、レスポンスを取得します。
        DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(describeInstancesRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

方法 8:ベアラトークンを使用する

Cloud Call Center のみ、ベアラトークンを使用して SDK クライアントを初期化できます。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

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);
        // new Client() に値は指定されていません。
    }
}

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

import com.aliyun.ccc20200701.Client;
import com.aliyun.ccc20200701.models.GetInstanceRequest;
import com.aliyun.ccc20200701.models.GetInstanceResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

public class Sample {
    public static void main(String[] args) throws Exception {
        // ベアラトークンを使用して Credentials クライアントを初期化します。
        com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config();
        // クレデンシャルのタイプを指定します。
        credentialsConfig.setType("bearer");
        // サーバーによって自動的に生成されるベアラトークンを指定します。ベアラトークンには有効期間があります。
        credentialsConfig.setBearerToken("<bearer_token>");
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

        // Credentials クライアントを使用して、ECS SDK クライアントを初期化します。
        Config cccConfig = new Config();
        cccConfig.setCredential(credentialClient);
        cccConfig.setEndpoint("ccc.aliyuncs.com");
        Client cccClient = new Client(cccConfig);
        // API オペレーションを呼び出します。
        GetInstanceRequest getInstanceRequest = new GetInstanceRequest().setInstanceId("ccc-test");
        // ランタイム設定を初期化します。
        RuntimeOptions runtime = new RuntimeOptions();
        GetInstanceResponse response = cccClient.getInstanceWithOptions(getInstanceRequest, runtime);
        System.out.println(response.body.toMap());
    }
}

デフォルトのクレデンシャルプロバイダーチェーン

アプリケーションの開発環境と本番環境で異なるタイプのクレデンシャルを使用する場合、通常はコードから環境情報を取得し、コードブランチを作成して開発環境と本番環境の異なるクレデンシャルを取得する必要があります。Alibaba Cloud Credentials for Java のデフォルトのクレデンシャルプロバイダーチェーンを使用すると、コードを変更することなく、アプリケーションとは無関係な設定に基づいて、異なる環境のクレデンシャルを取得できます。Client client = new Client() を使用して初期化方法を指定せずに Credentials クライアントを初期化すると、Credentials ツールは次の順序でクレデンシャル情報を取得します。

1. システムプロパティからクレデンシャル情報を取得する

Credentials ツールは、最初にシステムプロパティからクレデンシャル情報を取得します。次の両方の属性が指定されているかどうかを確認します。

  • alibabacloud.accessKeyId

  • alibabacloud.accessKeyIdSecret

指定されている場合、それらはデフォルトクレデンシャルとして使用されます。Java アプリケーションを実行するときに、次の JVM パラメーターを追加して、上記の属性の値を指定できます。

-Dalibabacloud.accessKeyId=your-access-key-id -Dalibabacloud.accessKeyIdSecret=your-access-key-secret

2. 環境変数からクレデンシャル情報を取得する

システム属性にクレデンシャル情報が見つからない場合、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 トークンがデフォルトクレデンシャルとして使用されます。

3. 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 トークンをデフォルトクレデンシャルとして取得します。

4. config.json ファイルからクレデンシャル情報を取得する

説明

credentials-java のバージョンが 0.3.8 以降であることを確認してください。

優先順位の高いクレデンシャルが見つからない場合、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":"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 ペアを使用してクレデンシャル情報を取得します。

  • RamRoleArn: RAM ロールの ARN を使用してクレデンシャル情報を取得します。

  • EcsRamRole: ECS インスタンスにアタッチされている RAM ロールを使用してクレデンシャル情報を取得します。

  • OIDC: OIDC IdP の ARN と OIDC トークンファイルを使用してクレデンシャル情報を取得します。

  • ChainableRamRoleArn: ロールチェーンを使用して、別の JSON ファイルのアクセスクレデンシャルを指定してクレデンシャル情報を取得します。

説明

ビジネス要件に基づいて他のパラメーターを設定します。

設定が完了すると、Credentials ツールは設定ファイルの current パラメーターで指定されたクレデンシャルを選択し、クライアントを初期化します。ALIBABA_CLOUD_PROFILE 環境変数を指定してクレデンシャル情報を指定することもできます。たとえば、ALIBABA_CLOUD_PROFILE 環境変数を client1 に設定できます。

5. 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 のメタデータサーバーへのアクセスを無効にすることができます。

説明
説明

セキュリティ強化モード (IMDSv2) でクレデンシャルを取得するには、credentials-java のバージョンが 0.3.10 以降であることを確認してください。

6. クレデンシャル URI を使用してクレデンシャル情報を取得する

上記のいずれの方法でも有効なクレデンシャルが取得されない場合、Credentials ツールは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を確認します。この環境変数が存在し、有効な URI が指定されている場合、Credentials ツールは HTTP リクエストを開始して、STS トークンをデフォルトクレデンシャルとして取得します。

セッションクレデンシャルの自動更新メカニズム

セッション資格情報には、RAM ロールの ARN(RamRoleArn)、ECS インスタンスの RAM ロール、OIDC IdP の RAM ロール(OIDCRoleArn)、および資格情報 URI が含まれます。Credentials ツールは、セッション資格情報の組み込み自動更新メカニズムを提供します。最初の呼び出しから資格情報を取得した後、Credentials ツールは資格情報をキャッシュに保存します。後続の呼び出しでは、資格情報の有効期限が切れていない限り、資格情報はキャッシュから読み取られます。それ以外の場合、Credentials ツールは資格情報を再度取得するために呼び出しを行い、キャッシュ内の資格情報を更新します。

説明

ECS インスタンスの RAM ロールの場合は、キャッシュの生存時間( TTL )が終了する 15 分前に資格情報ツールによって資格情報が更新されます。

参照資料