文档

采集-搭建移动端日志直传服务

更新时间:

在移动互联时代,直接通过手机应用上传数据越来越普遍。针对日志场景,您也可以将移动端应用的日志直接上传到日志服务,不需要通过应用服务端中转。本文介绍如何搭建移动端应用日志直传服务。

背景信息

代理方案

image

传统代理方案中,应用服务器需要作为中转站,处理所有来自移动端上传的日志。如果移动端应用日志数量较大或移动设备激增时,单点的应用服务器会成为数据上传的瓶颈。

直传方案

客户端直传的其中一种方式是将AK写入客户端代码中,在客户端使用AK直接将日志上传日志服务。该方式会存在AK泄漏风险。如果发生AK泄漏,则会威胁该账号下云资源的安全。另一种方式是使用临时的安全令牌,通过STS可获取自定义时效和访问权限的临时身份凭证,持有该临时令牌,可实现移动设备直接访问日志服务,搭建直传服务。

方案优势

  • 临时安全令牌,访问方式更加安全,遵循最小化授权。

  • 成本低。您无需准备大量应用服务器。

  • 高并发,支持海量用户。日志服务支持海量的上传和下载带宽。

  • 弹性。日志服务具有无限扩容的存储空间。

流程图

image

名词解释

节点

说明

Android/iOS应用

最终用户的移动端应用,日志的来源。

SLS

阿里云日志服务,负责存储应用上传的日志。

RAM/STS

阿里云访问控制,提供用户身份管理和资源访问控制服务,负责生成临时上传凭证。

应用服务器

提供从STS获取临时访问凭证的服务以及用户在应用中上传数据的元数据信息。

详细说明

  1. 移动端应用向应用服务器发起请求,申请获取临时安全令牌;

  2. 应用服务器检测移动端请求的合法性(可以结合业务的实际情况如:登录态、对称加密等),若通过校验,应用服务器需要使用提前创建的RAM用户生成的AK作为访问凭据,向STS服务发起AssumeRole接口调用,申请RAM用户扮演目标RAM角色;

  3. STS服务检测AK合法性,并验证RAM用户是否具备扮演目标RAM角色的权限,若通过校验,STS服务返回临时安全令牌给应用服务器;

  4. 应用服务器获取临时安全令牌后,返回临时安全令牌;

  5. 移动端应用获取临时安全令牌后,使用临时安全令牌作为访问凭据,直接将日志上传到日志服务;

  6. 日志服务通过RAM/STS服务验证临时安全令牌合法性,并验证RAM角色是否具备访问目标日志库的权限,若通过校验,日志服务处理移动端应用的上传日志请求,并返回上传结果给移动端应用。

操作步骤

步骤一:在日志服务中创建Project和Logstore

  1. 登录日志服务控制台

  2. 创建Project。

    1. 在Project列表区域,单击创建Project

    2. 创建Project面板,选择所属地域华东1(杭州),输入Project名称slstestproject,其他配置保持默认即可。

    3. 单击创建

  3. 创建Logstore。

    创建Project完成后,系统会提示您创建一个Logstore。

    1. 创建Project对话框,单击创建Logstore

    2. 创建Logstore面板,输入Logstore名称slstestlogstore,根据需要选择计费模式Shard数目以及是否开启自动分裂Shard,更多详情请参见管理Shard

    3. 单击确定

步骤二:创建RAM用户并完成角色扮演授权

  1. 登录RAM控制台

  2. 创建RAM用户。

    1. 在左侧导航栏,选择身份管理>用户

    2. 用户页面,单击创建用户

    3. 创建用户页面,输入登录名称ramslsuser,选中OpenAPI调用访问复选框。

      image.png

    4. 单击确定

      创建成功后,系统会自动生成访问密钥AccessKey,请记录并妥善保存AccessKey。

      说明

      您也可以手动为RAM用户创建AccessKey。具体操作,请参见创建AccessKey

  3. 授予RAM用户调用STS服务AssumeRole接口的权限。

    1. 用户页面,找到RAM用户ramslsuser,单击RAM用户操作列的添加权限

    2. 添加权限面板,选择权限为系统策略后,找到AliyunSTSAssumeRoleAccess策略并单击策略名称,其他配置保持默认即可。

      image.png

    3. 单击确定

    4. 单击完成

