こんにちは、技術5課の長崎です。
Amazon Elasticsearch Service(以下、ES)で、WEBサイト内の各リンクに対してどれくらいアクセス数があるのかを分析して、最終的にkibanaで可視化したいなーと思ったのでやってみます。
ESとは
AWSのマネージドサービスとして、オープンソースソフトウェアであるElasticsearchを利用する事ができます。 Elasticsearchは、投入されたデータの分析及びkibanaを使った可視化を実現できます。
構成
前提
- WEBサーバ用のEC2インスタンスへCloudWatch Agentをインストールし、CloudWatch logsへのログ入力設定は完了済み
ESの作成
バージョンは最新のものとしておく事をおすすめします。 今回は、ネットワーク構成は「パブリックアクセス」とし、「細かいアクセスコントロール」を有効化してマスターユーザーとパスワードを設定してみました。(これが後のつまづきポイントとなります・・・)
作成して、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へログがストリーミングされますので、事前にパターンをテストしておきましょう。
最後に[ストリーミングを開始]をクリックします。
kibanaでログの可視化
ログインはESダッシュボードのURLをクリックする事でできます。
ログインしたのは良いものの、kibanaでCloudWatch logsからストリーミングされているであろうログが確認できませんでした。 [クラスターの状態]タブを確認すると下記のようなエラーが出力されていました。。。
権限が足りていないようです。 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です。
2.同様に左ペインから[Roles]からユーザーにマッピングするロールを選択する。(今回はall_accessロール)
3.[Mapping user]でユーザーとロールを紐づけます。
そうすると、先ほどのエラーは解消され、kibana上でCloudWatch logsからストリーミングされたログを確認する事ができました!
それでは作業に戻りまして、
WEBサイトのリンクは全部で4つです。(各リンクのファイル名を以下に記載します)
- test01.html
- test02.html
- test03.html
- login.php
これらのリンクへのアクセス数の割合を円グラフにして可視化できました。
まとめ
若干引っかかったところはあったものの本当に簡単にデータの分析、可視化をする事ができました。 S3やkinesisなどとも連携できます。データ分析にAmazon Elasticsearchを利用してみてはいかがでしょうか。