在移动互联的时代,直接通过手机应用上传数据越来越普遍,对于日志场景,我们希望将手机应用的日志直接上传到日志服务中,而不需要通过应用服务端中转,这样用户就能专注在自己的业务逻辑开发。
背景信息
普通模式下,日志写入日志服务需要开启主账号的访问密钥,用于鉴权以及防篡改。移动应用如果通过此模式接入日志服务,需要将您的AK信息保存在移动端,存在AK泄漏的数据安全风险。一旦发生AK泄漏,需要升级移动应用,并替换AK,代价太大。另一种移动端日志接入日志服务的方式为通过用户服务器中转,但是该种模式下,如果移动应用数量较大,用户的应用服务器需要承载所有的移动端数据,对服务器的规模有较高的要求。
为了避免以上问题,日志服务为您提供能更安全、更便捷的移动应用日志数据采集方案,即通过RAM搭建一个基于移动服务的移动应用数据直传服务。相较于直接使用AK访问日志服务,用户不需要在移动应用端保存AK,不存在AK泄露的风险。使用临时Token访问,更加安全,Token有生命周期,并且可以针对Token定制更加复杂的权限控制,例如限制IP段的访问权限等。成本低,用户不需要准备很多服务器,移动应用直联云平台,只有控制流走用户自己的应用服务器。
您可以创建日志服务的RAM用户角色,并配置移动应用作为RAM子用户扮演该角色,从而做到在30分钟内搭建一个基于日志服务的移动应用日志直传服务。所谓直传就是移动应用通过直连方式访问日志服务,只有控制流走用户自己的服务器。
优势
通过RAM搭建一个基于日志服务的移动应用数据直传服务,具有以下优势:
- 访问方式更加安全。临时、灵活的赋权鉴权。
- 成本低,用户不需要准备很多服务器。移动应用直联云平台,只有控制流走用户自己的应用服务器。
- 高并发,支持海量用户。日志服务有海量的上传和下载带宽。
- 弹性。日志服务有无限扩容的存储空间。
架构图如下所示

架构说明
节点 |
说明 |
Android/iOS 移动应用 |
最终用户手机上的应用,日志的来源。 |
LOG |
即阿里云日志服务,负责存储应用上传的日志数据。 |
RAM/STS |
阿里云访问控制云产品,提供用户身份管理和资源访问控制服务。负责生成临时上传凭证。 |
用户应用服务器 |
即提供该Android/iOS应用的开发者开发的手机应用后台服务,管理应用上传和下载的Token,以及用户在应用上传数据的元数据信息。 |
配置流程
- 应用向用户的应用服务器申请一个临时访问凭证。
Android/iOS应用不能直接存储AccessKeyID/AccessKeySecret,这样会存在泄密的风险。所以应用必须向用户的应用服务器申请一个临时上传凭证(下文将此临时上传凭证称为Token)。这个Token是有时效性的,如果这个Token的过期时间是30分钟(这个时间可以由应用服务器指定),那么在这30分钟里面,该Android/iOS应用可以使用这个Token访问日志服务,
30分钟后再重新获取。
- 用户的应用服务器检测上述请求的合法性,然后返回Token给应用。
- 手机拿到这个Token后就可以访问日志服务了。
本文档主要介绍应用服务器如何向RAM服务申请这个Token,和Android/iOS应用如何获取Token。
操作步骤
- 授权用户角色操作日志服务。
创建日志服务的RAM用户角色,并配置移动应用作为RAM子用户扮演该角色,详细步骤请参见授权用户角色。
配置完成后,您将获取以下参数。
- RAM子用户的accessKeyId、accessKey。
- 角色的资源路径RoleArn。
- 搭建一个应用服务器。
为了方便开发,本教程提供了多个语言的版本示例程序供您下载,下载地址见文章最底部。
每个语言包下载下来后,都会有一个配置文件config.json如下所示:
{
"AccessKeyID" : "",
"AccessKeySecret" : "",
"RoleArn" : "",
"TokenExpireTime" : "900",
"PolicyFile": "policy/write_policy.txt"
}
说明
- AccessKeyID:填写您的访问密钥ID。
- AccessKeySecret:填写您的访问密钥Secret。
- RoleArn:填写用户角色的RoleArn。
- TokenExpireTime:指Android/iOS应用取到这个Token的失效时间。注意,最少是900s,默认值可以不修改。
- 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请求,其他语言类似。
- 移动端构造HTTP请求,从应用服务器获取Token。
HTTP请求及回应格式如下。
Request URL: GET https://localhost:7080/
Response:
{
"StatusCode":"200",
"AccessKeyId":"STS.XXXXXXXXXXXXXXX",
"AccessKeySecret":"",
"SecurityToken":"",
"Expiration":"2017-11-20T08:23:15Z"
}
说明 本文档中所有示例仅为演示服务器搭建流程,用户可以在此基础上进行自定义开发。
在文档使用中是否遇到以下问题
更多建议
匿名提交