全部产品
Search
文档中心

Simple Log Service:Gunakan STS untuk mengaktifkan akses lintas akun ke sumber daya Simple Log Service

更新时间:Jul 06, 2025

Anda dapat menggunakan akun Alibaba Cloud (Alibaba Cloud Account A) untuk membuat Peran RAM, menentukan akun Alibaba Cloud lainnya (Alibaba Cloud Account B) untuk mengambil alih peran tersebut, dan memberikan izin tertentu pada sumber daya Simple Log Service milik Alibaba Cloud Account A kepada peran RAM tersebut. Selanjutnya, Anda dapat memberikan izin AssumeRole kepada pengguna RAM dari Alibaba Cloud Account B. Setelah itu, Anda dapat menggunakan Alibaba Cloud Account B atau pengguna RAM yang ditentukan untuk memanggil operasi API Layanan Token Keamanan (STS) guna mendapatkan kredensial keamanan sementara. Kredensial ini mencakup ID AccessKey, Rahasia AccessKey, dan token keamanan. Dengan cara ini, Anda dapat menggunakan pengguna RAM untuk memanggil operasi API Simple Log Service dan mengakses sumber daya Simple Log Service.

Ikhtisar solusi

Perusahaan A memiliki akun Alibaba Cloud bernama Alibaba Cloud Account A, dan Perusahaan B memiliki akun Alibaba Cloud bernama Alibaba Cloud Account B. Untuk mengisolasi data bisnis atau proyek yang dikerjakan pihak ketiga, pengguna dari Alibaba Cloud Account A ingin memberikan izin tertentu pada sumber daya Simple Log Service milik Alibaba Cloud Account A kepada Alibaba Cloud Account B. Izin berikut diberikan:

  • Alibaba Cloud Account B diberi otorisasi untuk menulis data ke Simple Log Service milik Alibaba Cloud Account A. Selain itu, Alibaba Cloud Account B diberi otorisasi untuk menggunakan grup konsumen guna mengonsumsi data dari Simple Log Service milik Alibaba Cloud Account A.

  • Pengguna RAM dari Alibaba Cloud Account B diberi otorisasi untuk menulis data ke Simple Log Service milik Alibaba Cloud Account A. Selain itu, pengguna RAM tersebut diberi otorisasi untuk menggunakan grup konsumen guna mengonsumsi data dari Simple Log Service milik Alibaba Cloud Account A.

  • Alibaba Cloud Account B diberi otorisasi untuk memanggil operasi API STS guna mendapatkan kredensial keamanan sementara dan menggunakan kredensial tersebut untuk memanggil operasi API Simple Log Service. Untuk informasi lebih lanjut, lihat Apa itu STS?

Untuk memenuhi persyaratan di atas, lakukan langkah-langkah berikut:

Langkah 1: Pengguna dari Alibaba Cloud Account A membuat Peran RAM untuk Alibaba Cloud Account B dan memberikan izin kepada Alibaba Cloud Account B

Langkah 2: Pengguna dari Alibaba Cloud Account B membuat pengguna-b RAM dan memberikan izin kepada pengguna RAM tersebut

Langkah 3: Pengguna-b RAM mendapatkan kredensial keamanan sementara dari STS untuk mengakses sumber daya Simple Log Service

Langkah 1: Pengguna dari Alibaba Cloud Account A membuat Peran RAM untuk Alibaba Cloud Account B dan memberikan izin kepada Alibaba Cloud Account B

Pengguna dari Alibaba Cloud Account A membuat Peran RAM, menentukan Alibaba Cloud Account B untuk mengambil alih peran tersebut, dan memberikan izin tertentu pada sumber daya Simple Log Service milik Alibaba Cloud Account A kepada peran RAM tersebut.

