All Products
Search
Document Center

Elastic Compute Service:Mengontrol akses ECS dengan peran RAM

Last Updated:Aug 26, 2026

Berikan akses sementara dan terbatas cakupannya ke sumber daya ECS lintas akun dengan mengasumsikan peran RAM.

Kasus Penggunaan

Misalkan perusahaan Anda menjalankan situs e-commerce di ECS. Departemen TI menangani operasi dan pemeliharaan (O&M) harian, tetapi terkadang mitra eksternal memerlukan akses untuk tugas pemeliharaan tertentu. Alih-alih membagikan kredensial jangka panjang seperti Akun Alibaba Cloud atau Pengguna RAM, Anda dapat menggunakan peran RAM untuk memberikan akses sementara dan terbatas cakupannya.

Diagram berikut menggambarkan akses lintas akun dengan peran RAM:

Akun A: Akun Alibaba Cloud perusahaan Anda.

Akun B: Akun Alibaba Cloud mitra eksternal Anda.

  1. Akun A membuat peran RAM dan memberi otorisasi kepada Akun B untuk mengasumsikannya.

  2. Akun B membuat Pengguna RAM dan memberikan izin kepadanya untuk mengasumsikan peran tersebut.

  3. Pengguna RAM milik Akun B mengasumsikan peran RAM milik Akun A untuk mengelola sumber daya Akun A.

Prosedur

Buat peran RAM dan berikan izin di Akun A

1. Buat peran RAM

Masuk ke Konsol RAM dengan Akun A. Buat peran RAM dengan entitas tepercaya diatur ke akun Alibaba Cloud. Untuk Principal Name, pilih Other Account dan masukkan UID Akun B. Lihat Buat peran RAM untuk akun Alibaba Cloud.

2. Berikan izin ke peran RAM

Buat kebijakan yang mengizinkan melihat informasi instans dan login ke instans ECS dengan Workbench, lalu sambungkan ke peran RAM. Lihat Buat kebijakan kustom.

Kebijakan akses sementara untuk asumsi peran oleh pengunjung

Kebijakan ini memberikan izin untuk melihat informasi instans ECS dan login ke instans dengan Workbench.

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:List*",
                "ecs:Describe*",
                "ecs-workbench:LoginInstance"
            ],
            "Resource": "*"
        }
    ]
}

Buat Pengguna RAM dan berikan izin di Akun B

1. Buat Pengguna RAM

Masuk ke Konsol RAM dengan Akun B. Buat Pengguna RAM dan pilih Console Access dan Using permanent AccessKey to access. Lihat Buat Pengguna RAM.

2. Berikan izin ke Pengguna RAM

Sambungkan kebijakan AliyunSTSAssumeRoleAccess ke Pengguna RAM di bawah Akun B. Kebijakan ini memungkinkan Pengguna RAM mengasumsikan semua peran RAM. Lihat Berikan izin ke Pengguna RAM.

Untuk membatasi pengguna hanya pada peran tertentu, lihat Dapatkah saya menentukan peran RAM yang dapat diasumsikan oleh Pengguna RAM?

Asumsikan peran RAM

Konsol

  1. Masuk ke halaman login Pengguna RAM dengan Pengguna RAM milik Akun B.

  2. Arahkan kursor ke gambar profil di pojok kanan atas dan klik Switch Identity.

  3. Pada halaman Switch Role, masukkan UID Akun A dan nama peran RAM, lalu klik OK.

  4. Verifikasi izin akses.

    Masuk ke Konsol ECS dan pastikan Anda dapat melihat informasi instans ECS.

    Verifikasi 1: Pengguna RAM dapat melihat informasi instans ECS dan login ke instans dengan Workbench.

    Verifikasi 2: Setelah Akun A mencabut otorisasi, Pengguna RAM tidak lagi dapat melihat informasi instans ECS milik Akun A.

API

Anda juga dapat mengakses sumber daya Akun A secara terprogram:

  1. Tetapkan variabel lingkungan sistem ke AccessKey yang diperoleh saat membuat Pengguna RAM Akun B. Metode ini berbeda-beda tergantung sistem operasi. Lihat Konfigurasikan variabel lingkungan di Linux, macOS, dan Windows.

  2. Panggil API AssumeRole dengan Pengguna RAM Akun B. Sertakan ARN peran RAM milik Akun A untuk mendapatkan token STS sementara.

  3. Gunakan token STS tersebut untuk memanggil API Layanan Alibaba Cloud guna mengakses sumber daya Akun A.

Kode contoh Java

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>ecs20140526</artifactId>
  <version>5.4.4</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>sts20150401</artifactId>
  <version>1.1.4</version>
</dependency>
<dependency>
   <groupId>com.aliyun</groupId>
   <artifactId>credentials-java</artifactId>
   <version>0.3.10</version>
</dependency>
import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.sts20150401.Client;
import com.aliyun.sts20150401.models.AssumeRoleRequest;
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.google.gson.Gson;

/**
 * Asumsikan peran RAM untuk mendapatkan kredensial akses temporary, lalu gunakan kredensial ini untuk mengakses sumber daya ECS.
 */
