前提
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 を選択。
![AmazonES1.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F104747%2F30c51908-1628-b02c-930d-1f335451fa8f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=711fa2ca8223cfdd828600cebd8f5e2f)
4.「step2:クラスターの設定」では以下の通り入力して「次へ」をクリック。
- 「インスタンス数」: "1"
- 「インスタンスタイプ」:"t2.small.elasticsearch"
- 「専用マスターの有効化」:チェックせず
- 「ゾーン対応の有効化」:チェックせず
- 「ストレージタイプ」:EBS
- 「EBSボリュームタイプ」:汎用(SSD)
- 「ボリュームサイズ」:10
- 「自動スナップショットの開始時間」:19:00(UTC)
※ ボリュームサイズの最小値は10GB
![AmazonES2.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F104747%2Fe4faaf7c-2100-f5a3-a90c-13d97351337a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=71eb50724bfcbcdb13ab20fb18b1a925)
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.「インラインポリシーの追加」をクリック
![IAM2.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F104747%2F87d2347e-ba16-ebc9-cb66-f59ba15138e9.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=441edf2cd2d39f7b2f7b7ba2120078f7)
3."Policy Generator" が選択されていることを確認し、「選択」をクリック
![IAM3.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F104747%2Fe8e956e3-9525-e278-116a-364986f3edac.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2328c3abd045833570efd75048ff65fe)
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](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F104747%2F03878c7f-87d0-d4f1-5fc8-cfc846a76071.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=8983b7e982b800c97c79e8445c3fc950)
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](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F104747%2F5486b2b5-2992-20ab-4f4c-dc886cb4231f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=192e178a7443a7802ceda004bbabe128)
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](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F104747%2F1b6f0bb3-f310-68d3-75f1-18e82e2c2d9e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=faef25048980ed6059f346b8c2ddd41f)
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](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F104747%2Fae560e65-4e93-598a-60be-aba6bb5da471.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=30ba76a264df1c9dff41b550d2c12b41)
5.kibana は自動的に最適と思われるデータ型を選択してくれる:
![kibana2.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F104747%2Fd5ae0264-e36c-0a88-6564-37c1f169c66d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=be836bc88937b8beb7c35ed1cc8f7e17)
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 でイベントソースを追加する