X-Ray+Lambda+DynamoDBでデバイスデータ収集を監視・可視化する

記事タイトルとURLをコピーする

こんにちは!

サーバーワークスの松井です。 今回は、デバイスデータをLambdaを通じてDynamoDBに格納するまでをX-Rayで監視し、可視化できるようにしたいと思います。

前提条件

  • デバイス・Lambda共にpython3.9

  • デバイス内にboto3、aws_xray_sdkをインストール済み

  • Lambdaをaws_xray_sdkを含んでデプロイしている

  • デバイスにLambdaの実行権限を付与したクレデンシャル情報が設定されている

事前準備

DynamoDBを作成

accept_dataという名前で、PK(パーティションキー)をidとしてDynamoDBを作成します。

Lambdaを設定

前提条件を満たしていることを確認してください。

コードは以下を記載したうえでデプロイします。

put-dynamodb.py

from aws_xray_sdk.core import patch_all 
 
import boto3 
 
dynamodb = boto3.resource('dynamodb') 
 
patch_all()  
 
 
def lambda_handler(event, context) -> None:
    items = []
    items.append(event)
    table = dynamodb.Table("accept_data")
    with table.batch_writer() as batch:
        for data in items:
            batch.put_item(Item=data)
 

Lambdaには、以下のIAMポリシーを付与しておきます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup"
            ],
            "Resource": "arn:aws:logs:ap-northeast-1:{AWSアカウントID}:*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:ap-northeast-1:{AWSアカウントID}:log-group:/aws/lambda/put-dynamodb:*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:BatchWriteItem"
            ],
            "Resource": "arn:aws:dynamodb:ap-northeast-1:{AWSアカウントID}:table/accept_data",
            "Effect": "Allow"
        },
        {
            "Action": [
                "xray:PutTraceSegments",
                "xray:PutTelemetryRecords",
                "xray:GetSamplingRules",
                "xray:GetSamplingTargets",
                "xray:GetSamplingStatisticSummaries"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

Lambdaの設定でX-Rayのアクティブトレースを有効化します。

f:id:swx-matsui:20220403163053p:plain

デバイス内設定

環境に合わせたX-Rayデーモンをインストールします。

AWS X-Ray デーモン - AWS X-Ray

Lambdaを呼び出し、X-Rayで監視するコードを用意しておきます。 

execute_lambda.py

import json
import boto3
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch 
 
patch(['boto3'])
client = boto3.client('lambda'). 
 
 
def main(event, context):
    data = {
                "id": "device_a",
                "data": [
                    {
                        "id": 0,
                        "temperature": 10
                    }
                ]
            }    
 
    #Lambdaを実行
    client.invoke(
        FunctionName='put-dynamodb',
        InvocationType='RequestResponse',
        LogType='Tail',
        Payload= json.dumps(data)
    ) 
 
    return
 
 
if __name__ == '__main__':
    xray_recorder.begin_segment("local-x-ray")
    main(None, None)
    xray_recorder.end_segment()
 

デバイスプログラム実行

インストールしたディレクトリにてコマンドを実行します。

$ ./xray -o -n ap-northeast-1

別タブを開いてプログラムを実行

$ python execute_lambda.py

結果確認

AWSのマネージメントコンソールでX-Rayの画面を確認します。

デバイスプログラムで指定した名前からDynamoDBが一直線で可視化できます。

f:id:swx-matsui:20220403162459p:plain

実行時間やステータスについても確認することができます。

f:id:swx-matsui:20220403162510p:plain

まとめ

X-Rayでローカルデバイスからデータベースへのデータ格納を監視・可視化できることを確認しました。 デバイスでデータを受信してからAWSに格納するまでの時間を確認したり、より軽い処理に根拠を持って改善していきたい場合に参考にしてみてください。