前提
Meraki Scanning API 経由で取得した WiFi 位置情報を AWS へ保存する(API Gateway + Lambda + Dynamo DB)の設定が終わっていることが前提です。
全体の流れ
- 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 を選択。
4.「step2:クラスターの設定」では以下の通り入力して「次へ」をクリック。
- 「インスタンス数」: "1"
- 「インスタンスタイプ」:"t2.small.elasticsearch"
- 「専用マスターの有効化」:チェックせず
- 「ゾーン対応の有効化」:チェックせず
- 「ストレージタイプ」:EBS
- 「EBSボリュームタイプ」:汎用(SSD)
- 「ボリュームサイズ」:10
- 「自動スナップショットの開始時間」:19:00(UTC)
※ ボリュームサイズの最小値は10GB
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.「新しいイメージ - 変更後に表示される項目全体。」を選択し、「有効化」をクリック
5.stream ARN が表示されるのでメモっておく。
IAM ロールの作成
これから作成する Lambda 関数には次の二つの権限が必要となる:
- Amazon ES cluster に対するアクセス権限。これは index の新規レコードを submit するために必要
- DynamoDB stream に対する Read 権限
これらを満たす IAM ロールを以下の手順で作成する。
IAM ロールの新規作成(Lambda から CloudWatch へログ送信を許可)
1.AWS マネジメントコンソールにログインして IAM コンソールを開く
2.「ロール」>「ロールの作成」をクリック
3.「AWSサービス」>「Lambda」>「次のステップ:アクセス権限」をクリック
4."AWSLambdaBasicExecutionRole" にて検索。同名のポリシーが表示が検索結果として表示される(これは Lambda 関数がログを CloudWatch へ送ることを許可するポリシー)のでチェックを入れ、「次のステップ:確認」をクリック
5.「ロール名」に "dynamo2es-lambda-executor" と入力し、「ロールの作成」をクリック
IAM ロールへの権限追加(ES & DynamoDB stream に対するアクセス権限追加)
以下の手順で、上記で作成した IAM ロール "dynamo2es-lambda-executor" へ Amazon ES クラスタへのアクセス権限を追加する:
1.IAM コンソールから「ロール」> "dynamo2es-lambda-executor" をクリック
2.「インラインポリシーの追加」をクリック
3."Policy Generator" が選択されていることを確認し、「選択」をクリック
4.「アクセス許可の編集」では以下の通り入力:
- 「効果」:許可
- 「AWSサービス」:"Amazon Elasticsearch Service"
- 「アクション」:"AddTags" にチェックを入れる
- 「Amazon リソースネーム(ARN)」:(上記でメモした ES ドメイン ARN を入力 ※注1)
※注1)ARN の末尾には /* をつけること:
arn:aws:es:us-east-1:012345678901:domain/meraki-locations/*
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"
5.lambda 関数 "cmxreceiver-stream-to-es" が作成されるので、「設定」タブの中に以下の通り入力して「保存してテスト」をクリック
- 「コードエントリタイプ」:「コードをインラインで編集」
- 「ランタイム」:"Python 2.7"
- "lambda_function.py":(こちらの Python コードを張り付ける。張り付けた後で、ES_ENDPOINT の行の YOUR-ENDPOINT.eu-west-1.es.amazonaws.com をメモった「エンドポイント」へ変更する)
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" をクリック
5.kibana は自動的に最適と思われるデータ型を選択してくれる:
6.kibana で各種手順を行うとデータの可視化が可能(操作は省略)
結果のサンプルグラフ(RSSIの大きい順に端末MACアドレスを棒グラフで表示)
元ネタ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 でイベントソースを追加する