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

Key Management Service:インスタンス RAM ロールを使用した KMS へのアクセス

最終更新日:Aug 26, 2026

インスタンス 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 コンソール

  1. RAM ロールを作成し、信頼されたエンティティを Alibaba Cloud サービスに設定します。

    1. RAM コンソールにログインします。

    2. 左側のナビゲーションペインで、アイデンティティ > ロールを選択します。

    3. ロール ページで ロールの作成 をクリックし、画面の指示に従います。 次のパラメーターを設定し、他のパラメーターは必要に応じて設定します。

      • ロール名:このトピックでは EcsRamRoleTest を例として使用します。

      • 信頼されたエンティティタイプ:[Alibaba Cloudサービス] を選択します。

      • 信頼されたサービス:[ECS] を選択します。

  2. RAM ロールに KMS へのアクセス権限を付与します。

    デフォルトでは、新しい RAM ロールには権限がありません。ロールに権限を付与する必要があります。

    1. アイデンティティ > ロール ページで、対象の RAM ロールの [アクション] 列の [ポリシーのアタッチ] をクリックします。

    2. [ポリシーのアタッチ] パネルで、[システムポリシー] を選択し、 AliyunKMSFullAccess を検索して選択し、[OK] をクリックします。

RAM API

  1. RAM ロールを作成し、信頼されたエンティティを Alibaba Cloud サービスに設定します。

    RAM の CreateRole API を次のパラメーターで呼び出します。

    • RoleName:RAM ロールの名前を入力します。このトピックでは EcsRamRoleTest を例として使用します。

    • AssumeRolePolicyDocument:次のポリシードキュメントを使用して、ECS がこのロールを引き受けることを許可します。

      {
          "Statement": [
              {
                  "Action": "sts:AssumeRole", 
                  "Effect": "Allow", 
                  "Principal": {
                      "Service": [
                          "ecs.aliyuncs.com"
                      ]
                  }
              }
          ], 
          "Version": "1"
      }
  2. RAM ロールに KMS へのアクセス権限を付与します。

    RAM の AttachPolicyToRole API を呼び出して、AliyunKMSFullAccess システムポリシーを EcsRamRoleTest インスタンス RAM ロールにアタッチします。次のパラメーターを設定します。

    • PolicyType:システムポリシーを示すため、System に設定します。

    • PolicyName:AliyunKMSFullAccess に設定します。

    • RoleName:RAM ロールの名前 (EcsRamRoleTest など) を設定します。

ステップ2:RAM ロールの ECS インスタンスへのアタッチ

ECS コンソール

説明

ECS インスタンスを購入していない場合は、まず購入してください。詳細については、「カスタム起動タブでのインスタンス作成」をご参照ください。

  1. ECS コンソールにログインします。

  2. 左側のナビゲーションペインで、インスタンス & イメージ> [インスタンス]を選択します。

  3. 上部メニューで、ECS インスタンスが存在するリージョンとリソースグループを選択します。

  4. 対象の ECS インスタンスを探し、[操作] 列で アイコン>インスタンスの設定>RAM ロールのアタッチ/デタッチ を選択します。

  5. 表示されたダイアログボックスで、作成した RAM ロールを選択し、[OK] をクリックします。

ECS API

  • 既存の ECS インスタンスにインスタンス RAM ロールをアタッチする

    ECS の AttachInstanceRamRole API を呼び出して、VPC 内の既存の ECS インスタンスにインスタンス RAM ロールをアタッチします。次のパラメーターを設定します。

    • RegionId:インスタンスが存在するリージョンの ID。

    • RamRoleName:RAM ロールの名前 (EcsRamRoleTest など)。

    • InstanceIds:ECS インスタンスの ID (例: ["i-bXXXXXXXX"])。

  • ECS インスタンスの作成時にインスタンス RAM ロールを指定する

    1. インスタンスを作成します。

      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 ロール」をご参照ください。

    2. 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 クライアント」をご参照ください。

  1. secretsmanager.properties ファイル、またはシステム環境変数に、次のパラメーターを設定します。

    パラメーター

    値

    credentials_type

    ecs_ram_role に設定します。

    credentials_role_session_name

    ロールセッションのカスタム名。監査に使用されます。

    cache_client_region_id

    [{"regionId":"<your region id>"}] の形式で指定します。<your region id> は実際のリージョン ID に置き換えてください。

  2. クライアントをビルドしてシークレット値を取得します。

    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 クライアント」をご参照ください。

  1. プロジェクトのアプリケーションコードに、「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=21600000
  2. 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 {
            // 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 シークレットプラグイン」をご参照ください。

  1. プロジェクトのランタイムコードに設定ファイル「managed_credentials_providers.properties」を追加します。

    credentials_type=ecs_ram_role
    ## ECS RAM ロールの名前
    credentials_role_name=#credentials_role_name#
    ## 関連するKMSインスタンスのリージョン
    cache_client_region_id=[{"regionId":"#regionId#"}]
  2. 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());
        }

    }
}

関連ドキュメント