All Products
Search
Document Center

Key Management Service:Akses KMS dari Instance ECS dengan Cara yang Aman

Last Updated:Dec 12, 2025

Anda dapat membuat Peran RAM untuk instance Elastic Compute Service (ECS) dalam virtual private cloud (VPC). Kemudian, aplikasi pada instance ECS dapat mengakses Key Management Service (KMS) menggunakan SDK atau kredensial akses sementara yang disediakan oleh Security Token Service (STS).

Langkah 1: Buat peran RAM instance dan berikan izin yang diperlukan kepada peran tersebut

  1. Buat Peran RAM Instance.

    Panggil operasi CreateRole dari RAM untuk membuat peran RAM EcsRamRoleTest menggunakan OpenAPI Explorer. Tentukan parameter permintaan berikut untuk operasi ini:

    • RoleName: Nama peran RAM instance. Dalam contoh ini, masukkan EcsRamRoleTest.

    • AssumeRolePolicyDocument: Isi kebijakan yang menentukan instance ECS untuk mengasumsikan peran RAM. Dalam contoh ini, masukkan konten berikut:

      {
          "Statement": [
              {
                  "Action": "sts:AssumeRole", 
                  "Effect": "Allow", 
                  "Principal": {
                      "Service": [
                          "ecs.aliyuncs.com"
                      ]
                  }
              }
          ], 
          "Version": "1"
      }
  2. Berikan Peran RAM Instance Izin untuk Mengakses KMS.

    Panggil operasi AttachPolicyToRole dari RAM untuk melampirkan kebijakan sistem AliyunKMSFullAccess ke peran RAM EcsRamRoleTest menggunakan OpenAPI Explorer. Tentukan parameter permintaan berikut untuk operasi ini:

    • PolicyType: Tipe kebijakan. Atur parameter ini ke System, yang menunjukkan kebijakan sistem.

    • PolicyName: Nama kebijakan sistem. Dalam contoh ini, masukkan AliyunKMSFullAccess, yang menunjukkan kebijakan sistem untuk KMS.

    • RoleName: Nama peran RAM instance. Dalam contoh ini, masukkan EcsRamRoleTest.

Langkah 2: Tetapkan peran RAM instance ke instance ECS

Anda dapat menggunakan salah satu metode berikut untuk menetapkan peran RAM instance ke instance ECS:

  • Tetapkan peran RAM instance ke instance ECS yang sudah ada.

    Panggil operasi AttachInstanceRamRole dari ECS untuk menetapkan peran RAM instance ke instance ECS yang sudah ada di VPC menggunakan OpenAPI Explorer. Tentukan parameter permintaan berikut untuk operasi ini:

    • RegionId: ID wilayah tempat instance ECS berada.

    • RamRoleName: Nama peran RAM instance. Dalam contoh ini, masukkan EcsRamRoleTest.

    • InstanceIds: ID instance ECS di VPC. Atur parameter ini ke nilai dalam format ["i-bXXXXXXXX"].

  • Tentukan peran RAM instance saat Anda membuat instance ECS.

    1. Buat instance.

      Panggil operasi CreateInstance dari ECS untuk membuat instance ECS menggunakan OpenAPI Explorer. Tentukan parameter permintaan berikut untuk operasi ini:

      • RegionId: ID wilayah tempat Anda ingin membuat instance ECS. Dalam contoh ini, masukkan cn-hangzhou.

      • ImageId: ID gambar yang digunakan untuk membuat instance ECS. Dalam contoh ini, masukkan centos_7_03_64_40G_alibase_20170503.vhd.

      • InstanceType: Tipe instance ECS. Dalam contoh ini, masukkan ecs.g6.large.

      • VSwitchId: ID vSwitch di VPC tempat Anda ingin membuat instance ECS.

        Catatan

        Anda hanya dapat menetapkan peran RAM instance ke instance ECS di VPC. Oleh karena itu, parameter ini wajib.

      • RamRoleName: Nama peran RAM instance. Dalam contoh ini, masukkan EcsRamRoleTest.

      Anda juga dapat memberi otorisasi pengguna RAM untuk mengasumsikan peran RAM. Untuk informasi lebih lanjut, lihat Menggunakan instans RAM role dengan menggunakan operasi API.

    2. Atur kata sandi dan mulai instance ECS.

    3. Izinkan instance ECS mengakses Internet di konsol ECS atau dengan memanggil operasi API.

Langkah 3: (Opsional) Dapatkan kredensial akses sementara

