開発日誌
更新日 (2021/07/23)
Dynamodbを可視化グラフ化

Dynamodb上のデータをグラフ化するにはBIツールであるAmazon QuickSightやElasticsearchなどのサービスがあります。しかし、Amazon QuickSightでグラフ化するにはLambdaを使ってDynamoDBのデータをCSVに変換しS3に格納したりする必要があるため面倒です。なので今回はcloudwatchを使ってデータをグラフ化(可視化)したいと思います。

設定手順

①Dynamodbテーブルの作成

今回はデバイスの温度を管理するテーブルを作成し、データをグラフ化したいと思います。

 

- テーブル名: SensorTable

- プライマリキー: SensorID  数値型

- ソートキー: Time  文字列型

 

作成したSensorTableにデータを入れます。

■Dynamodb Streamの有効化

Dynamodb StreamとはDynamoDBに対する項目の追加、変更、削除をイベントとして検出できる機能です。

テーブルで DynamoDB Streams を有効にした場合、書き込む AWS Lambda 関数にストリーミングの Amazon リソースネーム (ARN) を関連付けることができます。テーブルの項目が変更されると、新しいレコードがテーブルのストリーミングに直ちに表示されます。AWS Lambda はストリーミングをポーリングし、新しいストリーミングレコードを検出したときに Lambda 関数を同期的にコールします。

公式より引用

②Lambdaの作成

 

 - 関数名(今回はput_cloudwatch)

 - ランタイム Python 3.8

画像4

これでLambda関数が作成されたと思います。関数を作成すると自動でロールが作成されます。しかし、このロールはCloudwatch logsの権限しかついていないためポリシーをつけ加えます。

下記2つのポリシーをアタッチする

- CloudWatchFullAccess

- AWSLambdaDynamoDBExecutionRole

トリガーの追加

最後にソースコードをDeployすればDynamodbをトリガーとするLamabda関数の完成です。

 

import json
import boto3

cloudwatch = boto3.client('cloudwatch')

def lambda_handler(event, context):
    
    SensorID = event['Records'][0]['dynamodb']['Keys']['SensorID']['N']
    Temperature = event['Records'][0]['dynamodb']['NewImage']['Temperature']['N']
    # print(Temperature)
    # print(SensorID)

    try:
        cloudwatch.put_metric_data(
        MetricData = [
            {
                'MetricName': 'SensorTable',
                'Dimensions': [
                    {
                        'Name': 'SensorID',
                        'Value': f'SensorID-{int(SensorID)}'
                    },
                ],
                'Unit': 'Count',
                'Value': int(Temperature)
            },
        ],
        Namespace = 'SensorTable'
        )
        
    except Exception as e:
        print('Error: Dynamodb error', e)
        print(e)

 

SensorTableにテーブルにデータを入れるとcloudwatchカスタムメトリクスが作成されているはずです。エラーが出た場合はCloudwatch logsを確認してみてください。

 

まとめ


今回はDynomodb上のデータをcloudwatchを利用してグラフを作成しました。cloudwatchで作成したことによりアラームの作成やほかサービスとの連携が簡単にできると思います。しかし、cloudwatchの料金は意外と高いため注意が必要です!

 

参考
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Streams.Lambda.Tutorial.html

 

cloudwatchの料金
https://aws.amazon.com/jp/cloudwatch/pricing/?nc1=h_ls