モバイルアプリは、モバイルインターネット技術の急速な発展に基づいてデータをアップロードするために使用されます。 モバイルアプリのログをSimple Log Serviceにアップロードするには、アプリのサーバーを介してログを転送する必要はありません。 以下のセクションでは、このタイプのアップロードサービスを直接データ転送と呼びます。 このトピックでは、モバイルアプリのログをSimple Log serviceにアップロードする直接データ転送サービスを構築する方法について説明します。
背景情報
プロキシベースのデータ転送
従来のプロキシベースのデータ転送ソリューションでは、モバイルデバイスからアップロードされたログを処理するためのトランジットステーションとしてアプリサーバーが使用されます。 モバイルアプリからのログの数が多い場合、またはモバイルデバイスの数が急速に増加する場合、単一のアプリサーバーの使用がデータアップロードのボトルネックになる可能性があります。
直接データ転送
AccessKeyペアをモバイルアプリのコードに書き込み、コードに基づいてモバイルアプリのログをSimple Log Serviceにアップロードできます。 これにより、AccessKeyペアが漏洩する可能性があります。 AccessKeyペアが漏洩した場合、Alibaba cloudアカウント内のクラウドサービスのセキュリティが脅かされます。 Security Token Service (STS) トークンを使用して、モバイルアプリのログに直接アクセスし、Simple Log Serviceにアップロードすることもできます。 STSトークンは、カスタム期間有効であり、必要なアクセス許可を定義します。
メリット
より高いアクセスセキュリティ: STSトークンを使用できます。 権限は、最小権限の原則に基づいて付与されます。
低コスト: 必要なアプリサーバーの数が少ないため、サーバーのコストが削減されます。
同時実行性が高い: 多数のユーザーが同時にサービスを使用できます。 より多くのアップロード帯域幅とダウンロード帯域幅がSimple Log Serviceによって提供されます。
自動スケーリング: Simple Log Serviceを使用すると、制限を課すことなくストレージ容量を増やすことができます。
プロセス
条件
ノード | 説明 |
AndroidアプリまたはiOSアプリ | ログを収集するユーザーのモバイルアプリ。 |
Simple Log Service | モバイルアプリからアップロードされたログを保存するSimple Log Service。 |
RAM/STS | 一時的な資格情報を生成するリソースアクセス管理 (RAM) またはSTS。 RAMとSTSを使用して、ユーザーIDとリソースへのアクセスを管理できます。 |
アプリサーバー | 一時的なアクセス資格情報を取得するために使用され、モバイルアプリからアップロードされたデータのメタデータを提供するサービス。 |
プロセスの説明
モバイルアプリは、アプリサーバーからSTSトークンを取得する要求を送信します。
アプリサーバーは、ログオンステータスや対称暗号化の結果などの実際の条件に基づいて、リクエストの有効性をチェックします。 リクエストがチェックに合格した場合、アプリサーバーは作成されたRAMユーザーのAccessKeyペアをアクセス資格情報として使用して、STSのAssumeRole操作を呼び出し、RAMユーザーが指定されたRAMロールを引き受けることを許可します。
STSは、AccessKeyペアの有効性をチェックし、RAMユーザーが指定されたRAMロールを引き受ける権限を持っているかどうかを確認します。 AccessKeyペアがチェックに合格し、RAMユーザーが検証に合格した場合、STSはトークンをアプリサーバーに返します。
app serverがSTSトークンを取得すると、STSトークンがモバイルアプリに返されます。
モバイルアプリはSTSトークンを取得した後、STSトークンをアクセス資格情報として使用して、ログをSimple Log Serviceに直接アップロードします。
Simple Log Serviceは、RAMまたはSTSを使用してSTSトークンの有効性をチェックし、指定されたRAMロールが指定されたLogstoreにアクセスする権限を持っているかどうかを確認します。 STSトークンがチェックに合格し、RAMロールが検証に合格した場合、Simple Log Serviceはモバイルアプリからのアップロード要求を処理し、アップロード結果をモバイルアプリに返します。
手順
手順1: Simple Log ServiceでプロジェクトとLogstoreを作成する
Simple Log Serviceコンソールにログインします。
プロジェクトを作成します。
[プロジェクト] セクションで、[プロジェクトの作成] をクリックします。
[プロジェクトの作成] パネルで、[リージョン] の [中国 (杭州)] を選択し、[プロジェクト名] のslstestprojectを指定して、他のパラメーターのデフォルト設定を保持します。
[作成] をクリックします。
ログストアの作成
プロジェクトの作成後、Logstoreを作成するように求められます。
[プロジェクトの作成] ダイアログボックスで、[ログストアの作成] をクリックします。
Logstoreの作成パネルで、Logstore名にslstestlogstoreを指定します。 次に、[課金モード] と [シャード] を設定し、ビジネス要件に基づいて [自動シャード] を有効にするかどうかを判断します。 詳細については、「シャードの管理」をご参照ください。
[OK] をクリックします。
手順2: RAMユーザーを作成し、RAMユーザーにRAMロールを引き受ける権限を付与
RAM コンソール にログインします。
RAM ユーザーを作成します。
左側のナビゲーションウィンドウで、[ID] > [ユーザー] を選択します。
[ユーザー] ページで、[ユーザーの作成] をクリックします。
[ユーザーの作成] ページで、[ログイン名] にramslsuserを指定し、[アクセスモード] セクションで [OpenAPIアクセス] を選択します。
[OK] をクリックします。
RAMユーザーが作成されると、システムはRAMユーザーのAccessKeyペアを自動的に生成します。 AccessKeyペアを記録し、AccessKeyペアを安全に保つことを推奨します。
説明RAMユーザーのAccessKeyペアを手動で作成することもできます。 詳細については、「AccessKey の作成」をご参照ください。
RAMユーザーにSTSのAssumeRole操作を呼び出す権限を付与します。
[ユーザー] ページで、ramslsuser RAMユーザーを見つけ、[操作] 列の [権限の追加] をクリックします。
[権限の追加] パネルで、[ポリシーの選択] セクションの [システムポリシー] をクリックします。 次に、AliyunSTSAssumeRoleAccessポリシーを見つけ、ポリシー名をクリックして、他のパラメーターのデフォルト設定を保持します。
[OK] をクリックします。
[完了] をクリックします。
手順3: RAMロールを作成し、RAMロールにリソースへのアクセスを許可する
RAM コンソール にログインします。
RAM ロールを作成します。
左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。
[ロール] ページで、[ロールの作成] をクリックします。
[ロールの作成] パネルで、[信頼できるエンティティの選択] で [Alibaba Cloudアカウント] を選択し、[次へ] をクリックします。
RAMロール名にramslsroleを指定し、信頼できるAlibaba Cloudアカウントの選択に現在のAlibaba Cloudアカウントを選択します。
[OK] をクリックします。
閉じるをクリックします。
RAMロールの作成後、[ロール] ページでramslsrole RAMロールを見つけ、RAMロールの名前をクリックします。 次に、RAMロールのAlibaba Cloudリソース名 (ARN) を表示および記録します。
[JSON] タブでカスタムポリシーを作成します。
左側のナビゲーションウィンドウで、[権限] > [ポリシー] を選択します。
[ポリシー] ページで [ポリシーの作成] をクリックします。
[ポリシーの作成] ページで、[JSON] タブをクリックします。
次のポリシードキュメントを入力し、[次へ] をクリックしてポリシー情報を編集します。
{ "Version": "1", "Statement": [ { "Action": [ "log:PostLogStoreLogs", "log:PutLogs" ], "Resource": "acs:log:*:*:project/slstestproject/*", "Effect": "Allow" } ] }
Nameにputlogspolicyを指定します。
[OK] をクリックします。
カスタムポリシーをRAMロールにアタッチします。
左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。
[ロール] ページで、ramslsrole RAMロールを見つけ、[操作] 列の [権限の追加] をクリックします。
[権限の追加] パネルで、[ポリシーの選択] セクションの [カスタムポリシー] をクリックします。 次に、putlogspolicyポリシーを見つけ、ポリシー名をクリックして、他のパラメーターのデフォルト設定を保持します。
[OK] をクリックします。
[完了] をクリックします。
手順3: アプリサーバーの構築
複数のプログラミング言語のサンプルプログラムが提供されます。 PHP、Java、Ruby、およびNode.jsでプログラムをダウンロードできます。
設定ファイル
この例では、各プログラムパッケージにconfig.jsonという名前のファイルが含まれています。 このファイルには、アプリサーバーの構成情報が含まれています。 config.jsonファイルを変更して、設定を変更できます。
{
"AccessKeyID" : "",
"AccessKeySecret" : "",
"RoleArn" : "",
"TokenExpireTime" : "900",
"PolicyFile": "policy/write_policy.txt"
}
パラメーター | 説明 |
AccessKeyID | RAM ユーザーの AccessKey ID。 |
AccessKeySecret | RAMユーザーのAccessKeyシークレット。 |
RoleArn | RAMロールのARN。 |
TokenExpireTime | モバイルアプリによって取得されたトークンの有効期間。 最小値: 900。 単位は秒です。 デフォルト値を保持できます。 |
ポリシーファイル | トークンの権限を記述するファイル。 デフォルト値を保持できます。 次のファイルは、トークンの権限を記述するために最も一般的に使用されます。 ファイルはポリシーディレクトリに保存されます。 ビジネス要件に基づいてファイルを構成することもできます。
トークンの権限は、RAMロールの権限とファイルに記載されている権限の共通部分です。 トークンの権限を記述するファイルを構成しない場合、RAMロールの権限がトークンの権限として使用されます。 |
サンプルコード
Java 1.7以降の場合は、プログラムパッケージをダウンロードして解凍した後にJavaプロジェクトを作成します。 必要な依存関係、コード、および設定をプロジェクトにコピーします。 次に、main関数を実行します。 デフォルトでは、プログラムはポート7080をリッスンし、HTTP要求を待ちます。 上記の操作は、別の言語のプログラムに対して実行できます。
手順5: 直接データ転送を使用してモバイルアプリからSimple Log Serviceにログをアップロード
STSトークンの取得
アプリサーバーのポート7080にアクセスするHTTPリクエストを開始し、STSトークンを取得します。 レスポンス例:
{ "StatusCode":"200", "AccessKeyId":"STS.3pdgagd****", "AccessKeySecret":"rpnwO9wr34tGdrddgsR2Y****", "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjR****tZGVtbzI=", "Expiration":"2021-11-20T08:23:15Z" }
モバイルアプリからSimple Log Serviceにログを直接アップロード
次のコードは、STSトークンを使用してモバイルアプリからSimple Log Serviceにログを直接アップロードする方法の例を示しています。
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( { // The following fields are required. projectName: projectName, logStoreName: logStoreName, logGroup: logGroup, }, function (err, data) { if (err) { console.log("error:", err); return; } console.log("success:", data); } );