如果您需要将日志服务的操作权限授予一个受信实体用户,允许该实体用户下的RAM角色操作日志服务,您需要创建RAM用户角色并指定受信云账号、为RAM用户角色授权、为受信账号下的RAM用户授予AssumeRole权限、获取RAM用户角色的临时安全令牌。

背景信息

角色用户一样,都是RAM中使用的身份。与RAM用户相比,RAM用户角色是一种虚拟用户,它没有确定的身份认证密钥,且需要被一个受信的实体用户(例如云账号、RAM-User账号、云服务账号)扮演才能正常使用。扮演成功后实体用户将获得RAM用户角色的临时安全令牌,使用这个临时安全令牌就能以RAM用户角色身份访问被授权的资源。

步骤1 创建用户角色并指定受信云账号

  1. 云账号登录RAM控制台
  2. 在左侧导航栏,单击RAM角色管理
  3. 单击新建RAM角色,选择可信实体类型为阿里云账号,单击下一步
  4. 输入角色名称备注
  5. 选择云账号当前云账号其他云账号
    说明
    • 若创建的角色是给您自己名下的RAM用户使用(例如授权移动App客户端直接操作日志服务的资源),请选择当前云账号为受信云账号。
    • 若创建的角色是给其他云账号名下的RAM用户使用(例如跨账号的资源授权),请选择其他云账号,并在受信云账号ID中填写其他云账号的ID。
  6. 单击完成

步骤2 为RAM用户角色授权

成功创建用户角色后,该用户角色没有任何权限,您需要为RAM用户角色授予操作日志服务的权限。您上一步中指定的受信云账号将有权限扮演该RAM用户角色操作日志服务。
说明 您可以赋予RAM用户角色一个或多个授权策略,包括系统授权策略和自定义授权策略。本文档以授予RAM用户角色管理日志服务的权限为例。
  1. 在左侧导航栏,单击RAM角色管理
  2. RAM角色名称列表下,找到目标RAM角色。
  3. 单击添加权限,被授权主体会自动填入。
  4. 在左侧权限策略名称列表下,单击需要授予RAM角色的权限策略AliyunLogFullAccess
  5. 单击确定
  6. 单击完成

步骤3 为受信云账号的RAM用户授权

RAM用户角色需要被一个受信的实体用户扮演才能正常使用,但是受信实体用户不能以自己的身份扮演RAM用户角色,必须以RAM用户的身份和形式扮演。即RAM用户角色只能通过RAM用户身份来扮演使用。

另外,受信云账号必须为其名下的RAM用户进行AssumeRole授权,授予该RAM用户调用STS服务AssumeRole接口的权限,此RAM用户才能代表受信云账号扮演步骤1中创建的RAM用户角色。

  1. 使用受信云账号登录RAM控制台。
  2. 在左侧导航栏的权限管理菜单下,单击授权
  3. 单击新增授权
  4. 被授权主体区域下,输入RAM用户名称后,单击需要授权的RAM用户。
  5. 在左侧权限策略名称列表下,单击需要授予RAM用户的权限策略AliyunSTSAssumeRoleAccess
  6. 单击确定
  7. 单击完成

步骤4 获取RAM用户角色的临时安全令牌

当RAM用户被授予AssumeRole权限之后,可以使用其AccessKey调用安全令牌服务(STS)的AssumeRole接口,以获取某个角色的临时安全令牌。

关于AssumeRole API的调用方法,请参见Java SDK 示例

使用STS SDK拿到AccessKeyId、AccessKeySecret 、SecurityToken之后就可以使用日志服务的SDK访问日志服务了。

下面是使用AccessKeyId、AccessKeySecret 、SecurityToken初始化LogClient的示例,Java SDK使用请参见Log Service Java SDK
package sdksample;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.Date;
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.*;
import com.aliyun.openservices.log.exception.*;
import com.aliyun.openservices.log.request.*;
import com.aliyun.openservices.log.response.*;
import com.aliyun.openservices.log.common.LogGroupData;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.common.Logs.Log;
import com.aliyun.openservices.log.common.Logs.Log.Content;
import com.aliyun.openservices.log.common.Logs.LogGroup;
import com.aliyun.openservices.log.common.Consts.CursorMode;
public class sdksample {
    public static void main(String args[]) throws LogException, InterruptedException {
        String endpoint = "<log_service_endpoint>"; // 选择与上面步骤创建 Project 所属区域匹配的Endpoint
        String accessKeyId = "<your_access_key_id>"; // 使用您的阿里云访问密钥 AccessKeyId
        String accessKeySecret = "<your_access_key_secret>"; // 使用您的阿里云访问密钥AccessKeySecret
    String securityToken = "<your_security_token>"; //角色的SecurityToken
        String project = "<project_name>"; // 上面步骤创建的项目名称
        String logstore = "<logstore_name>"; // 上面步骤创建的日志库名称
        // 构建一个客户端实例
        Client client = new Client(endpoint, accessKeyId, accessKeySecret);
    // 设置SecurityToken
    client.SetSecurityToken(securityToken);
        // 写入日志
        String topic = "";
        String source = "";
        // 连续发送 10 个数据包,每个数据包有 10 条日志
        for (int i = 0; i < 10; i++) {
            Vector<LogItem> logGroup = new Vector<LogItem>();
            for (int j = 0; j < 10; j++) {
                LogItem logItem = new LogItem((int) (new Date().getTime() / 1000));
                logItem.PushBack("index"+String.valueOf(j), String.valueOf(i * 10 + j));
                logGroup.add(logItem);
            }
            PutLogsRequest req2 = new PutLogsRequest(project, logstore, topic, source, logGroup);
            client.PutLogs(req2);
    }
    }
}