ユーザーの行動に関する洞察を得るために、企業はミニプログラムからログを収集し、ユーザーデバイスや閲覧履歴などの重要なデータを分析します。 このように、企業は機能を改善し、ユーザーエクスペリエンスを最適化できます。 Alibaba Cloud Simple Log Serviceのwebトラッキング機能を有効にすると、企業はミニプログラムからSimple Log Serviceにユーザーログを自動的に収集できます。 これにより、データ処理効率が向上し、アプリケーションサーバーの負担が軽減されます。 ログストアのwebトラッキング機能を有効にすると、ログストアの書き込み権限が匿名ユーザーに付与されます。 これにより、ミニプログラムの構成データリークによるダーティデータが発生する可能性があります。 このリスクを軽減し、データのアップロードのセキュリティを強化するために、security Token Service (STS) を使用して、指定された期間内に有効なトークンをミニプログラムに提供し、特定の操作のみを許可することを推奨します。 このトピックでは、Simple Log ServiceとSTSを使用して、ミニプログラム用の安全で効率的な直接データ転送サービスを構築し、ミニプログラムからSimple Log serviceにブラウジング動作ログを収集する方法について説明します。
背景情報
エンタープライズAは、ユーザーが製品やサービスを閲覧して購入するように設計された、機能が豊富でユーザーフレンドリーなオンラインプラットフォームを提供するミニプログラムを開発しています。 エンタープライズAは、ユーザーの要件をよりよく理解し、ユーザーエクスペリエンスを最適化し、ミニプログラムのコンバージョン率をさらに向上させるための、ユーザーの行動に関する詳細な分析の重要性を認識しています。 ユーザーの行動には、クリック、スワイプ、住居、検索習慣、および購入が含まれます。 したがって、エンタープライズAの技術チームは、効率的なデータ分析と処理のために、ミニプログラムからSimple Log Serviceにログを収集します。
セキュリティリスク
アプリケーションサーバーの負担を軽減し、データ処理効率を向上させるために、ミニプログラムは、アプリケーションサーバーへのデータ転送やデータ収集を必要とせずに、ユーザーログをSimple Log Serviceに直接アップロードするように設計されています。
次の図は、Enterprise AがSimple Log serviceにミニプログラムログを収集するための直接データ転送サービスを構築する計画を示しています。
Simple Log Serviceログストアでwebトラッキング機能を有効にすると、ログストアの書き込み権限が匿名ユーザーに付与されます。 この場合、次のリスクが発生する可能性があります。
ダーティデータ生成: 悪意のあるユーザーは、誤ったデータや操作されたデータをアップロードする可能性があり、データの品質と分析結果の精度が低下します。
サービス乱用: 無制限の書き込み操作を利用して、サービス拒否 (DoS) 攻撃を開始することができます。 攻撃者は、リソースを使い果たすために多数の書き込み要求を開始する場合があります。
解決策
リスクを処理するために、エンタープライズAは一時的なアクセス許可を追加します。 このようにして、エンタープライズAは直接データ転送の効率を確保し、次の利点を得ることができます。
強化された認証と承認: STSは、指定された期間内に有効なトークンを生成します。 これにより、トークンがすぐに無効になるため、トークンが漏洩してもセキュリティリスクが大幅に軽減されます。
きめ細かいアクセス制御: STSでは、最小権限の原則に基づいてアクセス許可を設定できます。 ミニプログラムに必要な権限のみを付与できます。 これにより、トークンリークの影響範囲を減らし、ミニプログラムに過度の権限を付与することを防ぎます。
次の図は、Enterprise AがSimple Log serviceにミニプログラムログを収集するための直接データ転送サービスを構築する方法を示しています。
ソリューションの展開
このセクションでは、Simple Log ServiceとSTSを使用して、ミニプログラム用の直接データ転送サービスを構築し、ミニプログラムからSimple Log serviceにブラウジング動作ログを収集する方法について説明します。 sls-mini-tracking-sts.zipプロジェクトは、配置を説明するための例として使用されます。
準備
デプロイを開始する前に、クラウドリソースを作成する必要があります。
ミニプログラムから収集されたログを保存および分析するためのSimple Log Serviceプロジェクトとログストアを作成します。 詳細については、「プロジェクトの作成」および「ログストアの作成」をご参照ください。
パラメーター
サンプル値
リージョン
中国 (上海)
プロジェクト名
sls-webtracking-mini
Logstore 名
web-tracking-logstore
アプリケーションサーバーとしてECS (Elastic Compute Service) インスタンスを作成し、STSトークンを生成します。 詳細は、「ECS インスタンスの作成」をご参照ください。
説明実際のデプロイでは、ECSインスタンスを作成することなく、STS APIをアプリケーションサーバーに直接統合できます。
パラメーター
サンプル値
Billing Method
従量課金
リージョン
中国 (上海)
パブリック IP アドレス
パブリックIPv4アドレスの割り当て
セキュリティグループ
HTTP-TCP:80-open
手順1: RAMユーザーの作成
Alibaba Cloudアカウントまたは管理者権限を持つRAMユーザーを使用して RAMコンソールにログインします。
RAM ユーザーを作成します。 詳細については、「RAMユーザーの作成」をご参照ください。
重要RAMユーザーを作成するときは、Access ModeパラメーターをUsing permanent AccessKey to accessに設定し、RAMユーザーのAccessKeyペアを記録します。
RAMユーザーのAccessKeyシークレットは、RAMユーザーのAccessKeyペアを作成した場合にのみ表示されます。 AccessKeyペアを作成した後、AccessKeyシークレットを照会することはできません。 AccessKeyを秘密にしてください。
手順2: AssumeRole操作の呼び出しをRAMユーザーに許可する
AliyunSTSAssumeRoleAccessポリシーをRAMユーザーにアタッチします。 これにより、RAMユーザーはRAMロールを引き受けて、Security Token Service (STS) トークンを取得できます。 詳細については、「RAMユーザーへの権限付与」をご参照ください。
ステップ3: RAMロールの作成
RAMユーザーがSTSトークンを取得するために引き受けることができるRAMロールを作成します。 この例では、sls-web-tracking
という名前のロールが作成されます。 詳細については、「信頼できるAlibaba CloudアカウントのRAMロールの作成」をご参照ください。
手順4: カスタムポリシーの作成
カスタムポリシーを作成します。 この例では、post-logs-policy
という名前のポリシーが作成されます。 [ポリシーの作成] ページの [JSON] タブで、コードエディターの既存のスクリプトを次のポリシードキュメントに置き換えます。 詳細については、「[JSON] タブでカスタムポリシーを作成する」をご参照ください。
次のポリシードキュメントの <Project name>
と <Logstore name>
を、このトピックの「準備」セクションで作成されたプロジェクトとログストアの名前に置き換えます。
ポリシーは、指定されたSimple Log Serviceログストアにログをアップロードする権限のみを付与します。 RAMロールに過度の権限を付与しないように、ビジネス要件に基づいてきめ細かいRAMポリシーを構成する必要があります。 詳細については、「カスタムポリシーを使用してRAMユーザーに権限を付与する例」をご参照ください。
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Action":[
"log:PostLogStoreLogs"
],
"Resource":[
"acs:log:*:*:project/<Project name>/logstore/<Logstore name>"
]
}
]
}
ステップ5: カスタムポリシーをRAMロールにアタッチ
post-logs-policy
ポリシーをsls-web-tracking
ロールにアタッチします。 これにより、RAMユーザーはRAMロールを引き受け、ポリシーで許可されている操作を実行できます。 詳細については、「RAMロールに権限を付与する」をご参照ください。
ステップ6: アプリケーションサーバーからSTSトークンを取得
ミニプログラムにアクセスし、STS SDKをアプリケーションサーバーに統合して、/get_sts_token操作を実装します。 詳細については、「STS SDKの概要」をご参照ください。 HTTP GETメソッドを使用して /get_sts_token
操作を呼び出すと、システムはSTSトークンを生成して返します。
次の手順では、ECSインスタンスでFlaskフレームワークを使用してミニプログラムを構築し、アプリケーションサーバーからSTSトークンを取得する方法について説明します。
ECS インスタンスに接続します。 ECSインスタンスにPython 3をインストールします。
RAMユーザーの環境変数
ALIBABA_CLOUD_ACCESS_KEY_ID
およびALIBABA_CLOUD_ACCESS_KEY_SECRET
を設定します。 詳細については、「Linux、macOS、およびWindowsでの環境変数の設定」をご参照ください。プロジェクトディレクトリを作成し、プロジェクトディレクトリに切り替えます。
mkdir my_web_sample cd my_web_sample
依存関係をインストールします。
pip3 install Flask pip3 install attr pip3 install yarl pip3 install async_timeout pip3 install idna_ssl pip3 install attrs pip3 install aiosignal pip3 install charset_normalizer pip3 install alibabacloud_tea_openapi pip3 install alibabacloud_sts20150401 pip3 install alibabacloud_credentials
バックエンドコードを作成します。
main.py
という名前のファイルを作成します。次のPythonコードをファイルに追加します。
重要<YOUR_ROLE_ARN>
を、手順3で作成したsls-web-tracking
ロールのAlibaba Cloudリソース名 (ARN) に置き換えます。<YOUR_ROLE_SESSION_NAME>
をセッションのカスタム名に置き換えます。 例:role_session_test
import json from flask import Flask, render_template from alibabacloud_tea_openapi.models import Config from alibabacloud_sts20150401.client import Client as Sts20150401Client from alibabacloud_sts20150401 import models as sts_20150401_models from alibabacloud_credentials.client import Client as CredentialClient app = Flask(__name__) # Replace <YOUR_ROLE_ARN> with the ARN of the RAM role. role_arn_for_oss_upload = '<YOUR_ROLE_ARN>' # Specify the region of STS. Example: cn-shanghai. region_id = 'cn-shanghai' @app.route('/get_sts_token', methods=['GET']) def get_sts_token(): # If you do not specify parameters when you initialize CredentialClient, the default credential chain is used. # If you run the file on your computer, you can specify the AccessKey pair by configuring the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables. # If you run the file on ECS, Elastic Container Instance (ECI), or Container Service for Kubernetes (ACK), you can specify the role of the bound instance by configuring the ALIBABA_CLOUD_ECS_METADATA environment variable. The SDK automatically obtains STS tokens. config = Config(region_id=region_id, credential=CredentialClient()) sts_client = Sts20150401Client(config=config) assume_role_request = sts_20150401_models.AssumeRoleRequest( role_arn=role_arn_for_oss_upload, # Replace <YOUR_ROLE_SESSION_NAME> with the custom name of the session. role_session_name='<YOUR_ROLE_SESSION_NAME>' ) response = sts_client.assume_role(assume_role_request) token = json.dumps(response.body.credentials.to_map()) return token app.run(host="0.0.0.0", port=80)
main.pyファイルを実行します。
python3 main.py
ブラウザで
http:// <ECSインスタンスのパブリックIPアドレス>/get_sts_token
にアクセスします。次の図は、成功レスポンスを示しています。
手順7: ミニプログラムでSTSトークンを使用して、指定したSimple Log Serviceログストアにログをアップロード
ミニプログラムの開発プロセスとコード構造の詳細については、「Alipayのドキュメントセンターのミニプログラムの作成」をご参照ください。 この例では、Todo Appに基づいてミニプログラムのクライアントサイドコードを記述し、webトラッキングSDK for JavaScriptのSTSプラグインを使用してログをアップロードすることができます。
アプリケーションサーバーに /get_sts_token操作を実装した後、Simple Log Serviceの @ aliyun-sls/web-track-miniインストルメンテーションSDKと @ aliyun-sls/web-sts-plugin STSプラグインをミニプログラムのapp.js
ファイルに統合します。 これにより、ユーザーの行動をリアルタイムで監視し、関連するログをアップロードできます。
トラッカーを作成すると、トラッカーは自動的に /get_sts_token
操作を呼び出してSTSトークンを取得します。 このようにして、ミニプログラムのやり取り中に生成されたユーザーの行動データをSimple Log Serviceに安全に転送できます。 ユーザ行動データは、ログオン、製品ブラウジング、および注文提出のデータを含む。
ミニプログラムの開発者ツールをダウンロードします。 詳細については、「ミニプログラムの開発者ツール」をご参照ください。
Todo App miniプログラムを作成して使用します。 詳細については、「Todo App」をご参照ください。
npmをインストールします。
yum install npm
プロジェクトの依存関係をインストールします。
npm install --save @aliyun-sls/web-track-mini npm install --save @aliyun-sls/web-sts-plugin
Todo App miniプログラムのサンプルコードを変更して、webトラッキング機能を使用してユーザーログを指定されたログストアにアップロードします。 変更する必要があるファイルを次の表に示します。
ファイル
コード変更の説明
app.js
onLaunch
メソッドでinitSlsTracker
メソッドを呼び出します。 このようにして、ミニプログラムを起動すると、SlsTrackerオブジェクトが初期化されます。initSlsTracker
メソッドでプロジェクトやログストアなどのパラメーターを設定します。 パラメーターの詳細については、「Webトラッキングパラメーター」をご参照ください。STSトークンを動的に取得して更新するには、
stsOpt
パラメーターとrefreshSTSToken
関数を設定します。 STSトークン関連のパラメーターの詳細については、「STSパラメーター」をご参照ください。
mini.project.json
@ aliyun-sls/web-sts-plugin STSプラグインは、ECMAScript 6 (ES6) をサポートしています。
mini.project.json
ファイルを変更するときは、compileOptions.transpile
をtrue
に設定します。 このように、ミニプログラムの開発者ツールは、互換性を確保するためにES6コードをECMAScript 5 (ES5) コードに変換します。todo.xml
<view class="todo-footer"> <add-button text="Add Todo" onClickMe="handleAddTodo"></add-button> </view>
ユーザーインターフェイスの下部に
[Todoの追加]
という名前のボタンを定義します。add-button
を使用してボタンを定義できます。onClickMe="handleAddTodo"
は、ボタンをクリックすると、システムがtodo.js
ファイルで定義されたhandleAddTodo
メソッドを呼び出すことを指定します。todo.js
handleAddTodo()
関数を使用してイベントを処理します。 ユーザーインターフェイスにto do項目を追加すると、この機能がトリガーされます。 この関数は次の操作を実行します。this.addTodo()
メソッドを呼び出して、to-doアイテムを追加します。this.onAddTodoButtonClick()
メソッドを呼び出して、ユーザーが [Todoの追加] ボタンをクリックしたことを示すログメッセージを送信します。
addTodo()
関数を使用して、ミニプログラムのmy.navigateTo
関数を呼び出します。 このようにして、現在のページからミニプログラムの/pages/add-todo/add-todo
ディレクトリにある必要なページに移動します。onAddTodoButtonClick()
メソッドを使用して、SlsTracker
オブジェクトのsend
メソッドを呼び出し、ログを送信します。 ログの内容はeventType: 'addtodo_click'
です。 SlsTrackerオブジェクトは、app.js
ファイルで定義されています。
add-todo.js
add
メソッドを使用して、次の操作を実行します。newTodo
という名前のオブジェクトを作成します。newTodo
オブジェクトは、次の属性を含むto-doアイテムを指定します。text
: to doアイテムのコンテンツ。this.data.inputValue
メソッドを呼び出して、コンテンツを取得できます。 この呼び出しは、コンテンツがユーザー入力から来ることを示します。completed
: to-doアイテムが完了するかどうかを指定します。 初期値:false
この値は、to-do項目が完了していないことを示します。
app.js
ファイルで定義されているSlsTracker
オブジェクトのsend
メソッドを呼び出してログを送信します。 次のコードは、ログの内容を示しています。eventType: 'add_todo' todoText: newTodo.text
add-button.js
カスタムボタンを定義します。
onClickMe
メソッドは、最初にthis.props.onClickMe
が関数であるかどうかを確認します。this.props.onClickMe
が関数の場合、メソッドは関数を呼び出します。app.js
ファイルでパラメーターを設定します。// app.js import SlsTracker from '@aliyun-sls/web-track-mini'; import createStsPlugin from '@aliyun-sls/web-sts-plugin'; App({ todos: [ { text: 'Learning Javascript', completed: true }, { text: 'Learning ES2016', completed: true }, { text: 'Learning the Alipay mini program', completed: false }, ], userInfo: null, tracker: null, onLaunch: function() { // When you start the mini program, initialize the SlsTracker object. this.initSlsTracker(); }, initSlsTracker: function() { const opts = { host: 'cn-shanghai.log.aliyuncs.com', // Replace the value with your endpoint. project: '${project}', // Replace the value with your project name. logstore: '${Logstore}', // Replace the value with your logstore name. time: 10, count: 10, topic: 'topic', source: 'source', tags: { tags: 'tags', }, }; const stsOpt = { accessKeyId: '', accessKeySecret: '', securityToken: '', refreshSTSToken: () => new Promise((resolve, reject) => { my.request({ url: 'http://${The public IP address of the ECS instance}}/get_sts_token', // Replace the value with the actual address of your application server that generates the STS token. method: 'GET', success: (res) => { if (res.statusCode === 200) { let credential; // Check whether the data type of the returned data is string. If the data type is not string, the data may be an object. if (typeof res.data === "string") { // Parse the returned data into a JSON object. credential = JSON.parse(res.data); } else { // Use the object. credential = res.data; } stsOpt.accessKeyId = credential.AccessKeyId; stsOpt.accessKeySecret = credential.AccessKeySecret; stsOpt.securityToken = credential.SecurityToken; resolve(credential); } else { reject(new Error('Failed to refresh STS token with status code: ' + res.statusCode)); } }, fail: (err) => { reject(new Error('Failed to refresh STS token', err)); }, }); }), }; const tracker = new SlsTracker(opts); const stsPlugin = createStsPlugin(stsOpt); tracker.useStsPlugin(stsPlugin); // When you start the mini program, a log is uploaded to Simple Log Service. // tracker.send({ // eventType:'view_product', // productName: 'Tablet', // price: 500 // }); this.tracker = tracker; }, });
opts
およびstsOpt
パラメーターの詳細については、「webトラッキングSDK For JavaScriptのSTSプラグインを使用してログをアップロードする」をご参照ください。${project}
と${logstore}
を、このトピックの「準備」セクションで作成されたプロジェクトとログストアの名前に置き換えます。<ECSインスタンスのパブリックIPアドレス>
を、このトピックの「準備」セクションで作成されたECSインスタンスのパブリックIPアドレスに置き換えます。 ECSインスタンスのパブリックIPアドレスを表示する方法の詳細については、「IPアドレスの表示」をご参照ください。
ミニプログラムのクライアント側コードを実行します。
開発者ツールページの右上隅にあるアイコンをクリックします。 ミニプログラムのプレビューページで、Todo AppページのTodoを追加ボタンをクリックします。 [Todoの追加] ボタンをクリックするか、[Todoの追加] ボタンをクリックしてから [Todo] 項目を入力すると、ミニプログラムはログをSimple log Serviceログストアに直接アップロードします。 これにより、アプリケーションサーバーへのデータ転送またはデータ収集が不要になります。
検証とクリーニング
ソリューション検証
上記の手順を完了した後、ログをプレビューして、ログがSimple Log Serviceに収集されているかどうかを確認できます。
[消費プレビュー] パネルで、収集したログを表示します。
リソースクリーニング
この例では、ECS (Elastic Compute Service) インスタンス、Simple Log Serviceプロジェクト、ログストア、RAM (Resource Access Management) ユーザー、およびRAMロールが作成されます。 ソリューションの検証後、次の操作を実行してリソースを解放し、不要な料金やセキュリティリスクを回避できます。
ECSインスタンスをリリースします。 詳細については、「インスタンスのリリース」をご参照ください。
ログストアを削除してから、プロジェクトを削除します。 詳細については、「ログストアの管理」および「プロジェクトの管理」をご参照ください。
RAMユーザーとRAMロールを削除します。 詳細については、「RAMユーザーの削除」および「RAMロールの削除」をご参照ください。
次に何をすべきか
このトピックで使用されているミニプログラムは、コンピューターの開発者ツールを使用してのみデバッグされます。 ミニプログラムを正式に起動するには、次の操作を実行する必要があります。
開発者アカウントとミニプログラムを作成します。 次に、レビューのためにミニプログラムを提出します。 詳細については、「開発者アカウントの登録」をご参照ください。
開発者ツールで、ドメイン名の有効性チェックをスキップするために必要なオプションを選択します。 これにより、デバッグが容易になる。 詳細については、「アクセスの準備」をご参照ください。
Alipayコンソールで、ドメイン名ホワイトリストを設定します。
Simple Log Serviceサーバーのドメイン名またはリクエストの有効なドメイン名をホワイトリストに追加します。 ドメイン名は
https://${project}.${host}
形式です。project
は、使用するプロジェクトの名前を指定します。host
は、プロジェクトのエンドポイントを指定します。sls-webtracking-mini.cn-shanghai.log.aliyuncs.com
はこのトピックで使用されます。 詳細については、「サーバーのドメイン名ホワイトリスト」をご参照ください。ミニプログラムのアプリケーションサーバのドメイン名を追加します。 このトピックでは、ミニプログラムのクライアント側コードのみを提供します。 ミニプログラムを正式に起動するには、ミニプログラムのサーバー側コードを開発する必要があります。 ホワイトリストのドメイン名ではHTTPSのみがサポートされています。 HTTPSを使用するには、SSL証明書を関連サーバーにインストールする必要があります。 詳細については、「インストールの概要」をご参照ください。 この例では、ドメイン名の有効性チェックをスキップするオプションが開発者ツールで選択されています。 ミニプログラムを正式に起動する前に、チェックを設定する必要があります。
ミニプログラムからSimple Log Serviceにユーザーログを収集した後、次の操作を実行できます。
ログを照会および分析して、ユーザーの行動に関する洞察を得ます。 詳細については、「ログクエリと分析のガイド」をご参照ください。
クエリと分析の結果をダッシュボード、グラフ、およびサードパーティの視覚化ツールに表示します。 詳細については、「ビジュアライゼーションの概要」をご参照ください。
ユーザーの行動ログを分析して、ログオン試行の失敗、異常なアクセスモード、疑わしいデータリークなどの潜在的なセキュリティ脅威を検出します。 システムが前述の脅威を検出すると、アラートがトリガーされます。 これにより、セキュリティチームは、できるだけ早い機会に脅威に対応できます。 詳細については、「アラート機能の概要」をご参照ください。