kibana
DynamoDB
lambda
meraki
ElasticsearchService

Meraki から取得して DynamoDB に保存した WiFi 位置情報を kibana で見る

前提

Meraki Scanning API 経由で取得した WiFi 位置情報を AWS へ保存する(API Gateway + Lambda + Dynamo DB)の設定が終わっていることが前提です。

image.png

全体の流れ

  • Amazon Elasticsearch Service の使用開始
  • DynamoDB テーブルの選択と DynamoDB streams の開始
  • IAM ロールの設定(ES&DynamoDB streams)
  • Lambda 関数の作成(※イベントソースマッピングを忘れないよう)
  • kibana の設定と可視化

Amazon Elasticsearch Service の使用開始

Amazon ES ドメインの作成

Amazon ES の開始にはドメイン作成が必要。

1.AWS マネジメントコンソールにログインして Amazon Elasticsearch Service コンソールを開く
2.「新しいドメインの作成」をクリック
3.「step1:ドメインの定義」では以下の通り入力して「次へ」をクリック

  • 「Elasticsearch ドメイン名」: "meraki-locations"
  • 「Elasticsearch のバージョン」:5.5

※ Amazon 公式チュートリアルによると最新が推奨とのこと。ここでは本日時点での最新 5.5 を選択。

AmazonES1.png

4.「step2:クラスターの設定」では以下の通り入力して「次へ」をクリック。

  • 「インスタンス数」: "1"
  • 「インスタンスタイプ」:"t2.small.elasticsearch"
  • 「専用マスターの有効化」:チェックせず
  • 「ゾーン対応の有効化」:チェックせず
  • 「ストレージタイプ」:EBS
  • 「EBSボリュームタイプ」:汎用(SSD)
  • 「ボリュームサイズ」:10
  • 「自動スナップショットの開始時間」:19:00(UTC)

※ ボリュームサイズの最小値は10GB

AmazonES2.png

5.Amazon ES へアクセスする端末のパブリックIPアドレスを調べる。Amazon 公式チュートリアルによると、Google で「私の IP アドレスは何ですか」と入力すると判明するとのこと。ここで調べた IP アドレスからのアクセスのみ許可するよう、次の項目で設定を行う。
6.「step3:アクセスの設定」では以下の通り入力して「次へ」をクリック:

  • 「ネットワーク構成」:「パブリックアクセス」を選択
  • 「ドメインアクセスポリシーの設定」:「特定のIPからのドメインへのアクセスを許可」を選択し、続いて現れる「IPアドレス」にパブリック IP アドレスを入力。

7.内容を確認して「確認」をクリック。新ドメイン作成には約10分を要する。
8.「ドメイン ARN」 及び 「エンドポイント」が表示されるのでメモっておく。

DynamoDB テーブルの選択

DynamoDB Streams を Enable にする

1.AWS マネジメントコンソールにログインして DynamoDB コンソールを開く
2.「テーブル」> "cmxdata" >「概要」タブを順にクリック
3.「ストリームの管理」をクリック
4.「新しいイメージ - 変更後に表示される項目全体。」を選択し、「有効化」をクリック
dynamobd1.png
5.stream ARN が表示されるのでメモっておく。

IAM ロールの作成

これから作成する Lambda 関数には次の二つの権限が必要となる:

  • Amazon ES cluster に対するアクセス権限。これは index の新規レコードを submit するために必要
  • DynamoDB stream に対する Read 権限

これらを満たす IAM ロールを以下の手順で作成する。

IAM ロールの新規作成(Lambda から CloudWatch へログ送信を許可)

1.AWS マネジメントコンソールにログインして IAM コンソールを開く
2.「ロール」>「ロールの作成」をクリック
3.「AWSサービス」>「Lambda」>「次のステップ:アクセス権限」をクリック
IAM1.png

4."AWSLambdaBasicExecutionRole" にて検索。同名のポリシーが表示が検索結果として表示される(これは Lambda 関数がログを CloudWatch へ送ることを許可するポリシー)のでチェックを入れ、「次のステップ:確認」をクリック
5.「ロール名」に "dynamo2es-lambda-executor" と入力し、「ロールの作成」をクリック

IAM ロールへの権限追加(ES & DynamoDB stream に対するアクセス権限追加)

以下の手順で、上記で作成した IAM ロール "dynamo2es-lambda-executor" へ Amazon ES クラスタへのアクセス権限を追加する:

