こんにちは。AWS X-Rayを仕事でお試し使用したのでご紹介したいと思います。
AWS X-Ray
AWS X-Rayはアプリケーションのパフォーマンスや動作をモニタリングできるサービスになります。AWS上で動作するLambda、EC2上のWebアプリケーションなどにAWS SDKを使用してコードを組み込み、それを元にモニタリングを行います。
公式ドキュメント
https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/aws-xray.html
プログラミング
Hello Worldレベルのモニタリングをしても面白くないので、今回はLambdaでDynamoDBからデータを取得して、平均値を計算して結果をファイルに書き出してS3にファイルをアップロードするプログラムを作成します。
DynamoDBに適当なデータを投入します。今回は2019年1月のドル円の始値と終値を使用しました。
テーブル名USDJPYで作成、CSVからデータ登録しました。
Lambda関数は、直接編集では作成できないので(aws-sdkを含める必要があるため)今回Cloud9で作成し、ダウンロードしてZIPファイルでLambdaにアップロードしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import json, datetime import boto3 from aws_xray_sdk.core import xray_recorder, patch, patch_all TABLE_NAME = "USDJPY" BUCKET = "test-ueda-public" KEY = "avg.txt" print('Loading function') def lambda_handler(event, context): patch_all() xray_recorder.begin_segment("main fn start") dynamoDB = boto3.resource("dynamodb") table = dynamoDB.Table(TABLE_NAME) res = table.scan() openSum = 0 closeSum = 0 i = 0 for row in res["Items"]: openSum = openSum + float(row["OPEN"]) closeSum = closeSum + float(row["CLOSE"]) i = i + 1 # print(openSum/i) # print(closeSum/i) content = "OpenAvg:" + str(openSum/i) + " CloseAvg:" + str(closeSum/i) s3 = boto3.resource("s3") obj = s3.Object(BUCKET, KEY) obj.put(Body=content) xray_recorder.end_segment() return {'statusCode': 200, 'body': json.dumps(res), 'headers': {'Content-Type': 'application/json'}} print('Finishing function') |
X-rayのログに出力するのは以下のコードになります。
1 |
xray_recorder.begin_segment("main fn start") |
1 |
xray_recorder.end_segment() |
また下記のコードにてAWS SDKのライブラリの使用時間が計測できます。
1 |
patch_all() |
Lambdaの設定で「デバッグとエラー処理」の「アクティブとレースを有効にします」にチェックします。
Lambda関数を実行します。
まずServiceMapと呼ばれるもの。
main関数からDynamoDB、S3とそれぞれ呼び出していることが分かります。
次にTraces。DynamoDB、S3のアクセスにどのくらい時間がかかっているか詳細に取れます。
処理が正常に動いてるかの確認します。S3を開いてファイルを確認します。
おわりに
今回は、AWS X-rayをLambda関数に適応して動作を確認しました。あらかじめ組み込んでLambda関数を作成しておけば、何かあったときX-rayを有効にして、解析したり、速度が遅い箇所の判定などに使用できそうです。