Amazon Web Services ブログ

Amazon Elasticsearch Service、Amazon Kinesis Data Firehose、Kibana を使用してユーザーの行動を分析する

あなたは E コマースの会社で働いていて、顧客に最高のユーザーエクスペリエンスを提供したいと考えているとします。顧客は、アプリケーションの別のページでのリコメンデーションから製品ページに来るかもしれませんし、検索エンジンから移動してくるかもしれませ。経路に関わらず、顧客が本当に探しているページに確実にたどり着けるようにしたいと考えています。ただし、すべての顧客が同じ経路をたどるわけではありません。どのようにアプリケーションにアクセスしているのか、どのような場所からアクセスしているのか、その他多くの属性に依存します。パターンを分析して決定するには、貴重なデータが豊富に含まれているログを確認する必要があります。

このブログ記事では、Apache ウェブサーバーのログにアクセスしてユーザーの行動を分析し、実用的な洞察を得る方法について説明します。

このブログでは、以下の AWS のサービスを使用しています。

アーキテクチャの概要

以下のアーキテクチャ図は、このソリューションの概要を示しています。

ここでは、アーキテクチャのコンポーネントについて詳しく説明します。

  1. EC2 インスタンス上の Apache ウェブサーバー– ここが、ウェブアプリケーションがホストされている場所です。Apache のアクセスログには、以下のような貴重なデータが含まれています。
    • ページにアクセスしているクライアントの IP アドレス
    • ユーザーが使用している OS やブラウザなどの属性を取得するために使用できるユーザーエージェントのデータ
    • アクセスされているページ
    • ユーザーを特定のページに導いたページ (リファラ)

Kinesis エージェントを使って Apache のアクセスログを調べます。次に、JSON 形式に変換して、Kinesis Data Firehose 配信ストリームに送付します。

  1. Kinesis Data Firehose –Kinesis Data Firehose データ配信ストリームは、データを Amazon ES ドメインに配信します。この配信ストリームは、5MB または 60 秒のいずれか早い方のデータをバッファリングするように設定されています。ストリームは、データを Amazon ES ドメインに配信します。また、失敗したレコードの S3 バケットへのバックアップも行います。
  2. AWS Lambda – ログファイルから取り込まれたデータを処理および強化して、分析します。Apache ログファイルには、ユーザーの IP アドレス、ユーザーエージェント、およびユーザー属性を決定するために処理できるその他の重要な詳細などのフィールドが含まれています。IP アドレスの geo-ip 検索を行って、ユーザーの場所を調べます。ユーザーエージェントをデコードすると、使用されているプラットフォーム (OS、ブラウザ) を理解することができます。インライン Lambda 関数を使ってログデータを処理し、分析のために Amazon ES ドメインに取り込む前に強化します。ZIP 形式の Lambda 関数の Python 3.6 コードパッケージを S3 バケットからダウンロードします。このパッケージには、実際の Lambda 関数が Lambda.py ファイルに含まれています。
  3. Amazon ES – Amazon ES は着信データにインデックス付けを行い、分析できるようにします。Amazon ES ドメインに取り込まれたデータを分析するために、Amazon ES に統合されている Kibana を使用します。
  4. Amazon Cognito – Amazon Cognito を使用して、Kibana でユーザーを認証します。

スタックのデプロイ

AWS CloudFormation を使用してセットアップ全体をデプロイします。次のサービスが利用可能な AWS リージョンであれば、スタックをデプロイできます。

  • Kinesis Data Firehose
  • Amazon Cognito
  • Amazon Elasticsearch Service
  • AWS Lambda

CloudFormation スタックをデプロイする前に、以下のリソースを作成します。

  • 少なくとも 1 つパブリックサブネットを持つ VPC
  • EC2 SSH キー
  • Firehose 配信ストリームから、失敗したレコードを収集する S3 バケット

CloudFormation スタックを起動するには、下の [Launch Stack] を選択します。

下で説明する適切なパラメータ値を、それぞれに入力します。

Stack name – CloudFormation スタック名の値を入力します。

VPC for Webserver deployment – ウェブサーバー EC2 インスタンスをデプロイするために使用する VPC。

Public Subnet for Webserver deployment– ウェブサーバー EC2 インスタンスをデプロイするために使用するパブリックサブネット。

