Todos os produtos
Search
Central de documentação

Simple Log Service:Usar o STS para ativar o acesso entre contas aos recursos do Simple Log Service

Última atualização: Jul 03, 2026

Use uma conta Alibaba Cloud (Conta Alibaba Cloud A) para criar uma função do Resource Access Management (RAM). Especifique outra conta Alibaba Cloud (Conta Alibaba Cloud B) para assumir essa função e conceda a ela permissões específicas sobre os recursos do Simple Log Service da Conta Alibaba Cloud A. Em seguida, atribua a permissão AssumeRole a um usuário RAM da Conta Alibaba Cloud B. Assim, a Conta Alibaba Cloud B ou o usuário RAM especificado pode chamar uma operação de API do Security Token Service (STS) para obter credenciais de segurança temporárias, que incluem o AccessKey ID, o AccessKey secret e o token de segurança. Dessa forma, o usuário RAM chama operações de API do Simple Log Service e acessa seus recursos.

Visão geral da solução

A Empresa A possui uma conta chamada Conta Alibaba Cloud A, e a Empresa B possui a Conta Alibaba Cloud B. Para isolar dados comerciais ou projetos terceirizados, o usuário da Conta Alibaba Cloud A deseja conceder à Conta Alibaba Cloud B permissões específicas sobre os recursos do Simple Log Service pertencentes à Conta Alibaba Cloud A. As seguintes permissões são concedidas:

  • A Conta Alibaba Cloud B recebe autorização para gravar dados no Simple Log Service da Conta Alibaba Cloud A e usar grupos de consumidores para consumir esses dados.

  • Um usuário RAM da Conta Alibaba Cloud B recebe permissão para gravar dados no Simple Log Service da Conta Alibaba Cloud A e usar grupos de consumidores para consumir tais dados.

  • A Conta Alibaba Cloud B obtém direito de chamar uma operação de API do STS para obter credenciais de segurança temporárias e usá-las nas chamadas de API do Simple Log Service. Para mais informações, consulte O que é o Security Token Service (STS)?

Para atender aos requisitos acima, execute as etapas a seguir:

Etapa 1: O usuário da Conta Alibaba Cloud A cria uma função RAM para a Conta Alibaba Cloud B e concede permissões

Etapa 2: O usuário da Conta Alibaba Cloud B cria o usuário RAM user-b e concede permissões a ele

Etapa 3: O usuário RAM user-b obtém credenciais de segurança temporárias do STS para acessar recursos do Simple Log Service

Etapa 1: O usuário da Conta Alibaba Cloud A cria uma função RAM para a Conta Alibaba Cloud B e concede permissões

O usuário da Conta Alibaba Cloud A deve criar uma função RAM, especificar a Conta Alibaba Cloud B como confiável para assumi-la e conceder a essa função permissões específicas sobre os recursos do Simple Log Service da Conta Alibaba Cloud A.

Crie a função RAM diretamente no console do RAM. Para mais detalhes, consulte Criar um usuário RAM e conceder permissões. Alternativamente, chame a operação de API CreateRole do RAM. Consulte CreateRole para mais informações. O exemplo abaixo demonstra a criação via console.

  1. Faça login no console do Resource Access Management (RAM) com sua conta Alibaba Cloud.

  2. Crie uma função RAM e indique a Conta Alibaba Cloud B como a conta confiável para assumi-la. Veja mais em Criar uma função RAM para uma conta Alibaba Cloud confiável.

  3. Defina uma política personalizada. Na aba JSON da página Create Policy, substitua o script existente no editor de código pelo documento de política abaixo. Para mais detalhes, consulte Usando o editor de scripts.

    Conceder permissões de gravação no Simple Log Service

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

    Conceder permissões para usar grupos de consumidores na extração de dados do Simple Log Service

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

    As políticas acima concedem acesso a todos os projetos e Logstores da Conta Alibaba Cloud A. Caso precise restringir as permissões a um projeto e Logstore específicos, inclua o seguinte código no elemento Resource das políticas:

    • Para autorizar o acesso a um projeto, use acs:log::{projectOwnerAliUid}:project/.

    • Para permitir o acesso a um Logstore, use acs:log::{projectOwnerAliUid}:project/{projectName}/logstore/{logstoreName}/.

    Consulte Lista de recursos para mais informações.

  4. Anexe a política personalizada criada à função RAM. Saiba mais em Gerencie permissões de uma função RAM.

