在移動互聯時代,直接通過手機應用上傳數據變得越來越普遍。針對日志場景,您也可以將移動端應用的日志直接上傳到日志服務。本文介紹如何搭建移動端應用日志的直傳服務。
背景信息
普通模式下,寫日志到日志服務需要開啟阿里云賬號的訪問密鑰AK,用于鑒權及防篡改。如果通過此模式上傳日志到日志服務,需要將您阿里云賬號的AK保存在移動端應用中,會存在AK泄漏風險。如果發生AK泄漏,則會威脅該賬號下云資源的安全。
另一種方式是通過應用服務器中轉,但是使用該模式,您的應用服務器需要承載所有的移動端數據,對應用服務器的壓力較大。
為了避免以上問題,阿里云提供更安全、便捷的移動端應用日志采集方案。RAM角色通過STS獲取可以自定義時效和訪問權限的臨時身份憑證。使用該臨時令牌,可搭建直傳服務實現移動設備將應用日志直接上傳到日志庫。
方案概覽
移動端應用向應用服務器發起請求,申請獲取臨時安全令牌;
應用服務器檢測移動端請求的合法性(可以結合業務的實際情況如:登錄態、對稱加密等),若通過校驗,應用服務器需要使用提前創建的RAM用戶生成的AK作為訪問憑據,向STS服務發起AssumeRole接口調用,申請RAM用戶扮演目標RAM角色;
STS服務檢測AK合法性,并驗證RAM用戶是否具備扮演目標RAM角色的權限,若通過校驗,STS服務返回臨時安全令牌給應用服務器;
應用服務器獲取臨時安全令牌后,返回臨時安全令牌給移動端應用;
移動端應用獲取臨時安全令牌后,使用臨時安全令牌訪問日志服務;
日志服務通過RAM/STS服務驗證臨時安全令牌合法性,并驗證RAM角色是否具備訪問目標日志庫的權限,若通過校驗,日志服務處理移動端應用的上傳日志請求,并返回上傳結果給移動端應用。
名詞解釋
節點 | 說明 |
Android/iOS應用 | 最終用戶的移動端應用,日志的來源。 |
SLS | 阿里云日志服務,負責存儲應用上傳的日志。 |
RAM/STS | 阿里云訪問控制,提供用戶身份管理和資源訪問控制服務,負責生成臨時安全憑證(STS Token)。 |
應用服務器 | 提供從STS獲取臨時訪問憑證的服務以及用戶在應用中上傳數據的元數據信息。 |
步驟一:在日志服務中創建Project和Logstore
登錄日志服務控制臺。
創建項目Project,輸入示例Project名稱:slstestproject。
創建Logstore,輸入示例Logstore名稱:slstestlogstore。
步驟二:創建RAM用戶并完成角色扮演授權
RAM用戶的創建詳細步驟請參考:創建RAM用戶。本示例使用的RAM用戶為:ramslsuser。下面步驟中會使用系統會自動生成訪問密鑰AccessKey,請記錄并妥善保存AccessKey。
授予RAM用戶調用STS服務AssumeRole接口的權限:
a. 在用戶頁面,單擊目標RAM用戶操作列的添加權限。
b. 在新增授權頁面,選中系統策略下的AliyunSTSAssumeRoleAccess,然后單擊確認新增授權。
步驟三:創建RAM角色并完成資源授權
創建RAM角色的詳細步驟請參考:創建可信實體為阿里云賬號的RAM角色,示例值如下所示:
參數
說明
角色名稱
輸入角色名稱,例如
ramslsrole
備注
輸入備注信息
選擇信任的云賬號
選擇當前云賬號(UID)
創建完成后,在角色頁面,找到ramslsrole角色,單擊角色名稱,查看并記錄角色ARN。
通過腳本編輯模式創建自定義策略。更多信息請參考:創建自定義權限策略,示例值如下所示:
參數
說明
名稱
輸入自定義策略名稱,例如
putlogspolicy
備注
輸入備注信息
策略內容
{ "Version": "1", "Statement": [ { "Action": [ "log:PostLogStoreLogs", "log:PutLogs" ], "Resource": "acs:log:*:*:project/slstestproject/*", "Effect": "Allow" } ] }
為RAM角色授予自定義權限策略,在角色頁面,找到RAM角色ramslsrole,單擊RAM角色操作列的添加權限。
步驟四:搭建應用服務器
本教程提供了多個語言的版本示例程序供您下載,下載地址請參見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文件。
write_policy.txt:指定了該Token擁有該賬號下Project的寫入權限。使用write_policy.txt權限文件時,請根據實際替換該文件中的Project名稱。
readonly_policy.txt:指定了該Token擁有該賬號下Project的讀取權限。
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); } );