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 パラメーターの有効な値:
false(デフォルト): Credentialsツールは、通常モードでアクセス資格情報の取得を続けます。true: 例外がスローされ、Credentialsツールはセキュリティ強化モードでアクセス資格情報の取得を続けます。
メタデータ サーバーの構成によって、サーバーがセキュリティ強化モードをサポートするかどうかが決まります。
インスタンス メタデータの詳細については、「インスタンス メタデータを取得する」をご参照ください。
ECSインスタンスにRAMロールをアタッチする方法の詳細については、「インスタンスRAMロールの作成とECSインスタンスへのアタッチ」セクションのインスタンスRAMロールのトピックをご参照ください。Elastic Container InstanceにRAMロールをアタッチする方法の詳細については、「Elastic Container InstanceへのインスタンスRAMロールの割り当て」セクションのAPIオペレーションを呼び出してインスタンスRAMロールを使用するのトピックをご参照ください。
使用する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.accessKeyId と alibabacloud.accessKeyIdSecret が定義されていて、システム プロパティにnull以外の値が指定されている場合、資格情報プロバイダー チェーンはシステム プロパティの値を使用してデフォルトの資格情報を作成します。
2. 環境変数
資格情報プロバイダー チェーンは、環境変数から資格情報を検索します。環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_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トークンをデフォルトの資格情報として取得します。