SSH Keypair for the Webserver – ウェブサーバー EC2 インスタンスに関連付ける EC2 SSH キーペア。

Base AMI ID– この値はそのままにします。テンプレートが、選択したリージョンに基づいて最新の Amazon Linux 2 AMI 識別子を取得します。

S3 bucket for failed records– 失敗したレコードを書き込む S3 バケットの名前。

Kibana User Id– Kibana にアクセスするためのログイン認証情報として使用されるユーザー ID。

Temporary Kibana Password – Kibana にログインするための一時パスワード。8 文字以上にする必要があります。

CloudFormation スタック作成ウィザードの指示に従い、すべてのデフォルト値は変更しないでください。最後のページで、[I acknowledge that AWS CloudFormation might create IAM resources with custom names] のオプションにチェックを入れてあることを確認してから、[Create] を選択します。

スタックが作成された後、スタックからの出力で次の値を記録しておきます。これらの値は後で使用します。

  1. KibanaHTTPURL
  2. WebserverHTTPURL

次に、Kibana にログインし、マッピングを含むインデックスを作成して、インデックスへのデータの取り込みを開始します。これを行うには、次の手順を実行します。

  1. CloudFormation スタック出力から書き留めた HTTP リンクを使用して Kibana にアクセスします。
  2. CloudFormation スタックにパラメータとして指定した認証情報 (ユーザー ID とパスワード) を使用してログインします。
  3. 次の画面で、新しいパスワードを入力します。8 文字以上にする必要があります。Kibana のホームページに移動します。
  4. インデックスを作成します。そのために、[Dev Tools] を選択してから、[Get to work] を選択します。この画面は、通常は、この機能に初めてアクセスしたときにだけ表示されます。
  5. コンソールで、次の 2 つのコマンドを実行します。
    • この手順で、すでに作成されている場合は apache_logs インデックスが削除されます。
      DELETE /apache_logs
    • この手順では、access_logs というマッピングを持つ apache_logs という新しいインデックスが作成されます。Kinesis Data Firehose 配信ストリームが、このインデックスに書き込みます。マッピングにより、緯度と経度のフィールドは geo_point 形式で読み込まれ、datetime フィールドは適切な日時形式で読み込まれます。
PUT apache_logs
{
    "settings" : {
        "index" : {
            "number_of_shards" : 10,
            "number_of_replicas" : 0
        }
    },

  "mappings": {
    "access_logs": { 
      "properties": { 
        "agent":    { "type": "text"  },
        "browser":    { "type": "keyword"  },
        "bytes":    { "type": "text"  },
        "city":    { "type": "keyword"  },
        "country":    { "type": "keyword"  },
        "datetime":    { "type": "date","format":"dd/MMM/yyyy:HH:mm:ss Z"  },
        "host":    { "type": "text"  },
        "location":    { "type": "geo_point"  },
        "referer":    { "type": "text"  },
        "os":    { "type": "keyword"  },
        "request":    { "type": "text"  },
        "response":    { "type": "text"  },
        "webpage":    { "type": "keyword"  },
        "refering_page":    { "type": "keyword"  }

      }
    }
  }
}

Kibana でデータを視覚化できるように、ウェブサイトでトラフィックを生成します。これを行うには、ウェブサイトの設定方法を理解する必要があります。このウェブサイトは、6 つのプレースホルダーページで構成されています。最初にサイトにアクセスすると、main.php ページに移動します。ここから、検索ページまたはリコメンデーションページに移動することができます。これらのページのどちらもリファラとして使用され、最終的に製品ページのいずれかのページに移動します。ここでは、「echo」、「kindle」、「fire tvstick」の 3 つの製品の製品ページがあります。検索ページとリコメンデーションページのどちらからも、いずれかの製品ページに移動して戻ることができます。これらのページは、ウェブサイトへのトラフィックを生成するためにだけ使用されるプレースホルダページであり、生成されたデータを Kibanaで分析することができます。

下の図に、そのセットアップを示します。

ウェブサイトでのトラフィックの生成を開始するには、CloudFormation スタック出力 WebserverHTTPURL として提供されているリンクにアクセスします。リンクを開くと、main.php ページに移動します。ここから、検索ページまたはリコメンデーションページに移動し、そこから製品ページのいずれかに移動することができます。また、これらのページ間を行き来することもできます。複数のユーザーをシミュレートするには、分析を開始するのに十分なデータが得られるように、複数のブラウザとデバイスを複数回試してみます。

