こんにちは!
サーバーワークスの松井です。 今回は、デバイスデータを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のアクティブトレースを有効化します。
デバイス内設定
環境に合わせた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が一直線で可視化できます。
実行時間やステータスについても確認することができます。
まとめ
X-Rayでローカルデバイスからデータベースへのデータ格納を監視・可視化できることを確認しました。 デバイスでデータを受信してからAWSに格納するまでの時間を確認したり、より軽い処理に根拠を持って改善していきたい場合に参考にしてみてください。