Anda dapat membuat Peran RAM di Konsol RAM. Untuk informasi lebih lanjut, lihat Buat pengguna RAM dan otorisasi pengguna RAM untuk mengakses Simple Log Service. Anda juga dapat memanggil operasi API CreateRole dari RAM untuk membuat Peran RAM. Untuk informasi lebih lanjut, lihat CreateRole. Contoh berikut menjelaskan cara membuat Peran RAM di konsol.

  1. Masuk ke Konsol Resource Access Management (RAM) menggunakan akun Alibaba Cloud Anda.

  2. Buat Peran RAM dan tentukan Alibaba Cloud Account B untuk mengambil alih peran tersebut. Untuk informasi lebih lanjut, lihat Buat Peran RAM untuk akun Alibaba Cloud tepercaya.

  3. Buat kebijakan kustom. Pada tab JSON halaman Buat Kebijakan, ganti skrip yang ada di editor kode dengan dokumen kebijakan berikut. Untuk informasi lebih lanjut, lihat Buat kebijakan kustom pada tab JSON.

    Berikan izin menulis pada Simple Log Service

    {
      "Version": "1",
      "Statement": [
        {
          "Action": "log:PostLogStoreLogs",
          "Resource": "*",
          "Effect": "Allow"
        }
      ]
    }

    Berikan izin untuk menggunakan grup konsumen guna menarik data dari Simple Log Service

    {
      "Version": "1",
      "Statement": [
        {
          "Action": [
             "log:GetCursorOrData",
             "log:CreateConsumerGroup",
             "log:ListConsumerGroup",
             "log:ConsumerGroupUpdateCheckPoint",
             "log:ConsumerGroupHeartBeat",
             "log:GetConsumerGroupCheckPoint",
             "log:UpdateConsumerGroup"
          ],
          "Resource": "*",
          "Effect": "Allow"
        }
      ]
    }
    Penting

    Kebijakan di atas memberikan izin pada semua proyek dan penyimpanan log milik Alibaba Cloud Account A. Jika Anda ingin memberikan izin pada proyek dan penyimpanan log tertentu, sertakan kode berikut dalam elemen Resource kebijakan:

    • Untuk memberikan izin pada proyek, gunakan acs:log::{projectOwnerAliUid}:project/.

    • Untuk memberikan izin pada penyimpanan log, gunakan acs:log::{projectOwnerAliUid}:project/{projectName}/logstore/{logstoreName}/.

    Untuk informasi lebih lanjut, lihat Daftar Sumber Daya.

  4. Lampirkan kebijakan kustom yang telah dibuat ke Peran RAM. Untuk informasi lebih lanjut, lihat Berikan Izin kepada Peran RAM.

Langkah 2: Pengguna dari Alibaba Cloud Account B membuat pengguna-b RAM dan memberikan izin kepada pengguna RAM tersebut

Pengguna dari Alibaba Cloud Account B membuat pengguna RAM bernama user-b dan melampirkan kebijakan sistem AliyunSTSAssumeRoleAccess ke pengguna RAM tersebut. Kebijakan AliyunSTSAssumeRoleAccess memberikan pengguna RAM izin untuk memanggil operasi API AssumeRole dari STS.

  1. Gunakan Alibaba Cloud Account B untuk masuk ke Konsol RAM.

  2. Buat pengguna RAM bernama user-b dan pilih Console Access dan Using permanent AccessKey to access di bagian Access Mode. Untuk informasi lebih lanjut, lihat Buat Pengguna RAM.

    Penting
    • Rahasia AccessKey untuk pengguna RAM hanya ditampilkan saat Anda membuat pasangan AccessKey. Anda tidak dapat menanyakan rahasia AccessKey dalam operasi selanjutnya. Oleh karena itu, Anda harus mencadangkan rahasia AccessKey Anda.

    • Pasangan AccessKey adalah kredensial permanen untuk akses aplikasi. Jika pasangan AccessKey dari akun Alibaba Cloud bocor, sumber daya yang dimiliki oleh akun tersebut terpapar pada risiko potensial. Untuk mencegah risiko kebocoran kredensial, kami sarankan Anda menggunakan token Layanan Token Keamanan (STS). Untuk informasi lebih lanjut, lihat Praktik Terbaik untuk Menggunakan Kredensial Akses guna Memanggil Operasi API.

  3. Lampirkan kebijakan AliyunSTSAssumeRoleAccess ke pengguna RAM. Dengan cara ini, pengguna RAM dapat mengambil alih Peran RAM untuk mendapatkan token Layanan Token Keamanan (STS). Untuk informasi lebih lanjut, lihat Berikan Izin kepada Pengguna RAM.

Langkah 3: Pengguna RAM user-b mendapatkan token STS untuk mengakses sumber daya Simple Log Service

  1. Panggil operasi API AssumeRole untuk mendapatkan pasangan AccessKey sementara dan token keamanan. Untuk informasi lebih lanjut, lihat AssumeRole.

    Anda dapat memanggil operasi ini dengan menggunakan metode berikut:

    Panggil operasi menggunakan SDK STS. Untuk informasi lebih lanjut, lihat Ikhtisar SDK STS.

  2. Panggil operasi API Simple Log Service. Untuk informasi lebih lanjut, lihat Ikhtisar SDK Simple Log Service.

Contoh kode

Berdasarkan SDK Simple Log Service untuk Java, kode berikut memberikan contoh bagaimana pengguna RAM user-b dari Alibaba Cloud Account B menulis data ke proyek dalam Alibaba Cloud Account A menggunakan token STS. Contoh kode:

package com.aliyun.openservices.log.sample;

import java.util.Date;
import java.util.Vector;

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.PutLogsRequest;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;

