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

背景信息

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

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

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

优势

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

配置流程

  1. 应用向用户的应用服务器申请一个临时访问凭证。

    Android/iOS应用不能直接存储AccessKeyID/AccessKeySecret,这样会存在泄密的风险。所以应用必须向用户的应用服务器申请一个临时上传凭证(下文将此临时上传凭证称为Token)。这个Token是有时效性的,如果这个Token的过期时间是30分钟(这个时间可以由应用服务器指定),那么在这30分钟里面,该Android/iOS应用可以使用这个Token访问日志服务, 30分钟后再重新获取。

  2. 用户的应用服务器检测上述请求的合法性,然后返回Token给应用。
  3. 手机拿到这个Token后就可以访问日志服务了。

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

操作步骤

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

    创建日志服务的RAM用户角色,并配置移动应用作为RAM子用户扮演该角色,详细步骤请参见授权用户角色

    配置完成后,您将获取以下参数。
    • RAM子用户的accessKeyId、accessKey。
    • 角色的资源路径RoleArn。
  2. 搭建一个应用服务器。

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

    每个语言包下载下来后,都会有一个配置文件config.json如下所示:
    {
        "AccessKeyID" : "",
        "AccessKeySecret" : "",
        "RoleArn" : "",
        "TokenExpireTime" : "900",
        "PolicyFile": "policy/write_policy.txt"
    }
    							
    说明
    1. AccessKeyID:填写您的访问密钥ID。
    2. AccessKeySecret:填写您的访问密钥Secret。
    3. RoleArn:填写用户角色的RoleArn。
    4. TokenExpireTime:指Android/iOS应用取到这个Token的失效时间。注意,最少是900s,默认值可以不修改。
    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获取的 AccessKeyId
    AccessKeySecret 表示Android/iOS应用初始化LogClient获取AccessKeySecret。
    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