Anda dapat memperoleh kredensial akses sementara untuk peran RAM. Kredensial ini berisi token dan diperbarui secara berkala. Kredensial ini memungkinkan Anda menggunakan izin dan sumber daya yang diberikan kepada peran RAM. Untuk mendapatkan kredensial akses sementara, lakukan langkah-langkah berikut:

  1. Kueri Kredensial Akses Sementara dari Peran RAM EcsRamRoleTest.

    • Instance ECS Linux: Jalankan perintah curl http://100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTest.

    • Instance ECS Windows: Untuk informasi lebih lanjut, lihat Ringkasan metadata instans ECS.

  2. Dapatkan Kredensial Akses Sementara.

    Contoh kredensial akses sementara:

    {
       "AccessKeyId" : "STS.J8XXXXXXXXXX4",
       "AccessKeySecret" : "9PjfXXXXXXXXXBf2XAW",
       "Expiration" : "2017-06-09T09:17:19Z",
       "SecurityToken" : "CAIXXXXXXXXXXXwmBkleCTkyI+",
       "LastUpdated" : "2017-06-09T03:17:18Z",
       "Code" : "Success"
    }

Langkah 4: Akses KMS menggunakan SDK

Anda dapat menggunakan SDK untuk mengakses KMS dengan salah satu metode berikut:

KMS SDK

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);

        // Tentukan peran RAM.
        String roleName = "<your-ecs-ram-role-name>"; // Masukkan EcsRamRoleTest.

        // Konfigurasikan penyedia kredensial peran RAM instance.
        AlibabaCloudCredentialsProvider provider = new InstanceProfileCredentialsProvider(roleName);

        IAcsClient client = new DefaultAcsClient(profile, provider);

        EncryptRequest request = new EncryptRequest();

        // Tentukan alias CMK atau ID CMK yang digunakan untuk mengenkripsi "Hello world".
        request.setKeyId("alias/Apollo/SalaryEncryptionKey");
        request.setPlaintext("Hello world");

        try {
            EncryptResponse 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());
        }
    }
}

Encryption SDK

package com.aliyun.encryptionsdk.examples.credentials;
 
 import com.aliyun.encryptionsdk.AliyunConfig;
 import com.aliyun.encryptionsdk.AliyunCrypto;
 import com.aliyun.encryptionsdk.exception.InvalidAlgorithmException;
 import com.aliyun.encryptionsdk.exception.UnFoundDataKeyException;
 import com.aliyun.encryptionsdk.model.CryptoResult;
 import com.aliyun.encryptionsdk.provider.dataKey.DefaultDataKeyProvider;
 
 import java.util.Collections;
 
 import static org.junit.Assert.assertArrayEquals;
 
 /**
  *
  * Autentikasi instance ECS berdasarkan peran RAM instance.
  */
 public class EcsRamRoleSample {
     private static final String PLAIN_TEXT = "this is test.";
     private static final String cmkArn = "acs:kms:RegionId:UserId:key/CmkId";
     private static final String ecRamRoleName = "EcsRamRoleTest";
     public static void main(String[] args) {
         AliyunConfig config = new AliyunConfig();
         // Tentukan peran RAM.
         config.withEcsRamRole(ecRamRoleName);
         
         AliyunCrypto crypto = new AliyunCrypto(config);
         
         DefaultDataKeyProvider defaultDataKeyProvider = new DefaultDataKeyProvider(cmkArn);
         try {
             CryptoResult<byte[]> encryptResult = crypto.encrypt(defaultDataKeyProvider, PLAIN_TEXT.getBytes(), Collections.singletonMap("sample", "Context"));
             CryptoResult<byte[]> decryptResult = crypto.decrypt(defaultDataKeyProvider, encryptResult.getResult());
             assertArrayEquals(decryptResult.getResult(), PLAIN_TEXT.getBytes());
         } catch (InvalidAlgorithmException | UnFoundDataKeyException e) {
             System.out.println("Gagal.");
             System.out.println("Pesan kesalahan: " + e.getMessage());
         }
     }
 }

Secrets Manager Client

package com.aliyuncs.kms.secretsmanager.examples;
 
 import com.alibaba.fastjson.JSONObject;
 import com.aliyuncs.auth.InstanceProfileCredentialsProvider;
 import com.aliyuncs.kms.secretsmanager.cacheclient.exception.CacheSecretException;
 import com.aliyuncs.kms.secretsmanager.cacheclient.model.SecretInfo;
 import com.aliyuncs.kms.secretsmanager.cacheclient.service.DefaultSecretManagerClientBuilder;
 
 public class EcsSamples {
 
     public static void main(String[] args) throws CacheSecretException {
         String secretName = "<secret-name>";
         String roleName = "<your-ecs-ram-role-name>";
         String regionId = "<region-id>";
         SecretCacheClient client = SecretCacheClientBuilder.newCacheClientBuilder(
                 DefaultSecretManagerClientBuilder.standard().withCredentialsProvider(new InstanceProfileCredentialsProvider(roleName)).withRegion(regionId)
                         .build()
         ).build();
         SecretInfo secretInfo = client.getSecretInfo(secretName);
         System.out.println("secretInfo:"+JSONObject.toJSONString(secretInfo));
     }
 }