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

Alibaba Cloud SDK:アクセス資格情報を管理する

最終更新日:Jan 15, 2025

Alibaba Cloud SDKを使用してAPI操作を呼び出してクラウド リソースを管理する場合、有効な資格情報を構成する必要があります。このトピックでは、Java用Alibaba Cloud SDK V1.0のアクセス資格情報を構成する方法について説明します。アクセス資格情報は、開発にSDKを使用する際のアクセス セキュリティを確保します。

前提条件

aliyun-java-sdk-core パッケージのバージョンは 4.7.3 以降である必要があります。

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.7.3</version>
</dependency>

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

重要
  • Alibaba CloudアカウントのAccessKeyペアが漏洩した場合、そのアカウントに属するリソースは潜在的なリスクにさらされます。アカウントのセキュリティを確保するために、Resource Access Management (RAM) ユーザーのAccessKeyペアを使用することをお勧めします。詳細については、「AccessKeyを作成する」をご参照ください。

  • 実行時環境に ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数と ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が構成されていることを確認します。詳細については、「Linux、macOS、および Windows で環境変数を構成する」をご参照ください。

  • DefaultProfile を使用して、クライアントの初期化に AccessKey ペアを構成します。

    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.profile.DefaultProfile;
    
    public class Sample {
        public static void main(String[] args) {
            DefaultProfile profile = DefaultProfile.getProfile(
                    "<REGION_ID>",
                    // 環境変数からRAMユーザーのAccessKey IDを取得します。
                    System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                    // 環境変数からRAMユーザーのAccessKeyシークレットを取得します。
                    System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            IAcsClient client = new DefaultAcsClient(profile);
            // API操作を呼び出す手順は省略されています。
        }
    }
  • BasicCredentials を使用して、クライアントの初期化に AccessKey ペアを構成します。

    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.auth.BasicCredentials;
    import com.aliyuncs.profile.DefaultProfile;
    
    public class Sample {
        public static void main(String[] args) {
            BasicCredentials basicCredentials = new BasicCredentials(
                    // 環境変数からRAMユーザーのAccessKey IDを取得します。
                    System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                    // 環境変数からRAMユーザーのAccessKeyシークレットを取得します。
                    System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
            );
            DefaultProfile profile = DefaultProfile.getProfile("<REGION_ID>");
            IAcsClient client = new DefaultAcsClient(profile, basicCredentials);
            // API操作を呼び出す手順は省略されています。
        }
    }

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

クライアントの初期化に一時的なSecurity Token Service (STS) トークンを使用します。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.profile.DefaultProfile;

public class Test {
    public static void main(String[] args) {
        DefaultProfile profile = DefaultProfile.getProfile(
                "<REGION_ID>",
                // 環境変数からRAMユーザーのAccessKey IDを取得します。
                System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // 環境変数からRAMユーザーのAccessKeyシークレットを取得します。
                System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
                // STSトークン
                System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
        IAcsClient client = new DefaultAcsClient(profile);
        // API操作を呼び出す手順は省略されています。
    }
}

方法 3: RamRoleArn を使用する

RAMユーザーとしてSTSの AssumeRole 操作を呼び出して、STSトークンを取得します。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.STSAssumeRoleSessionCredentialsProvider;
import com.aliyuncs.profile.DefaultProfile;

public class Sample {
    public static void main(String[] args) {
        DefaultProfile profile = DefaultProfile.getProfile("<REGION_ID>");
        // クライアントの初期化にRamRoleArnを使用します。
        STSAssumeRoleSessionCredentialsProvider stsProvider = STSAssumeRoleSessionCredentialsProvider
                .builder()
                // 必須。環境変数からRAMユーザーのAccessKey IDを取得します。
                .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 必須。環境変数からRAMユーザーのAccessKeyシークレットを取得します。
                .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
                // RAMロールのAlibaba Cloud Resource Name (ARN) を指定します。ALIBABA_CLOUD_ROLE_ARN環境変数を使用してRAMロールのARNを構成している場合は、このパラメーターはオプションです。それ以外の場合は、このパラメーターは必須です。
                .roleArn("<ROLE_ARN>")
                // オプション。カスタム セッション名を指定します。ALIBABA_CLOUD_ROLE_SESSION_NAME環境変数を使用してセッション名を構成できます。
                .roleSessionName("<ROLE_SESSION_NAME>")
                // オプション。カスタム ポリシーを指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
                .policy("<POLICY>")
                // オプション。なりすまし副官の問題を防ぐために、外部IDを指定します。
                .externalId("<<EXTERNAL_ID>>")
                // オプション。アクセス資格情報の有効期間を指定します。単位: 秒。デフォルト値: 3600。有効期間は 12 時間を超えることはできません。
                .durationSeconds(3600)
                // オプション。AssumeRole操作で使用するリージョン ID を指定します。
                .stsRegionId("<STS_REGION_ID>") 
                .build();
        DefaultAcsClient client = new DefaultAcsClient(profile, stsProvider);
        // API操作を呼び出す手順は省略されています。
    }
}

方法 4: ECSRamRole を使用する

セキュアで便利な方法でアプリケーションをデプロイするために、SDKでは、Elastic Computer Service (ECS) インスタンスにアタッチされたRAMロールを使用して一時的な認証トークンを取得できます。このトークンを使用して、ECSインスタンスにアタッチされたRAMロールで使用可能なリソースとサービスにアクセスできます。詳細については、「API操作を呼び出してインスタンスRAMロールを使用する」トピックの「手順 5: (オプション) 一時的な認証トークンを取得する」セクションをご参照ください。このようにして、ECSインスタンスにデプロイされたアプリケーションは、AccessKeyペアを使用せずにAPI操作を呼び出すことができます。RAMロールは、ECSインスタンスまたはエラスティック コンテナー インスタンスにアタッチできます。Credentialsツールは、インスタンスにアタッチされたRAMロールを自動的に取得し、メタデータ サーバーを使用してRAMロールのSTSトークンを取得します。次に、STSトークンを使用してCredentialsクライアントが初期化されます。

メタデータ サーバーは、通常モード (IMDSv1) とセキュリティ強化モード (IMDSv2) でのアクセスをサポートしています。デフォルトでは、Credentialsツールはセキュリティ強化モードでメタデータ サーバーからアクセス資格情報を取得します。セキュリティ強化モードで例外が発生した場合は、DisableIMDSv1 パラメーターを構成して、例外処理ロジックを指定できます。DisableIMDSv1 パラメーターの有効な値:

  1. false (デフォルト): Credentialsツールは、通常モードでアクセス資格情報の取得を続けます。

  2. true: 例外がスローされ、Credentialsツールはセキュリティ強化モードでアクセス資格情報の取得を続けます。

メタデータ サーバーの構成によって、サーバーがセキュリティ強化モードをサポートするかどうかが決まります。

説明
重要

使用するRAMロールが、SDKがインストールされているECSインスタンスにアタッチされていることを確認します。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.InstanceProfileCredentialsProvider;
import com.aliyuncs.profile.DefaultProfile;

public class Sample {
    public static void main(String[] args) {
        DefaultProfile profile = DefaultProfile.getProfile("<REGION_ID>");
        // クライアントの初期化にECSRamRoleを使用します。
        InstanceProfileCredentialsProvider provider = InstanceProfileCredentialsProvider
                .builder()
                // ECSインスタンスにアタッチされているRAMロールの名前を指定します。
                .roleName("<ROLE_NAME>")
                //.disableIMDSv1(false)
                .build();
        DefaultAcsClient client = new DefaultAcsClient(profile, provider);
        // API操作を呼び出す手順は省略されています。
    }
}

方法 5: OIDCRoleArn を使用する

Container Service for Kubernetes (ACK) クラスターのワーカー ノードにRAMロールを割り当てた後、RAM Roles for Service Accounts (RRSA) 機能を使用して、ACKクラスター内のさまざまなアプリケーションがさまざまなRAMロールを引き受けることを許可できます。アプリケーションは特定のRAMロールを引き受け、STSトークンを取得し、そのトークンを使用してクラウド サービスにアクセスできます。これにより、最小権限の原則が適用され、アプリケーションはAccessKeyペアを使用せずにAPI操作を呼び出すことができるため、AccessKeyペアの漏洩を防ぎます。

ACKは、サービス アカウント OpenID Connect (OIDC) トークン ファイルを作成し、トークン ファイルをポッドに関連付け、関連する環境変数をポッドに挿入します。SDKは環境変数を使用し、STSの AssumeRoleWithOIDC 操作を呼び出して、RAMロールのSTSトークンを取得します。詳細については、「RRSAを使用して、さまざまなポッドにさまざまなクラウド サービスへのアクセスを許可する」をご参照ください。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.auth.OIDCCredentialsProvider;
import com.aliyuncs.profile.DefaultProfile;

public class Sample {
    public static void main(String[] args) {
        // クライアントの初期化にOIDCRoleArnを使用します。
        OIDCCredentialsProvider provider = OIDCCredentialsProvider
                .builder()
                // OIDCプロバイダーのARNを指定します。ALIBABA_CLOUD_OIDC_PROVIDER_ARN環境変数を使用してOIDCプロバイダーのARNを構成している場合は、このパラメーターはオプションです。それ以外の場合は、このパラメーターは必須です。
                .oidcProviderArn(System.getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN"))
                // OIDCトークン ファイルのパスを指定します。ALIBABA_CLOUD_OIDC_TOKEN_FILE環境変数を使用してパスを構成している場合は、このパラメーターはオプションです。それ以外の場合は、このパラメーターは必須です。
                .oidcTokenFilePath(System.getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE"))
                // RAMロールのARNを指定します。ALIBABA_CLOUD_ROLE_ARN環境変数を使用してRAMロールのARNを構成している場合は、このパラメーターはオプションです。それ以外の場合は、このパラメーターは必須です。
                .roleArn(System.getenv("ALIBABA_CLOUD_ROLE_ARN"))
                // オプション。カスタム セッション名を指定します。
                .roleSessionName("<ROLE_SESSION_NAME>")
                // オプション。カスタム ポリシーを指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}。
                .policy("<POLICY>")
                // オプション。アクセス資格情報の有効期間を指定します。単位: 秒。デフォルト値: 3600。有効期間は 12 時間を超えることはできません。
                .durationSeconds(3600)
                // オプション。STSのリージョン ID を指定します。
                .stsRegionId("<REGION_ID>")
                .build();
        DefaultProfile profile = DefaultProfile.getProfile(
                // クライアントのリージョン ID を指定します。
                "<REGION_ID>");
        IAcsClient client = new DefaultAcsClient(profile, provider);
        // API操作を呼び出す手順は省略されています。
    }
}

デフォルトの資格情報プロバイダー チェーンを使用する

SDKクライアントを初期化する方法を指定しない場合、デフォルトの資格情報プロバイダー チェーンが使用されます。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;

public class Test {
    public static void main(String[] args) throws ClientException {
        // デフォルトの資格情報プロバイダー チェーンを使用します。
        IAcsClient client = new DefaultAcsClient("<REGION_ID>");
        // API操作を呼び出す手順は省略されています。
    }
}

デフォルトの資格情報プロバイダー チェーンは、次の順序で資格情報を検索して使用します。

1. システム プロパティ

資格情報プロバイダー チェーンは、システム プロパティで資格情報を検索します。システム プロパティ alibabacloud.accessKeyIdalibabacloud.accessKeyIdSecret が定義されていて、システム プロパティにnull以外の値が指定されている場合、資格情報プロバイダー チェーンはシステム プロパティの値を使用してデフォルトの資格情報を作成します。

2. 環境変数

資格情報プロバイダー チェーンは、環境変数から資格情報を検索します。環境変数 ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET が定義されていて、環境変数にnull以外の値が指定されている場合、資格情報プロバイダー チェーンは環境変数の値を使用してデフォルトの資格情報を作成します。

3. OIDCプロバイダーのRAMロール

前の手順で資格情報が見つからない場合、Credentialsツールは次の環境変数の値を取得します。

ALIBABA_CLOUD_ROLE_ARN: RAMロールのARN。

ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDCプロバイダーのARN。

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

上記の 3 つの環境変数が指定されている場合、Credentialsツールは環境変数を使用してSTSの AssumeRoleWithOIDC 操作を呼び出し、デフォルトの資格情報としてSTSトークンを取得します。

4. 構成ファイル config.json

前の手順で資格情報が見つからない場合、Credentialsツールは config.json ファイルから資格情報を取得します。構成ファイルのパスは、オペレーティング システムによって異なります。

Linux: ~/.aliyun/config.json

Windows: C:\Users\USER_NAME\.aliyun\config.json

config.json ファイルが存在する場合、アプリケーションは config.json ファイルの current パラメーターで指定された資格情報を使用してCredentialsクライアントを初期化します。ALIBABA_CLOUD_PROFILE 環境変数を指定して資格情報を指定することもできます。たとえば、ALIBABA_CLOUD_PROFILE 環境変数を client1 に設定できます。

config.json ファイルの mode パラメーターは、資格情報を取得するために使用される方法を指定します。有効な値:

  • AK: RAMユーザーのAccessKeyペアを使用して資格情報を取得します。

  • RamRoleArn: RAMロールのARNを使用して資格情報を取得します。

  • EcsRamRole: ECSインスタンスにアタッチされたRAMロールを使用して資格情報を取得します。

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

  • ChainableRamRoleArn: ロール チェーンを使用して、別の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
		}
	]
}

5. ECSインスタンスのRAMロール

前の手順で資格情報が見つからない場合、Credentialsツールは、ECSインスタンスのRAMロール名を指定する ALIBABA_CLOUD_ECS_METADATA 環境変数の値を取得します。RAMロールが存在する場合、アプリケーションはECSのメタデータ サーバーを使用してRAMロールのSTSトークンをデフォルトの資格情報として取得します。

6. 資格情報 URI

前の手順で資格情報が見つからない場合、Credentialsツールは、資格情報のURIを指定する ALIBABA_CLOUD_CREDENTIALS_URI 環境変数の値を取得します。資格情報のURIが存在する場合、アプリケーションは資格情報のURIを使用してSTSトークンをデフォルトの資格情報として取得します。