Amazon ES ドメインにデータを取り込んだら、Kibana でインデックスパターンを作成します。以下の手順を実行します。

  1. Kibana のホームページに移動し、[Management] を選択します。
  2. インデックスパターンとして「apache_logs」と入力し、[Next step] を選択します。
  3. 次の画面で [Time Filter] フィールド名として「datetime field」を選択し、[Create index pattern] を選択します。

これで、このデータを分析し、視覚化を使用してパターンを見つけることができます。データが Amazon ES ドメインに保存されるまでに、数分かかることがあります。Kinesis Data Firehose 配信ストリームを通じてバッファされ、Lambda 関数によって処理されます。

以下のように、様々な役割を持つ人々がこのデータを使ってパターンを特定し、対処可能な洞察を得る方法を確認することができます。

営業チーム – 営業チームは、特定の場所の人が特定の製品にもっと関心があるかどうかを知る必要があるかもしれません。Amazon ES は、[location] フィールドの値に基づいて、調整可能なマップにログの行からのイベントを表示することができます。変換 Lambda 関数では GeoIPを使ってその情報をログの各行に追加したことを思い出してください。営業チームは、Apache ウェブログの [location] フィールドを使用して、最大の関心を示している地域を特定することができます。Elasticsearch の検索機能を使用すると、見ている URL (詳細ページ) に基づいて表示されるトラフィックを絞り込むことさえできます。

これを行うには、次の手順でマップベースの視覚化を行います。

  1. Kibana のホームページで、[Visualize] を選択します。
  2. プラス記号を選択して、新たに視覚化を行います。
  3. [Maps] の下で「Coordinate Map」タイプの視覚化を選択します。
  4. 次の画面で、apache_logs インデックスを選択します。
  5. 画面の右上隅にある時間間隔を、データを視覚化する時間間隔に変更します。
  6. [Metrics] の値は Count のままにします。
  7. [Buckets] では、「Geo Coordinates」を選択します。[Aggregation] は、「Geohash」を選択します。[Field] を「 location」に設定します。
  8. ページの上部でフィルタを追加して、関心がある製品のウェブページだけを探します。下のスクリーンショットでは、「firetvstick」を選んでいます。

  1. [Options] タブの [Base Layer Settings] で、[Layers] を「road_map」に設定してから、[Apply changes] を選択します。

  1. [Apply Changes] ボタンを選択します。
  2. このスクリーンショットにある視覚化は、英国の人の方が、インドの人と比較して「firetvstick」のページをより多く見ていることを示しています。データによっては、異なる結果が得られる可能性もあります。

マーケティング – マーケティング担当者は、特定の OS やブラウザを使用してアプリケーションにアクセスするユーザーが、特定の製品を閲覧する可能性が高いかどうかを知りたい場合があります。マーケティング担当者は、このデータを使用して、明らかになった条件に基づいて他のいくつかのウェブサイトに広告を公開するかもしれません。Kibana はネストした円グラフを表示できます。最も内側のリングはウェブページであり、それぞれのウェブページは OS とブラウザに細分されています。これにより、マーケティングチームはどの製品がどの OS やブラウザで人気があるのかを知ることができます。

  1. Kibana のホームページで、[Visualize] を選択します。
  2. プラス記号を選択して、新たに視覚化を行います。
  3. [Basic Charts] で、視覚化のタイプとして [Pie] を選択します。
  4. 画面の右上隅にある時間間隔を、データを視覚化する時間間隔に変更します。
  5. [Metrics] では、Slice Size の値は Count のままにします。
  6. [Bucket] で、[Aggregation] として「Terms」、[Field] として「webpage」を選択します。
  7. [Group other values in separate bucket] チェックボックスにチェックを入れます。
  8. [Label for the other bucket] として Other を指定します。

  1. 今度は、サブバケットの追加を選択して、上記と同じ手順を繰り返しますが、今回は [Field] で「os」を選択します

  1. もう一度サブバケットの追加を選択し、上記と同じ手順を繰り返しますが、今回は [Field] で「browser」を選択します。

  1. ページの上部でフィルタを追加して、関心がある製品のウェブページだけを探します。下のスクリーンショットでは、「firetvstick」、「echo」、「kindle」の 3 つすべてを選択しています。
  2. [Options] タブで、[Donut] と [Show Top Level only] のチェックボックスを外します。
  3. [Apply Changes] ボタンを選択します。

  1. スクリーンショットにある視覚化のデータからは、「kindle」の製品ページは主に Windows OS および Firefox ブラウザから閲覧されていることが明らかです。これに対して、「Echo」と「FireTVStick」は、主に Android と Windows からアクセスされています。データによっては、異なる結果が得られる可能性もあります。