Etapa 2: O usuário da Conta Alibaba Cloud B cria o usuário RAM user-b e concede permissões a ele

O usuário da Conta Alibaba Cloud B cria o usuário RAM user-b e anexa a política de sistema AliyunSTSAssumeRoleAccess a esse usuário. Essa política autoriza o usuário RAM a chamar a operação de API AssumeRole do STS.

  1. Com a Conta Alibaba Cloud B, faça login no console do RAM.

  2. Crie um usuário RAM chamado user-b e selecione Console Access e Using permanent AccessKey to access na seção Access Mode. Para mais detalhes, veja Criar um usuário RAM.

    Importante
  3. Vincule a política AliyunSTSAssumeRoleAccess ao usuário RAM. Isso permite que ele assuma a função RAM e obtenha tokens do Security Token Service (STS). Consulte Gerencie permissões de usuários RAM para mais informações.

Etapa 3: O usuário RAM user-b obtém tokens do STS para acessar recursos do Simple Log Service

  1. Chame a operação de API AssumeRole para receber o par de AccessKey temporário e o token de segurança. Veja mais em AssumeRole.

    Execute essa operação pelo método abaixo:

    Use o sdk do STS para realizar a chamada. Consulte Visão geral do sdk do STS para detalhes.

  2. Chame as operações de API do Simple Log Service. Para mais informações, acesse Visão geral do sdk do Simple Log Service.

Código de exemplo

Com base no sdk do Simple Log Service para Java, o código abaixo exemplifica como o usuário RAM user-b da Conta Alibaba Cloud B grava dados em um projeto da Conta Alibaba Cloud A usando tokens do STS. Código de exemplo:

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 {
	  // Now sts only support "cn-hangzhou"
	  public static final String REGION_CN_HANGZHOU = "cn-hangzhou";
	  // Current sts api version
	  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 {
	      // Construct Alibaba Cloud Acs Client to ivoke OpenAPI
	      IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, accessKeyId, accessKeySecret);
	      DefaultAcsClient client = new DefaultAcsClient(profile);
	      // Create AssumeRoleRequest object
	      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);
	      // send request
	      final AssumeRoleResponse response = client.getAcsResponse(request);
	      return response;
	    } catch (ClientException e) {
	      throw e;
	    }
	  }
	  public static void main(String[] args) {
	    // Only RAM user(sub account)can invoke AssumeRole interface
	    // Alibaba Cloud root account's AccessKeys can't invoke AssumeRole
	    // please create sub account in RAM web console (https://ram.console.alibabacloud.com), and create AK for this sub account
	    String accessKeyId = "<subaccountaccesskey>";
	    String accessKeySecret = "<subaccountaccesssecret>";
	    // AssumeRole API parameter: RoleArn, RoleSessionName, Policy, and DurationSeconds
	    // RoleArn can retrieve in RAM web console
	    // https://ram.console.alibabacloud.com/#/role/detail/< specifid rolename>/info
	    String roleArn = "<rolearn found in web console>";
	    // RoleSessionName is  temporary Token(mainly used for 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);
	    // Only support HTTPS here
	    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("Failed to get a token.");
	      System.out.println("Error code: " + e.getErrCode());
	      System.out.println("Error message: " + e.getErrMsg());
	    }
	    
	    // Simple Log Service parameter
	    // Simple Log Service endpoint document: https://www.alibabacloud.com/help/en/sls/developer-reference/api-sls-2020-12-30-endpoint
	    String logServiceEndpoint = "cn-hangzhou.log.aliyuncs.com";
	    // means project region must be cn-hangzhou
	    String project = "<log service project name>";
	    String logstore = "<log service logstore name>";
	    
	    // Construct Simple Log Service client object
	    Client client = new Client(logServiceEndpoint, 
	    		response.getCredentials().getAccessKeyId(), 
	    		response.getCredentials().getAccessKeySecret());
	    // Notice: the AK & Security Token will be expire in 1 hour
	    // so you must invoke asumeRole interface when expired
	    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("Failed to send data.");
			System.out.println("Error code: " + e.GetErrorCode());
			System.out.println("Error message: " + e.GetErrorMessage());
	    }
	  }
}