1.IAM コンソールから「ロール」> "dynamo2es-lambda-executor" をクリック
2.「インラインポリシーの追加」をクリック

IAM2.png

3."Policy Generator" が選択されていることを確認し、「選択」をクリック

IAM3.png

4.「アクセス許可の編集」では以下の通り入力:

  • 「効果」:許可
  • 「AWSサービス」:"Amazon Elasticsearch Service"
  • 「アクション」:"AddTags" にチェックを入れる
  • 「Amazon リソースネーム(ARN)」:(上記でメモした ES ドメイン ARN を入力 ※注1)

※注1)ARN の末尾には /* をつけること:

arn:aws:es:us-east-1:012345678901:domain/meraki-locations/*

IAM4.png

5.「ステートメントの追加」をクリックすると上記入力に対応する行が追加される
6.続いて、以下の通り入力:

  • 「効果」:許可
  • 「AWSサービス」:"Amazon DynamoDB"
  • 「アクション」:(以下の4つにチェックを入れる)
    • "dynamodb:DescribeStream"
    • "dynamodb:GetRecords"
    • "dynamodb:GetShardIterator"
    • "dynamodb:ListStreams"
  • 「Amazon リソースネーム(ARN)」:(上記でメモした DynamoDB stream ARN を入力※注2)

※注2) stream ARN の例

arn:aws:es:us-east-1:012345678901:table/cmxdata/stream/2017-12-16T09:28:30.062

7.「ステートメントの追加」をクリックすると上記入力に対応する行が追加される
8.「次のステップ」をクリック
9.「ポリシーの適用」をクリック

Lambda 関数の作成

1.AWS マネジメントコンソールにログインして Lambda コンソールを開く
2.「関数の作成」をクリック
3.「設計図」にチェックを入れる
4.「基本的な情報」には以下の通り入力して「関数の作成」をクリック

  • 「名前」:cmxreceiver-stream-to-es
  • 「ロール」:「既存のロールを選択」
  • 「既存のロール」:"dynamo2es-lambda-executor"

lambda.png

5.lambda 関数 "cmxreceiver-stream-to-es" が作成されるので、「設定」タブの中に以下の通り入力して「保存してテスト」をクリック

  • 「コードエントリタイプ」:「コードをインラインで編集」
  • 「ランタイム」:"Python 2.7"
  • "lambda_function.py":(こちらの Python コードを張り付ける。張り付けた後で、ES_ENDPOINT の行の YOUR-ENDPOINT.eu-west-1.es.amazonaws.com をメモった「エンドポイント」へ変更する)

lambda2.png

6.イベントソースマッピングの設定を行うために CLI コンソールにログインする(GUIでの設定方法がわからなかったためです。すいません。。)
7.以下を実行する:

aws lambda create-event-source-mapping --region us-east-1 --function-name cmxreceiver-stream-to-es --event-source (上記で取得したstream arn) --batch-size 100 --starting-position TRIM_HORIZON --profile adminuser

Kibana で確認

1.AWS マネジメントコンソールにログインして Elasticsearch Service コンソールを開く
2."meraki-locations" > 「概要」を表示
3.Kibana の横のリンクをクリックすると別ウィンドウで Kibana が開く
※ 別ウィンドウで以下のエラーが出た場合には Elasticsearch の IPアドレスによるアクセス制限の設定が間違っている可能性がある。

{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: meraki-locations"}

4.kibana の画面が開いたら、以下の通り index に DynamoDB のテーブル名を入力する:

  • "index name" に "cmxdata" を入力
  • "Time Filter field name" に "I don't want to use the Time Filter" を選択
  • "Create" をクリック

kibana1.png

5.kibana は自動的に最適と思われるデータ型を選択してくれる:

kibana2.png

6.kibana で各種手順を行うとデータの可視化が可能(操作は省略)

結果のサンプルグラフ(RSSIの大きい順に端末MACアドレスを棒グラフで表示)
image.png


元ネタ1:AWS ElasticSearch & Kibana
元ネタ2:Indexing Amazon DynamoDB Content with Amazon Elasticsearch Service Using AWS Lambda
元ネタ3:Amazon Elasticsearch Service の使用開始 | ステップ 2: Amazon ES ドメインを作成する
元ネタ4:ステップ 3.2: AWS Lambda でイベントソースを追加する