開発日誌
更新日 (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