アプリケーションチーム – アプリケーションチームは、必要に応じて 2 つの機能のいずれかを調整できるように、検索やリコメンデーションによってさらに多くの人がページにアクセスするかどうかを知りたいと考えています。アプリケーションチームは、縦棒グラフ、折れ線グラフ、またはここで選択したヒートマップなど Kibana の視覚化のいくつかを使用することができます。

  1. Kibana のホームページで、[Visualize] を選択します。
  2. プラス記号を選択して、新たに視覚化を行います。
  3. 視覚化のタイプとして [Basic Charts] で「Heat Map」を選択します。
  4. インデックスとして apache_logs を選択します。
  5. [Metrics] の値は Count のままにします。
  6. [Buckets] の下の X-Axis では、[Aggregation] として「Terms」、[Field] として「refering_page」を選択します。
  7. [Group other values in separate bucket] チェックボックスにチェックを入れます。
  8. [Label for the other bucket] として Other を指定します。

  1. ここで、サブバケットの追加を選択します。バケットのタイプ「Y-Axis」を選択します。
  2. [Sub Aggregation] として「Terms」を選択します。[Field] として「webpage」を選択します。
  3. [Group other values in separate bucket] チェックボックスにチェックを入れます。
  4. [Label for the other bucket] として Other を指定します。

  1. [Options] タブで、[Show Labels] にチェックを入れます。
  2. ページの上部でフィルタを追加して、関心がある製品のウェブページだけを探します。下のスクリーンショットでは、「firetvstick」、「echo」、「kindle」の 3 つすべてを選択しています。
  3. [a­pply changes] ボタンを選択します。

  1. スクリーンショットにある視覚化からは、「kindle」のページは検索ページを通じてのみアクセスされているのに対して、「firetvstick」のページは主にリコメンデーションページを通じてアクセスされていることが明らかです。データによっては、異なる結果が得られる可能性もあります。

クリーンアップ

データの可視化が終了したら、AWS CloudFormation を使用して作成したすべての AWS リソースをクリーンアップします。次の手順で、クリーンアップを行います。

  1. 選択したリージョンの Amazon Cognito ユーザープールコンソールで、aes_kibana_demo_userpool ユーザプールを選択し、プールに関連付けられたドメインを削除します。

  1. Kinesis Data Firehose 配信ストリームから失敗したレコードを保存するために指定した S3 バケットに移動し、aes-kibana-demo-failed のプレフィックスが付いていっるすべてのオブジェクトを削除します。
  2. 次に、CloudFormation スタックを削除します。

結論

このブログでは、Apache アクセスログのデータを使用して視覚化を行い、ユーザーの行動を把握する方法を見てきました。営業、マーケティング、アプリケーションの各チームは、こうした洞察に基づいて販売を促進し、ユーザーエクスペリエンスを向上させることができます。さまざまなユースケースに対して Kibana が提供しているさまざまな視覚化タイプを使用すると、他にも多くのタイプの視覚化を行うことができます。

また、同様のソリューションを使用して、あらゆるタイプのログを分析して処理することができます。つまり、取り込みおよび分析したいデータであれば、すべて分析および処理することができます。他のタイプのデータを分析するソリューションを調整し、サンプルのストリーミングデータを生成するには、Amazon Kinesis Data Generator を使用できます。詳細については、Allan MacInnis のブログ記事「Test your Streaming Data Solution with the New Amazon Kinesis Data Generator (新しい Amazon Kinesis Data Generator を使用してストリーミングデータソリューションをテストする)」を参照してください。

このブログ記事についてご意見がありましたら、このページのコメントエリアをご利用ください。


著者について

Ninad Phatak は、Amazon Internet Services Private Limited. のビッグデータソリューションアーキテクトです。 彼は、顧客がデータ処理、分析、ビジネスインテリジェンスのニーズを満たすために、AWS でビッグデータソリューションを構築するのを支援しています。