インスタンス RAM ロールを使用すると、ECS インスタンスは特定の権限を持つロールを引き受けることができます。自社で管理するアプリケーションが Alibaba Cloud ECS インスタンスにデプロイされている場合、アクセス認証情報をハードコーディングすることなく、インスタンス RAM ロールを使用して Key Management Service (KMS) にアクセスできます。このトピックでは、インスタンス RAM ロールを使用して KMS にアクセスする方法について説明します。
適用範囲
Alibaba Cloud SDK:コントロールプレーン操作の実行に使用されます。
Credentials SDK:Secrets Manager クライアント、Secrets Manager JDBC クライアント、RAM シークレットプラグインが含まれます。シークレット値の取得に使用されます。
前提条件
ECS インスタンスが VPC 内にあること。
ECS インスタンスに一度にアタッチできる RAM ロールは 1 つのみです。
RAM ユーザーの場合、RAM ロールを設定するために必要な権限を Alibaba Cloud アカウントの管理者にリクエストしてください。詳細については、「インスタンス RAM ロール」をご参照ください。
ステップ1:RAM ロールの作成と権限の付与
RAM コンソール
RAM ロールを作成し、信頼されたエンティティを Alibaba Cloud サービスに設定します。
RAM コンソールにログインします。
左側のナビゲーションペインで、を選択します。
ロール ページで ロールの作成 をクリックし、画面の指示に従います。 次のパラメーターを設定し、他のパラメーターは必要に応じて設定します。
ロール名:このトピックでは EcsRamRoleTest を例として使用します。
信頼されたエンティティタイプ:[Alibaba Cloudサービス] を選択します。
信頼されたサービス:[ECS] を選択します。
RAM ロールに KMS へのアクセス権限を付与します。
デフォルトでは、新しい RAM ロールには権限がありません。ロールに権限を付与する必要があります。
アイデンティティ > ロール ページで、対象の RAM ロールの [アクション] 列の [ポリシーのアタッチ] をクリックします。
[ポリシーのアタッチ] パネルで、[システムポリシー] を選択し、 AliyunKMSFullAccess を検索して選択し、[OK] をクリックします。
RAM API
RAM ロールを作成し、信頼されたエンティティを Alibaba Cloud サービスに設定します。
RAM の CreateRole API を次のパラメーターで呼び出します。
RoleName:RAM ロールの名前を入力します。このトピックでは EcsRamRoleTest を例として使用します。AssumeRolePolicyDocument:次のポリシードキュメントを使用して、ECS がこのロールを引き受けることを許可します。{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
RAM ロールに KMS へのアクセス権限を付与します。
RAM の AttachPolicyToRole API を呼び出して、AliyunKMSFullAccess システムポリシーを EcsRamRoleTest インスタンス RAM ロールにアタッチします。次のパラメーターを設定します。
PolicyType:システムポリシーを示すため、System に設定します。PolicyName:AliyunKMSFullAccess に設定します。RoleName:RAM ロールの名前 (EcsRamRoleTest など) を設定します。
ステップ2:RAM ロールの ECS インスタンスへのアタッチ
ECS コンソール
ECS インスタンスを購入していない場合は、まず購入してください。詳細については、「カスタム起動タブでのインスタンス作成」をご参照ください。
ECS コンソールにログインします。
左側のナビゲーションペインで、インスタンス & イメージ> [インスタンス]を選択します。
上部メニューで、ECS インスタンスが存在するリージョンとリソースグループを選択します。
対象の ECS インスタンスを探し、[操作] 列で
>インスタンスの設定>RAM ロールのアタッチ/デタッチ を選択します。表示されたダイアログボックスで、作成した RAM ロールを選択し、[OK] をクリックします。
ECS API
既存の ECS インスタンスにインスタンス RAM ロールをアタッチする
ECS の AttachInstanceRamRole API を呼び出して、VPC 内の既存の ECS インスタンスにインスタンス RAM ロールをアタッチします。次のパラメーターを設定します。
RegionId:インスタンスが存在するリージョンの ID。RamRoleName:RAM ロールの名前 (EcsRamRoleTest など)。InstanceIds:ECS インスタンスの ID (例: ["i-bXXXXXXXX"])。
ECS インスタンスの作成時にインスタンス RAM ロールを指定する
インスタンスを作成します。
ECS の CreateInstance API を呼び出します。次のパラメーターを設定します。
RegionId:インスタンスが存在するリージョンの ID。ImageId:インスタンスのイメージの ID。例:centos_7_03_64_40G_alibase_****.vhd。InstanceType:インスタンスタイプ。例:ecs.g6.large。VSwitchId:インスタンスが存在する VPC 内の vSwitch の ID。説明インスタンス RAM ロールは、VPC 内の ECS インスタンスでのみサポートされます。このパラメーターは必須です。
RamRoleName:インスタンス RAM ロールの名前 (EcsRamRoleTest など)。
RAM ユーザーにインスタンス RAM ロールの使用を承認することもできます。詳細については、「インスタンス RAM ロール」をご参照ください。
ECS の ModifyInstanceVncPasswd API および StartInstance API を呼び出して、インスタンスのパスワードを設定し、インスタンスを起動します。
ステップ3:RAM ロールを使用した KMS へのアクセス
このセクションでは、KMS の ListKeys API を呼び出して、現在のリージョンにあるすべてのキー ID を一覧表示する Java の例を示します。より詳細な SDK ガイダンスについては、「SDK リファレンス」をご参照ください。
Alibaba Cloud SDK V2.0
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
public static com.aliyun.kms20160120.Client createClient() throws Exception {
com.aliyun.credentials.models.Config credentialConfig = new com.aliyun.credentials.models.Config();
// 認証情報タイプを設定します。
credentialConfig.type = "ecs_ram_role";
// オプション。API呼び出しを削減するために、インスタンス RAM ロール名を指定します。このパラメーターを省略すると、ロール名は自動的に取得されます。
credentialConfig.roleName = "<your-ecsRamRoleName>";
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialConfig);
com.aliyun.teaopenapi.models.Config kmsClientConfig = new com.aliyun.teaopenapi.models.Config()
// KMSエンドポイントを設定します。例:kms.cn-hangzhou.aliyuncs.com
.setEndpoint( "kms.cn-hangzhou.aliyuncs.com").
setCredential(credentialClient);
return new com.aliyun.kms20160120.Client(kmsClientConfig);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.kms20160120.Client client = Sample.createClient();
com.aliyun.kms20160120.models.ListKeysRequest listKeysRequest = new com.aliyun.kms20160120.models.ListKeysRequest();
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
client.listKeysWithOptions(listKeysRequest, runtime);
} catch (TeaException error) {
System.out.println(error.getMessage());
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
_error.printStackTrace();
}
}
}タブボディ
Secrets Manager クライアント
詳細については、「Secrets Manager クライアント」をご参照ください。
secretsmanager.propertiesファイル、またはシステム環境変数に、次のパラメーターを設定します。パラメーター
値
credentials_type
ecs_ram_roleに設定します。credentials_role_session_name
ロールセッションのカスタム名。監査に使用されます。
cache_client_region_id
[{"regionId":"<your region id>"}]の形式で指定します。<your region id>は実際のリージョン ID に置き換えてください。クライアントをビルドしてシークレット値を取得します。
import com.aliyuncs.kms.secretsmanager.client.v2.SecretCacheClient; import com.aliyuncs.kms.secretsmanager.client.v2.SecretCacheClientBuilder; import com.aliyuncs.kms.secretsmanager.client.v2.exception.CacheSecretException; import com.aliyuncs.kms.secretsmanager.client.v2.model.SecretInfo; public class CacheClientEnvironmentSample { public static void main(String[] args) { try { SecretCacheClient client = SecretCacheClientBuilder.newClient(); SecretInfo secretInfo = client.getSecretInfo("#secretName#"); System.out.println(secretInfo); } catch (CacheSecretException e) { e.printStackTrace(); } } }
Secrets Manager JDBC クライアント
このセクションでは、JDBC を介した MySQL データベース接続を例として使用します。詳細については、「Secrets Manager JDBC クライアント」をご参照ください。
プロジェクトのアプリケーションコードに、「
secretsmanager.properties」という名前の設定ファイルを追加します。## アクセス認証情報のタイプ credentials_type=ecs_ram_role ## ECS RAM ロールの名前 credentials_role_name=#credentials_role_name# ## 関連するKMSインスタンスのリージョン cache_client_region_id=[{"regionId":"#regionId#"}] ## カスタム更新間隔。単位:ミリ秒。デフォルト:6時間。最小:5分。 refresh_secret_ttl=21600000JDBC を介して MySQL データベースに接続します。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCSample { public static void main(String[] args) throws Exception { // Alibaba Cloud Secrets Manager JDBCドライバー com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver をロードします Class.forName("com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:mysql://<YOUR-MYSQL-IP>:<YOUR-MYSQL-PORT>/<YOUR-DATABASE-NAME>", "#your-mysql-secret-name#",""); } catch(SQLException e) { e.printStackTrace(); } } }
RAM シークレットプラグイン
詳細については、「RAM シークレットプラグイン」をご参照ください。
プロジェクトのランタイムコードに設定ファイル「
managed_credentials_providers.properties」を追加します。credentials_type=ecs_ram_role ## ECS RAM ロールの名前 credentials_role_name=#credentials_role_name# ## 関連するKMSインスタンスのリージョン cache_client_region_id=[{"regionId":"#regionId#"}]Alibaba Cloud SDK for Java クライアントを取得し、クラウドサービスを呼び出します。
次の例は、ECS の DescribeInstanceStatus API を呼び出す方法を示しています。
説明サンプルコードを実行する前に、pom.xml ファイルに
aliyun-java-sdk-ecs依存関係を追加してください。import com.aliyuncs.IAcsClient; import com.aliyuncs.ecs.model.v20140526.DescribeInstanceStatusRequest; import com.aliyuncs.ecs.model.v20140526.DescribeInstanceStatusResponse; import com.aliyun.kms.secretsmanager.plugin.sdkcore.ProxyAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; public class AliyunSdkProviderSample { public static void main(String[]args) { String secretName="******"; /* アプリケーションがクラスパスまたは実行可能JARファイルからデフォルトの設定ファイル (managed_credentials_providers.properties) を読み取れない場合、またはカスタム設定ファイル名を使用する必要がある場合は、次のコードを呼び出してカスタム設定ファイルを指定できます。ファイルは次の順序で読み取られます。 1. "your-config-name" が絶対パスの場合、そのパスからファイルが読み取られます。 2. "your-config-name" がファイル名のみの場合、クラスパスから最初に読み取られ、次に実行可能JARファイルから読み取られます。 */ //ConfigLoader.setConfigName("your-config-name"); // 1. aliyun-java-sdk-managed-credentials-providerを使用してIAcsClientを取得します。 IAcsClient client = null; try { client = new ProxyAcsClient("<the regionId of ECS>", secretName); } catch (ClientException e) { e.printStackTrace(); } // 2. ECS API を呼び出してビジネスロジックを実装します。 DescribeInstanceStatusRequest request = new DescribeInstanceStatusRequest(); DescribeInstanceStatusResponse response; try { response = client.getAcsResponse(request); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } // 3. クライアントをシャットダウンして、プラグインが使用するリソースを解放します。 client.shutdown(); } }
Alibaba Cloud SDK V1.0 (非推奨)
package com.aliyuncs.kms.examples;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.auth.AlibabaCloudCredentialsProvider;
import com.aliyuncs.auth.InstanceProfileCredentialsProvider;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.kms.model.v20160120.*;
import com.aliyuncs.profile.DefaultProfile;
public class RamRoleTest {
public static void main(final String[] args) throws Exception {
String regionId = "<region-id>";
DefaultProfile profile = DefaultProfile.getProfile(regionId);
// RAM ロールを設定します。このトピックではEcsRamRoleTestを例として使用します。
String roleName = "EcsRamRoleTest";
// インスタンス RAM ロールの認証情報プロバイダーを作成します。
AlibabaCloudCredentialsProvider provider = new InstanceProfileCredentialsProvider(roleName);
IAcsClient client = new DefaultAcsClient(profile, provider);
ListKeysRequest request = new ListKeysRequest();
try {
ListKeysResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
}関連ドキュメント
アクセス認証情報の管理 (Alibaba Cloud SDK V1.0)
アクセス認証情報の管理 (Alibaba Cloud SDK V2.0)
RAM ロールの詳細については、次をご参照ください。