public class StsSample {
	  // Sekarang sts hanya mendukung "cn-hangzhou"
	  public static final String REGION_CN_HANGZHOU = "cn-hangzhou";
	  // Versi api sts saat ini
	  public static final String STS_API_VERSION = "2015-04-01";
	  static AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret,
	                                       String roleArn, String roleSessionName, String policy,
	                                       ProtocolType protocolType) throws ClientException {
	    try {
	      // Konstruksi Alibaba Cloud Acs Client untuk memanggil OpenAPI
	      IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, accessKeyId, accessKeySecret);
	      DefaultAcsClient client = new DefaultAcsClient(profile);
	      // Buat objek AssumeRoleRequest
	      final AssumeRoleRequest request = new AssumeRoleRequest();
	      request.setVersion(STS_API_VERSION);
	      request.setMethod(MethodType.POST);
	      request.setProtocol(protocolType);
	      request.setRoleArn(roleArn);
	      request.setRoleSessionName(roleSessionName);
	      request.setPolicy(policy);
	      // kirim permintaan
	      final AssumeRoleResponse response = client.getAcsResponse(request);
	      return response;
	    } catch (ClientException e) {
	      throw e;
	    }
	  }
	  public static void main(String[] args) {
	    // Hanya pengguna RAM(akun sub)yang bisa memanggil antarmuka AssumeRole
	    // AccessKeys akun root Alibaba Cloud tidak bisa memanggil AssumeRole
	    // silakan buat akun sub di Konsol Web RAM (https://ram.console.alibabacloud.com), dan buat AK untuk akun sub ini
	    String accessKeyId = "<subaccountaccesskey>";
	    String accessKeySecret = "<subaccountaccesssecret>";
	    // Parameter API AssumeRole: RoleArn, RoleSessionName, Policy, dan DurationSeconds
	    // RoleArn dapat diambil di Konsol Web RAM
	    // https://ram.console.alibabacloud.com/#/role/detail/< specifid rolename>/info
	    String roleArn = "<rolearn found in web console>";
	    // RoleSessionName adalah Token sementara(terutama digunakan untuk audit)
	    String roleSessionName = "bluemix-001";
	    String policy = "{\n" +
	            "    \"Version\": \"1\", \n" +
	            "    \"Statement\": [\n" +
	            "        {\n" +
	            "            \"Action\": \"log:PostLogStoreLogs\",\n" +
	            "            \"Resource\": \"*\",\n" +
	            "            \"Effect\": \"Allow\"\n" +
	            "        }\n" +
	            "    ]\n" +
	            "}";
	    System.out.println(policy);
	    // Hanya HTTPS yang didukung di sini
	    ProtocolType protocolType = ProtocolType.HTTPS;
	    AssumeRoleResponse response = new AssumeRoleResponse();
	    try {
	      response = assumeRole(accessKeyId, accessKeySecret,
	              roleArn, roleSessionName, policy, protocolType);
	      System.out.println("Expiration: " + response.getCredentials().getExpiration());
	      System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
	      System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
	      System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
	    } catch (ClientException e) {
	      System.out.println("Gagal mendapatkan token.");
	      System.out.println("Kode kesalahan: " + e.getErrCode());
	      System.out.println("Pesan kesalahan: " + e.getErrMsg());
	    }
	    
	    // Parameter Simple Log Service
	    // Dokumen titik akhir Simple Log Service: https://www.alibabacloud.com/help/en/sls/developer-reference/api-sls-2020-12-30-endpoint
	    String logServiceEndpoint = "cn-hangzhou.log.aliyuncs.com";
	    // berarti wilayah proyek harus cn-hangzhou
	    String project = "<log service project name>";
	    String logstore = "<log service logstore name>";
	    
	    // Konstruksi objek klien Simple Log Service
	    Client client = new Client(logServiceEndpoint, 
	    		response.getCredentials().getAccessKeyId(), 
	    		response.getCredentials().getAccessKeySecret());
	    // Perhatian: AK & Security Token akan kedaluwarsa dalam 1 jam
	    // jadi Anda harus memanggil antarmuka asumeRole saat kedaluwarsa
	    client.SetSecurityToken(response.getCredentials().getSecurityToken());
	    Vector<LogItem> logGroup = new Vector<LogItem>();
	    LogItem logItem = new LogItem((int) (new Date().getTime() / 1000));
	    logItem.PushBack("StsSample", "Send Data");
	    logGroup.add(logItem);
	    
	    PutLogsRequest req2 = new PutLogsRequest(project, logstore, "", "", logGroup);
	    try {
	    	client.PutLogs(req2);
	    } catch (LogException e) {
			System.out.println("Gagal mengirim data.");
			System.out.println("Kode kesalahan: " + e.GetErrorCode());
			System.out.println("Pesan kesalahan: " + e.GetErrorMessage());
	    }
	  }
}