在移动互联的时代,直接通过手机应用上传数据越来越普遍。对于日志场景,我们希望将手机应用的日志直接上传到日志服务中,而不需要通过应用服务端中转,这样您就能专注在自己的业务逻辑开发。

背景信息

普通模式下,日志写入日志服务需要开启主账号的访问密钥,用于鉴权以及防篡改。移动应用如果通过此模式接入日志服务,需要将您的AccessKey信息保存在移动端,存在AccessKey泄漏的数据安全风险。一旦发生AccessKeyK泄漏,需要升级移动应用,并替换AccessKey,代价太大。另一种移动端日志接入日志服务的方式为通过您的服务器中转,但是该种模式下,如果移动应用数量较大,您的应用服务器需要承载所有的移动端数据,对服务器的规模有较高的要求。

为了避免以上问题,日志服务为您提供能更安全、更便捷的移动应用日志数据采集方案,即通过RAM搭建一个基于移动服务的移动应用数据直传服务。相较于直接使用AccessKey访问日志服务,您不需要在移动应用端保存AccessKey,不存在AccessKey泄露的风险。使用临时Token访问,更加安全,Token有生命周期,并且可以针对Token定制更加复杂的权限控制,例如限制IP段的访问权限等。

您可以创建日志服务的RAM用户角色,并配置移动应用作为RAM用户扮演该角色,从而做到在30分钟内搭建一个基于日志服务的移动应用日志直传服务。所谓直传就是移动应用通过直连方式访问日志服务,只有控制流需要通过您自己的服务器。

优势

通过RAM搭建一个基于日志服务的移动应用数据直传服务,具有以下优势:
  • 访问方式更加安全。临时、灵活的赋权鉴权。
  • 成本低,您不需要准备很多服务器。移动应用直联云平台,只有控制流需要通过您自己的应用服务器。
  • 高并发,支持海量用户。日志服务有海量的上传和下载带宽。
  • 弹性。日志服务有无限扩容的存储空间。
架构图如下所示架构图
架构说明
节点 说明
Android/iOS 移动应用 手机上的应用,日志来源。
SLS 即阿里云日志服务,负责存储应用上传的日志数据。
RAM/STS 阿里云访问控制云产品,提供身份管理和资源访问控制服务。负责生成临时上传凭证。
应用服务器 即提供该Android/iOS应用的开发者开发的手机应用后台服务,管理应用上传和下载的Token,以及您在应用上传数据的元数据信息。

配置流程

  1. Android/iOS应用向您的应用服务器申请一个临时访问凭证。
    Android/iOS应用不能直接存储AccessKey ID和AccessKey Secret,这样会存在泄密的风险。所以应用必须向您的应用服务器申请一个临时上传凭证(token)。该Token具有时效性,如果该Token的过期时间是30分钟(这个时间由应用服务器指定),那么在这30分钟里面,Android/iOS应用可以使用这个Token访问日志服务。
    注意 Andriod/iOS应用每次去应用服务器获取token时,应用服务器会根据过期时间来缓存这个token。强烈建议在每次客户端请求时,使用应用服务器缓存的token。待token过期后,应用服务器重新申请新的token。
  2. 您的应用服务器检测上述请求的合法性,然后返回Token给Android/iOS应用。
  3. 手机拿到这个Token后,可访问日志服务。

本文主要介绍应用服务器如何向RAM服务申请这个Token,和Android/iOS应用如何获取Token。

操作步骤

  1. 授权用户RAM角色操作日志服务。

    创建日志服务的RAM角色,并配置移动应用作为RAM用户扮演该角色。更多信息,请参见授权用户角色

    配置完成后,您将获取以下参数。
    • RAM用户的accessKeyID和AccessKey Secret。
    • RAM角色的ARN。
  2. 搭建一个应用服务器。

    为了方便开发,本教程提供了多个语言的版本示例程序供您下载,下载地址见文章最底部。

    每个语言包下载下来后,都会有一个配置文件config.json如下所示:
    {
        "AccessKeyID" : "",
        "AccessKeySecret" : "",
        "RoleArn" : "",
        "TokenExpireTime" : "900",
        "PolicyFile": "policy/write_policy.txt"
    }
                                
    1. AccessKeyID:填写您的AccessKey ID。更多信息,请参见访问密钥
    2. AccessKeySecret:填写您的AccessKey Secret。
    3. RoleArn:填写RAM角色的ARN。
    4. TokenExpireTime:指Android/iOS应用取到这个Token的失效时间,取值范围为900~1800。单位为秒。
    5. PolicyFile:填写的是该Token所要拥有的权限列表的文件,默认值可以不修改。
    本文档提供了两种最常用Token权限文件,位于policy目录下面。
    • write_policy.txt:指定了该Token拥有该账号下Project的写入权限。
    • readonly_policy.txt:指定了该Token拥有该账号下Project的读取权限。

    您也可以根据自己的需求设计自己的policy文件。

    返回的数据格式:
    //正确返回
    {
        "StatusCode":200,
        "AccessKeyId":"STS.3p***dgagdasdg",
        "AccessKeySecret":"rpnwO9***tGdrddgsR2YrTtI",
       "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s˙∂˙∂3qaPer8p1YaX1NTDiCFZWFkvlHf1pQhuxfKBc+mRR9KAbHUefqH+rdjZqjTF7p2m1wJXP8S6k+G2MpHrUe6TYBkJ43GhhTVFMuM3BZajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOio6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVtbzI=",
       "Expiration":"2017-11-12T07:49:09Z",
    }
    
    //错误返回
    {
        "StatusCode":500,
        "ErrorCode":"InvalidAccessKeyId.NotFound",
        "ErrorMessage":"Specified access key is not found."
    }
    
                                
    正确返回说明(下面五个变量将构成一个Token):
    状态码 说明
    StatusCode 表示获取Token的状态,获取成功时,返回值是200。
    AccessKeyId 表示Android/iOS应用初始化LogClient获取的 AccessKey ID
    AccessKeySecret 表示Android/iOS应用初始化LogClient获取AccessKey Secret。
    SecurityToken 表示Android/iOS应用初始化的Token。
    Expiration 表示该Token失效的时间。主要在Android SDK会自动判断是否失效,自动获取Token。
    错误返回说明:
    错误码 说明
    StatusCode 表示获取Token的状态,获取失败时,返回值是500。
    ErrorCode 表示错误原因
    ErrorMessage 表示错误的具体信息描述。

    代码示例的运行方法:

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

  3. 移动端构造HTTP请求,从应用服务器获取Token。
    HTTP请求及回应格式如下。
    Request URL: GET https://localhost:7080/
    
    Response:
    {
    "StatusCode":"200",
    "AccessKeyId":"STS.XXXXXXXXXXXXXXX",
    "AccessKeySecret":"",
    "SecurityToken":"",
    "Expiration":"2017-11-20T08:23:15Z"
    }
                                
    说明 本文档中所有示例仅为演示服务器搭建流程,您可以在此基础上进行自定义开发。

源码下载

应用服务器代码示例:PHP、JAVA、Ruby、Node.js