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

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

更多内容请参考用户

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

  1. 登录到RAM控制台,并在左侧导航栏单击 角色管理
  2. 单击右上角新建角色
  3. 选择角色类型子页,选择用户角色
  4. 填写类型信息子页,选择受信云账号
    说明
    • 若创建的角色是给您自己名下的 RAM 用户使用(比如授权移动 App 客户端直接操作LOG资源),请选择当前云账号为受信云账号。
    • 若创建的角色是给其他云账号名下的 RAM 用户使用(比如跨账号的资源授权),请选择 其他云账号,并在受信云账号 ID 中填写其他云账号的 ID。
    图 1. 创建角色


  5. 配置角色基本信息子页,输入角色名称备注后,单击创建

步骤2 为RAM用户角色授权

成功创建用户角色后,该用户角色没有任何权限,您需要为RAM用户角色授予操作日志服务的权限。您上一步中指定的受信云账号将有权限扮演该RAM用户角色操作日志服务。

说明
您可以赋予RAM用户角色一个或多个授权策略,包括系统授权策略和自定义授权策略。本文档以授予RAM用户角色管理日志服务的权限为例。
  1. 在RAM控制台左侧导航栏单击角色管理
  2. 单击目标RAM用户角色名称右侧的授权
  3. 选择AliyunLogFullAccess权限,并单击确定

更多内容请参考授权

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

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

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

  1. 登录受信云账号的RAM控制台。
  2. 用户管理页面中,选定用于授权的RAM用户,并单击右侧的授权

    如果您之前没有创建过RAM用户,请参考用户创建一个RAM用户。

  3. 选择系统授权策略AliyunSTSAssumeRoleAccess并单击确定
  4. 单击点击获取以获取验证码,输入收到的验证码,单击确认

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

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

关于 AssumeRole API 的调用方法,请参考使用入门

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

下面是使用AccessKeyId、AccessKeySecret 、SecurityToken初始化LogClient的示例,Java SDK使用请参考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);
    }
    }
}