步骤三:创建RAM角色并完成资源授权

  1. 登录RAM控制台

  2. 创建RAM角色。

    1. 在左侧导航栏,选择身份管理>角色

    2. 角色页面,单击创建角色

    3. 创建角色面板,选择可信实体类型为阿里云账号,然后单击下一步

    4. 输入角色名称ramslsrole,选择信任的云账号为当前云账号(UID)

    5. 单击完成

    6. 单击关闭

      创建完成后,在角色页面,找到ramslsrole角色,单击角色名称,查看并记录角色ARN。

      image.png

  3. 通过脚本编辑模式创建自定义策略。

    1. 在左侧导航栏,选择权限管理>权限策略

    2. 权限策略页面,单击创建权限策略

    3. 创建权限策略页面,单击脚本编辑页签。

    4. 输入如下权限策略内容,然后单击继续编辑基本信息

      {
        "Version": "1",
        "Statement": [
          {
            "Action": [
              "log:PostLogStoreLogs",
              "log:PutLogs"
            ],
            "Resource": "acs:log:*:*:project/slstestproject/*",
            "Effect": "Allow"
          }
        ]
      }
    5. 输入权限策略名称putlogspolicy

    6. 单击确定

  4. 为RAM角色授予自定义权限策略。

    1. 在左侧导航栏,选择身份管理>角色

    2. 角色页面,找到RAM角色ramslsrole,单击RAM角色操作列的添加权限

    3. 添加权限面板,选择权限为自定义策略后,找到putlogspolicy策略并单击策略名称,其他配置保持默认即可。

      image.png

    4. 单击确定

    5. 单击完成

步骤四:搭建一个应用服务器

本教程提供了多个语言的版本示例程序供您下载,下载地址请参见PHP、Java、Ruby、Node.js

配置文件

示例中,每个语言包内均有一个管理配置的config.json文件,可对配置进行修改。

{
    "AccessKeyID" : "",
    "AccessKeySecret" : "",
    "RoleArn" : "",
    "TokenExpireTime" : "900",
    "PolicyFile": "policy/write_policy.txt"
}
                            

参数

说明

AccessKeyID

RAM用户的访问密钥ID。

AccessKeySecret

RAM用户的访问密钥Secret。

RoleArn

RAM角色的RoleArn。

TokenExpireTime

移动端应用获取到的Token的失效时间。

最少是900s,可以不修改默认值。

PolicyFile

Token所要拥有的权限列表的文件,可以不修改默认值。

此处提供两种最常用Token权限文件,位于policy目录下面。 您也可以根据业务需求设计policy文件。

  • write_policy.txt:指定了该Token拥有该账号下Project的写入权限。使用write_policy.txt权限文件时,请根据实际替换该文件中的Project名称。

  • readonly_policy.txt:指定了该Token拥有该账号下Project的读取权限。

Token的最终权限为RAM角色权限与权限文件的权限交集。如果未设置权限文件,则Token的最终权限为RAM角色权限。

运行示例代码

代码示例的运行方法:对于Java版本(依赖于Java 1.7+),将包下载解压后,新建一个Java工程,将依赖和代码以及配置拷贝到Java工程中,运行main函数即可,程序默认会监听7080端口,等待HTTP请求,其他语言类似。

步骤五:移动端直传

  1. 获取安全令牌STS Token

    以HTTP请求形式访问服务的7080端口,获取临时安全令牌。返回结果示例如下:

    {
      "StatusCode":"200",
      "AccessKeyId":"STS.3pdgagd****",
      "AccessKeySecret":"rpnwO9wr34tGdrddgsR2Y****",
      "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjR****tZGVtbzI=",
      "Expiration":"2021-11-20T08:23:15Z"
    }                          
  1. 移动端直传

    示例代码演示通过移动客户端通过临时安全令牌直接将日志写入到日志库中。

    const ALY = require("aliyun-sdk");
    
    const sls = new ALY.SLS({
      accessKeyId: "Your temporary accesKeyId",
      secretAccessKey: "Your temporary accessKeySecret",
      securityToken: "Your sts token",
      endpoint: "http://cn-hangzhou.log.aliyuncs.com",
    });
    
    // -------------------------------
    // put logs
    // -------------------------------
    const projectName = "your_project_name";
    const logStoreName = "your_logstore";
    
    const logGroup = {
      logs: [
        {
          time: Math.floor(new Date().getTime() / 1000),
          contents: [
            {
              key: "a",
              value: "1",
            },
            {
              key: "a",
              value: "2",
            },
            {
              key: "a",
              value: "3",
            },
          ],
        },
      ],
      topic: "vv",
      source: "127.0.0.1",
    };
    
    sls.putLogs(
      {
        //必选字段
        projectName: projectName,
        logStoreName: logStoreName,
        logGroup: logGroup,
      },
      function (err, data) {
        if (err) {
          console.log("error:", err);
          return;
        }
    
        console.log("success:", data);
      }
    );
    

  • 本页导读 (1)
文档反馈