インスタンス RAM ロールは、Elastic Compute Service (ECS) インスタンスが特定の権限を引き受けるためにアシュームできる RAM ロールの一種です。セルフマネージド アプリケーションが ECS サーバーにデプロイされている場合は、ECS インスタンスにインスタンス RAM ロールを割り当てて、Key Management Service (KMS) にアクセスできます。このトピックでは、KMS にアクセスするために ECS インスタンスにインスタンス RAM ロールを割り当てる方法について説明します。
ECS インスタンスのインスタンス RAM ロールをサポートする SDK
Alibaba Cloud SDK: 管理操作を実行するために使用されます。
Secret SDK: 次の種類の Secret SDK を使用できます。Secrets Manager Client、Secret JDBC クライアント、および RAM Secret プラグイン。これらは、シークレット値を取得するために使用されます。JDBC は Java Database Connectivity の略です。
使用上の注意
ECS インスタンスは仮想プライベートクラウド (VPC) にデプロイされています。
1 つの ECS インスタンスに割り当てることができるインスタンス RAM ロールは 1 つだけです。
アカウントが RAM ユーザーである場合は、対応する Alibaba Cloud アカウントの所有者に連絡して、RAM ロールを構成するための権限を取得してください。詳細については、「インスタンス RAM ロール」をご参照ください。
手順 1: インスタンス RAM ロールを作成し、必要な権限をロールに付与する
RAM コンソールを使用する
信頼できるエンティティが Alibaba Cloud サービスであるインスタンス RAM ロールを作成します。
RAM コンソール にログインします。
左側のナビゲーションウィンドウで、
を選択します。[ロール] ページで、[ロールの作成] をクリックします。
[ロールの作成] ページで、[プリンシパルタイプ] を [クラウドサービス] に設定し、[プリンシパル名] に [elastic Compute Service/ecs] を選択して、[OK] をクリックします。
ロール名を設定します。この例では EcsRamRoleTest を使用します。
インスタンス RAM ロールに KMS にアクセスするための権限を付与します。
インスタンス RAM ロールが作成された後、ロールには権限がありません。ロールに権限を付与する必要があります。
[ロール] ページで、目的のインスタンス RAM ロールを見つけ、[アクション] 列の [権限の付与] をクリックします。
[権限の付与] パネルの [システムポリシー] タブで、KMS のシステムポリシー AliyunKMSFullAccess を見つけて選択し、[OK] をクリックします。
RAM API 操作を呼び出す
信頼できるエンティティが Alibaba Cloud サービスであるインスタンス RAM ロールを作成します。
RAM の CreateRole 操作を呼び出します。次のリクエストパラメーターを設定します。
RoleName
: インスタンス RAM ロールの名前。この例では、EcsRamRoleTest と入力します。AssumeRolePolicyDocument
: ECS インスタンスがインスタンス RAM ロールをアシュームすることを許可するポリシーの内容。この例では、次の内容を入力します。{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
インスタンス RAM ロールに KMS にアクセスするための権限を付与します。
AttachPolicyToRole 操作を呼び出して、システムポリシー AliyunKMSFullAccess をインスタンス RAM ロール EcsRamRoleTest にアタッチします。操作に次のリクエストパラメーターを指定します。
PolicyType
: ポリシーのタイプ。このパラメーターを System に設定します。これはシステムポリシーを示します。PolicyName
: システムポリシーの名前。この例では、AliyunKMSFullAccess と入力します。これは KMS のシステムポリシーを示します。RoleName
: インスタンス RAM ロールの名前。この例では、EcsRamRoleTest と入力します。
手順 2: インスタンス RAM ロールを ECS インスタンスにアタッチする
ECS コンソールを使用する
ECS インスタンスがない場合は、最初に ECS インスタンスを購入してください。インスタンスの作成方法については、「カスタム起動タブでインスタンスを作成する」をご参照ください。
ECS コンソール にログインします。
左側のナビゲーションウィンドウで、
を選択します。上部のナビゲーションバーで、リソースが属するリージョンとリソースグループを選択します。
目的の ECS インスタンスを見つけ、[アクション] 列で
を選択します。表示されるダイアログボックスで、[RAM ロール] ドロップダウンリストから作成したインスタンス RAM ロールを選択し、[確認] をクリックします。
ECS API 操作を呼び出す
インスタンス RAM ロールを既存の ECS インスタンスにアタッチします。
ECS の AttachInstanceRamRole 操作を呼び出して、インスタンス RAM ロールを VPC 内にある既存の ECS インスタンスにアタッチします。操作に次のリクエストパラメーターを指定します。
RegionId
: ECS インスタンスが存在するリージョンの ID。RamRoleName
: インスタンス RAM ロールの名前。この例では、EcsRamRoleTest と入力します。InstanceIds
: VPC 内にある ECS インスタンスの ID。このパラメーターを ["i-bXXXXXXXX"] 形式の値に設定します。
ECS インスタンスを作成するときにインスタンス RAM ロールを指定します。
ECS インスタンスを作成します。
ECS の CreateInstance 操作を呼び出して、ECS インスタンスを作成します。操作に次のリクエストパラメーターを指定します。
RegionId
: ECS インスタンスを作成するリージョンの ID。ImageId
: ECS インスタンスの作成に使用されるイメージの ID。この例では、centos_7_03_64_40G_alibase_****.vhd と入力します。InstanceType
: ECS インスタンスのタイプ。この例では、ecs.g6.large と入力します。VSwitchId
: ECS インスタンスを作成する VPC 内の vSwitch の ID。説明インスタンス RAM ロールは、VPC 内にある ECS インスタンスにのみアタッチできます。したがって、このパラメーターは必須です。
RamRoleName
: インスタンス RAM ロールの名前。この例では、EcsRamRoleTest と入力します。
RAM ユーザーにインスタンス RAM ロールをアシュームする権限を付与することもできます。詳細については、「インスタンス RAM ロール」をご参照ください。
ECS の ModifyInstanceVncPasswd 操作と StartInstance 操作を呼び出して、パスワードを設定し、インスタンスを起動します。
手順 3: ECS インスタンスのインスタンス RAM ロールを使用して KMS にアクセスする
次の例は、Java で KMS の ListKeys 操作を呼び出して、現在のリージョン内のすべてのキーをクエリする方法を示しています。SDK の使用方法の詳細については、「SDK リファレンス」をご参照ください。
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>"; // リージョン 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 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";
// オプション。ECS インスタンスのインスタンス 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 Client
詳細については、「Secret クライアント」をご参照ください。
システム環境変数または構成ファイル secretsmanager.properties で次のパラメーターを構成します。
パラメーター
値
credentials_type
値を ecs_ram_role に設定します。
credentials_role_session_name
RAM ロールの名前。
cache_client_region_id
[{"regionId":"<your region id>"}].format のリージョン ID。
<your region id>
を実際のリージョン ID に置き換えます。Secrets Manager Client を構築して、シークレット値を取得します。
import com.aliyuncs.kms.secretsmanager.client.SecretCacheClient; import com.aliyuncs.kms.secretsmanager.client.SecretCacheClientBuilder; import com.aliyuncs.kms.secretsmanager.client.exception.CacheSecretException; import com.aliyuncs.kms.secretsmanager.client.model.SecretInfo; public class CacheClientEnvironmentSample { public static void main(String[] args) { try { // Secrets Manager Client を構築します。 SecretCacheClient client = SecretCacheClientBuilder.newClient(); // Secrets Manager Client を使用してシークレット情報を取得します。 SecretInfo secretInfo = client.getSecretInfo("#secretName#"); System.out.println(secretInfo); } catch (CacheSecretException e) { e.printStackTrace(); } } }
Secret JDBC クライアント
次の例では、JDBC を使用して MySQL データベースに接続する方法について説明します。詳細については、「Secret JDBC クライアント」をご参照ください。
構成ファイル secretsmanager.properties をプロジェクトのコードに追加します。
## アクセスクレデンシャルのタイプ。 credentials_type=ecs_ram_role ## ECS インスタンスにアタッチされているインスタンス RAM ロールの名前。 credentials_role_name=#credentials_role_name# ## KMS インスタンスのリージョン。 cache_client_region_id=[{"regionId":"#regionId#"}] ## カスタムローテーション間隔。デフォルト値: 21600000。最小値: 300000。単位: ミリ秒。デフォルト値は 6 時間に相当し、最小値は 5 分に相当します。 refresh_secret_ttl=21600000
JDBC を使用して MySQL データベースに接続します。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCSample { public static void main(String[] args) throws Exception { // Secret JDBC クライアント (SDK 名: 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 Secret プラグイン
詳細については、「RAM Secret プラグイン」をご参照ください。
構成ファイル 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 操作を呼び出す方法の例を示しています。
次のサンプルコードを実行するときは、ECS の aliyun-java-sdk-ecs 依存関係を pom.xml ファイルに追加します。
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. クライアントを作成します (SDK 名: aliyun-java-sdk-managed-credentials-provider)。 IAcsClient client = null; try { client = new ProxyAcsClient("<ECS の regionId>", secretName); // ECS のリージョン ID } 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)
アクセスクレデンシャルを管理する (Alibaba Cloud SDK V2.0)
RAM ロールの詳細については、次のセクションをご参照ください。