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

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

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

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

优势

通过RAM搭建一个基于日志服务的移动应用数据直传服务,具有以下优势:

  • 访问方式更加安全。临时、灵活的赋权鉴权。
  • 成本低,用户不需要准备很多服务器。移动应用直联云平台,只有控制流走用户自己的应用服务器。
  • 高并发,支持海量用户。日志服务有海量的上传和下载带宽。
  • 弹性。日志服务有无限扩容的存储空间。
架构图如下所示。

说明:

节点 说明
Android/iOS 移动应用 最终用户手机上的APP,日志的来源。
LOG 即阿里云日志服务,负责存储APP上传的日志数据。
RAM/STS 阿里云访问控制云产品,提供用户身份管理和资源访问控制服务。负责生成临时上传凭证。
用户应用服务器 即提供该Android/iOS应用的开发者开发的APP后台服务,管理APP上传和下载的Token,以及用户在APP上传数据的元数据信息。

配置流程

  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用户角色,并配置APP作为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