Amazon Elasticsearch ServiceでWEBサイトへのアクセス数を分析してみた

記事タイトルとURLをコピーする

こんにちは、技術5課の長崎です。

Amazon Elasticsearch Service(以下、ES)で、WEBサイト内の各リンクに対してどれくらいアクセス数があるのかを分析して、最終的にkibanaで可視化したいなーと思ったのでやってみます。

ESとは

AWSのマネージドサービスとして、オープンソースソフトウェアであるElasticsearchを利用する事ができます。 Elasticsearchは、投入されたデータの分析及びkibanaを使った可視化を実現できます。

構成

f:id:swx-nagasaki:20210220111600p:plain

前提

  • WEBサーバ用のEC2インスタンスへCloudWatch Agentをインストールし、CloudWatch logsへのログ入力設定は完了済み

ESの作成

バージョンは最新のものとしておく事をおすすめします。 今回は、ネットワーク構成は「パブリックアクセス」とし、「細かいアクセスコントロール」を有効化してマスターユーザーとパスワードを設定してみました。(これが後のつまづきポイントとなります・・・)

f:id:swx-nagasaki:20210220113351j:plain

作成して、10~20分くらいでステータスがアクティブとなります。

CloudWatch logsのロググループにサブスクリプションフィルターとしてESを設定

対象のロググループを選択→[アクション]→[Elasticsearchサブスクリプションフィルターを作成]から設定できます。

Lambdaのロールは以下の権限が付与されている必要があります。

参考URL: CloudWatch Logs データの Amazon Elasticsearch Service へのストリーミング - Amazon CloudWatch Logs

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "es:*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:es:region:account-id:domain/target-domain-name/*"
        }
    ]
}

フィルターパターンで入力した内容でフィルタリングしてESへログがストリーミングされますので、事前にパターンをテストしておきましょう。 f:id:swx-nagasaki:20210220121938j:plain

最後に[ストリーミングを開始]をクリックします。

kibanaでログの可視化

ログインはESダッシュボードのURLをクリックする事でできます。 f:id:swx-nagasaki:20210220133113j:plain

ログインしたのは良いものの、kibanaでCloudWatch logsからストリーミングされているであろうログが確認できませんでした。 [クラスターの状態]タブを確認すると下記のようなエラーが出力されていました。。。 f:id:swx-nagasaki:20210220133347j:plain

権限が足りていないようです。 AWSマネジメントコンソールにログインしているIAMユーザーは[Administrator]権限で、ログを書き込むLambdaもESのフル権限を与えているはずだから問題ないはずなんだけどなーと色々調べていると原因は[細かいアクセスコントロール]を設定したところにありました。

つまづきポイント

  • [細かいアクセスコントロール]を有効化した場合はIAMポリシーによる権限付与の他にESクラスター側で権限付与の設定をしてあげなければいけないようです。

参考URL: でのきめ細かなアクセスコントロールAmazon Elasticsearch Service - Amazon Elasticsearch Service

kibanaコンソールから設定ができます。

1.コンソールの左ペイン[Security]から[internal user]を選択して、[Create internal user]でユーザーを作成します。この時のユーザー名は、権限を付与したいリソースのARNとします。IAMユーザーの場合IAMユーザーARN、IAMロールの場合ロールARNです。

f:id:swx-nagasaki:20210220130154j:plain

2.同様に左ペインから[Roles]からユーザーにマッピングするロールを選択する。(今回はall_accessロール)

f:id:swx-nagasaki:20210220130610j:plain

3.[Mapping user]でユーザーとロールを紐づけます。

f:id:swx-nagasaki:20210220130819j:plain

そうすると、先ほどのエラーは解消され、kibana上でCloudWatch logsからストリーミングされたログを確認する事ができました!

f:id:swx-nagasaki:20210220131733j:plain

それでは作業に戻りまして、

WEBサイトのリンクは全部で4つです。(各リンクのファイル名を以下に記載します)

  • test01.html
  • test02.html
  • test03.html
  • login.php

これらのリンクへのアクセス数の割合を円グラフにして可視化できました。

f:id:swx-nagasaki:20210220132315j:plain

まとめ

若干引っかかったところはあったものの本当に簡単にデータの分析、可視化をする事ができました。 S3やkinesisなどとも連携できます。データ分析にAmazon Elasticsearchを利用してみてはいかがでしょうか。

長崎 将太 (執筆記事の一覧)

クラウドインテグレーション部