LoginSignup
6
8

More than 5 years have passed since last update.

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

Posted at

前提

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 でイベントソースを追加する

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8