public class Sample {
    public static void main(String[] args) {
        // Ini hanya untuk tujuan demonstrasi. Pilih titik akhir spesifik wilayah berdasarkan kebutuhan bisnis aktual Anda.
        String stsEndpoint = "sts.cn-shanghai.aliyuncs.com";
        String ecsEndpoint = "ecs.cn-shanghai.aliyuncs.com";
        // Kueri informasi instans ECS di cn-shanghai.
        String regionId = "cn-shanghai";
        // ARN peran RAM yang akan diasumsikan.
        String ramRoleArn = "acs:ram::14************16:role/cooperativepartnerrole";

        // Gunakan Pengguna RAM Akun B untuk mengasumsikan peran RAM Akun A dan mendapatkan kredensial akses temporary.
        AssumeRoleResponse assumeRoleResponse = playRamRole(stsEndpoint, ramRoleArn);
        // Panggil API yang disediakan oleh Layanan Alibaba Cloud untuk melihat sumber daya cloud milik Akun A.
        accessResources(assumeRoleResponse, ecsEndpoint, regionId);
    }

    /**
     * Gunakan kredensial akses temporary untuk mengakses sumber daya cloud.
     *
     * @param assumeRoleResponse Objek respons yang berisi kredensial akses temporary.
     */
    private static void accessResources(AssumeRoleResponse assumeRoleResponse, String ecsEndpoint, String regionId) {
        try {
            // Ekstrak informasi kredensial akses temporary.
            AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials assumeRoleResponseBodyCredentials = assumeRoleResponse.body.credentials;
            com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config()
                    .setType("sts") // Jenis kredensial.
                    .setAccessKeyId(assumeRoleResponseBodyCredentials.accessKeyId)
                    .setAccessKeySecret(assumeRoleResponseBodyCredentials.accessKeySecret)
                    .setSecurityToken(assumeRoleResponseBodyCredentials.securityToken);
            com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);

            // Buat klien ECS.
            Config ecsConfig = new Config()
                    .setEndpoint(ecsEndpoint)
                    .setCredential(credentialClient);
            com.aliyun.ecs20140526.Client ecsClient = new com.aliyun.ecs20140526.Client(ecsConfig);
            DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
                    .setRegionId(regionId);
            RuntimeOptions runtimeOptions = new RuntimeOptions();

            // Panggil API DescribeInstances dan dapatkan respons.
            DescribeInstancesResponse response = ecsClient.describeInstancesWithOptions(describeInstancesRequest, runtimeOptions);
            // Cetak respons.
            System.out.println(new Gson().toJson(response.body));
        } catch (Exception e) {
            throw new RuntimeException("AccessResources gagal: " + e.getMessage());
        }
    }

    /**
     * Asumsikan peran RAM untuk mendapatkan kredensial akses temporary.
     *
     * @return Objek respons yang berisi kredensial akses temporary.
     */
    private static AssumeRoleResponse playRamRole(String stsEndpoint, String ramRoleArn) {
        try {
            // Buat objek StsClient dan panggil operasi assumeRole untuk mendapatkan token STS.
            Config config = new Config()
                    // System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") mendapatkan nilai ID AccessKey dari variabel lingkungan.
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") mendapatkan nilai Rahasia AccessKey dari variabel lingkungan.
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            config.endpoint = stsEndpoint;
            Client client = new Client(config);
            // Buat objek AssumeRoleRequest dan tentukan ARN peran RAM yang akan diasumsikan serta nama sesi peran.
            AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
                    .setRoleArn(ramRoleArn)
                    .setRoleSessionName("CooperativePartner");
            RuntimeOptions runtime = new RuntimeOptions();
            return client.assumeRoleWithOptions(assumeRoleRequest, runtime);
        } catch (Exception e) {
            throw new RuntimeException("play RAM role gagal: " + e.getMessage());
        }
    }
}

Hasil: Program mengembalikan daftar sumber daya ECS milik Akun A di wilayah China (Shanghai).

{
    "instances":{
        "instance":[
            {
                "creationTime":"2024-10-23T09:12Z",
                "expiredTime":"2099-12-31T15:59Z",
                "hostName":"iZ********************pZ",
                "imageId":"m-uf****************jf",
                "instanceChargeType":"PostPaid",
                "instanceId":"i-uf****************ap",
                "instanceName":"launch-advisor-20241023-c6",
                "instanceNetworkType":"vpc",
                "instanceType":"ecs.c6.xlarge",
                ...
                // Beberapa parameter dihilangkan.
                ...
                "vpcAttributes":{
                    "natIpAddress":"",
                    "privateIpAddress":{
                        "ipAddress":[
                            "17*.**.**.*15"
                        ]
                    },
                    "vSwitchId":"vsw-uf*****************tk",
                    "vpcId":"vpc-uf*****************kr"
                },
                "zoneId":"cn-shanghai-b"
            }
        ]
    },
    "nextToken":"",
    "pageNumber":1,
    "pageSize":10,
    "requestId":"C1468F7E********************7A3A712",
    "totalCount":1
}

Referensi