辻僚真

X-rayによるLambda関数の処理の可観測性向上

AWS X-rayとは

複数の独立した処理のトレースと可視化を行うためのサービスです。
特にマイクロサービスやECS、Lambda、API Gatewayなどのサーバーレスアーキテクチャで、エラーや遅延の発生個所の特定に用いられます。

検証環境について

今回の検証では最小構成として下記サービスを利用しました。

【利用サービス】
・API-Gateway:APIの作成・管理・保護・監視などを行うことができるサービス
・Lambda   :イベント駆動、手動実行、API Gateway経由でPython、 C#等の実行が可能なサービス
・DynamoDB :NoSQLデータベースサービス

【処理内容】
1.ユーザーがAPI-Gatewayで設定されたAPIのパスへリクエストを送信する。
2.リクエストをトリガーにLambdaが処理を実行する。
  処理内容はリクエストとともに指定したIDに一致するDynamoDBの値を取得する処理としました。
3.X-rayが処理状況の可視化を行う。

【API gateway】

【Lambda】

plaintext
import boto3
import sys
sys.path.append('/opt')
import layer
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Xray_test_dynamodb_table')
def Xray_test_lambda_function(item_id):
    response = table.get_item(
        Key={
            'id': item_id
        }
    )
    return response.get('Item')
def lambda_handler(event, context):
    item_id = event.get("queryStringParameters", {}).get("id")
    if not item_id:
        return {
            'statusCode': 400,
            'body': 'イベント入力にid無し'
        }

X-rayの画面

X-rayを有効化して処理を実行すると処理のサービスマップと各処理の所要時間を確認することができます。

【サービスマップ】
Lambda Context:Lambdaサービスの内部処理
Lambda Function:コードが実行される処理全体

【セグメントのタイムライン】
AWS::Lambda     :Lambdaが呼び出された瞬間から処理完了までの全体的な時間
AWS::Lambda::Function :実際のコードを実行している時間
AWS::DynamoDB::Table  :DynamoDBのアクセス時間

ユースケース

下記のような遅延の原因特定が難しい場合に遅延箇所を視覚化できます。
・マイクロサービスの連携が複雑な場合
・サーバーレス構成(API Gateway→Lambda→DynamoDB等)

モニタリングツールとしてよく利用されるものにCloudWatchがありますが下記のような違いがあります。
Cloudwatch:ログの出力、アラート発信
       CPUやメモリの利用状況等リソース状態の集計
X-ray    :リクエスト毎の全サービスの処理の流れ、経過時間を自動で可視化
       サービスマップ表示

感想

サーバーレスサービスの各処理のつながりを視覚的に理解でき、処理の構造を整理するきっかけになりました。
今回最小構成を意識しコードに関数を1つしか記載しなかっのですが、複数の関数を記載した場合のX-ray検証を行った方が全体の可視化の流れがより分かりやすくなったのではと思いました。