在移动互联时代,直接通过手机应用上传数据越来越普遍。针对日志场景,您也可以将移动端应用的日志直接上传到日志服务,不需要通过应用服务端中转。本文介绍如何搭建移动端应用日志直传服务。
背景信息
代理方案
传统代理方案中,应用服务器需要作为中转站,处理所有来自移动端上传的日志。如果移动端应用日志数量较大或移动设备激增时,单点的应用服务器会成为数据上传的瓶颈。
直传方案
客户端直传的其中一种方式是将AK写入客户端代码中,在客户端使用AK直接将日志上传日志服务。该方式会存在AK泄漏风险。如果发生AK泄漏,则会威胁该账号下云资源的安全。另一种方式是使用临时的安全令牌,通过STS可获取自定义时效和访问权限的临时身份凭证,持有该临时令牌,可实现移动设备直接访问日志服务,搭建直传服务。
方案优势
-
临时安全令牌,访问方式更加安全,遵循最小化授权。
-
成本低。您无需准备大量应用服务器。
-
高并发,支持海量用户。日志服务支持海量的上传和下载带宽。
-
弹性。日志服务具有无限扩容的存储空间。
架构图
名词解释
节点 |
说明 |
Android/iOS应用 |
最终用户的移动端应用,日志的来源。 |
SLS |
阿里云日志服务,负责存储应用上传的日志。 |
RAM/STS |
阿里云访问控制,提供用户身份管理和资源访问控制服务,负责生成临时上传凭证。 |
应用服务器 |
提供从STS获取临时访问凭证的服务以及用户在应用中上传数据的元数据信息。 |
详细说明
-
移动端应用向应用服务器发起请求,申请获取临时安全令牌;
-
应用服务器检测移动端请求的合法性(可以结合业务的实际情况如:登录态、对称加密等),若通过校验,应用服务器需要使用提前创建的RAM用户生成的AK作为访问凭据,向STS服务发起AssumeRole接口调用,申请RAM用户扮演目标RAM角色;
-
STS服务检测AK合法性,并验证RAM用户是否具备扮演目标RAM角色的权限,若通过校验,STS服务返回临时安全令牌给应用服务器;
-
应用服务器获取临时安全令牌后,返回临时安全令牌;
-
移动端应用获取临时安全令牌后,使用临时安全令牌作为访问凭据,直接将日志上传到日志服务;
-
日志服务通过RAM/STS服务验证临时安全令牌合法性,并验证RAM角色是否具备访问目标日志库的权限,若通过校验,日志服务处理移动端应用的上传日志请求,并返回上传结果给移动端应用。
操作步骤
步骤一:在日志服务中创建Project和Logstore
-
登录日志服务控制台。
-
创建Project。
-
在Project列表区域,单击创建Project。
-
在创建Project面板,选择所属地域为华东1(杭州),输入Project名称为slstestproject,其他配置保持默认即可。
-
单击创建。
-
-
创建Logstore。
创建Project完成后,系统会提示您创建一个Logstore。
-
在创建Project对话框,单击创建Logstore。
-
在创建Logstore面板,输入Logstore名称为slstestlogstore,根据需要选择计费模式、Shard数目以及是否开启自动分裂Shard,更多详情请参见管理Shard。
-
单击确定。
-
步骤二:创建RAM用户并完成角色扮演授权
-
登录RAM控制台。
-
创建RAM用户。
-
在左侧导航栏,选择身份管理>用户。
-
在用户页面,单击创建用户。
-
在创建用户页面,输入登录名称为ramslsuser,选中OpenAPI调用访问复选框。
单击确定。
创建成功后,系统会自动生成访问密钥AccessKey,请记录并妥善保存AccessKey。
说明
您也可以手动为RAM用户创建AccessKey。具体操作,请参见创建AccessKey。
-
-
授予RAM用户调用STS服务AssumeRole接口的权限。
-
在用户页面,找到RAM用户ramslsuser,单击RAM用户操作列的添加权限。
-
在添加权限面板,选择权限为系统策略后,找到AliyunSTSAssumeRoleAccess策略并单击策略名称,其他配置保持默认即可。
单击确定。
-
单击完成。
-
步骤三:创建RAM角色并完成资源授权
-
登录RAM控制台。
-
创建RAM角色。
-
在左侧导航栏,选择身份管理>角色。
-
在角色页面,单击创建角色。
-
在创建角色面板,选择可信实体类型为阿里云账号,然后单击下一步。
-
输入角色名称为ramslsrole,选择信任的云账号为当前云账号(UID)。
-
单击完成。
-
单击关闭。
创建完成后,在角色页面,找到ramslsrole角色,单击角色名称,查看并记录角色ARN。
-
通过脚本编辑模式创建自定义策略。
-
在左侧导航栏,选择权限管理>权限策略。
-
在权限策略页面,单击创建权限策略。
-
在创建权限策略页面,单击脚本编辑页签。
-
输入如下权限策略内容,然后单击继续编辑基本信息。
{ "Version": "1", "Statement": [ { "Action": [ "log:PostLogStoreLogs", "log:PutLogs" ], "Resource": "acs:log:*:*:project/slstestproject/*", "Effect": "Allow" } ] }
-
输入权限策略名称为putlogspolicy。
-
单击确定。
-
-
为RAM角色授予自定义权限策略。
-
在左侧导航栏,选择身份管理>角色。
-
在角色页面,找到RAM角色ramslsrole,单击RAM角色操作列的添加权限。
-
在添加权限面板,选择权限为自定义策略后,找到putlogspolicy策略并单击策略名称,其他配置保持默认即可。
单击确定。
-
单击完成。
-
步骤四:搭建一个应用服务器
本教程提供了多个语言的版本示例程序供您下载,下载地址请参见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文件。
Token的最终权限为RAM角色权限与权限文件的权限交集。如果未设置权限文件,则Token的最终权限为RAM角色权限。 |
运行示例代码
代码示例的运行方法:对于Java版本(依赖于Java 1.7+),将包下载解压后,新建一个Java工程,将依赖和代码以及配置拷贝到Java工程中,运行main函数即可,程序默认会监听7080端口,等待HTTP请求,其他语言类似。
步骤五:移动端直传
-
获取安全令牌STS Token
以HTTP请求形式访问服务的7080端口,获取临时安全令牌。返回结果示例如下:
{ "StatusCode":"200", "AccessKeyId":"STS.3pdgagd****", "AccessKeySecret":"rpnwO9wr34tGdrddgsR2Y****", "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjR****tZGVtbzI=", "Expiration":"2021-11-20T08:23:15Z" }
-
移动端直传
示例代码演示通过移动客户端通过临时安全令牌直接将日志写入到日志库中。
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折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/165759.html