【アップデート】EventBridgeがX-Rayのトレースコンテキストの伝搬をサポートしました。
CX事業本部@大阪の岩田です。少し間が空いてしまいましたが3/2付のアップデートによりEventBridgeがX-Rayのトレースコンテキストの伝搬をサポートしました。
このアップデートにより、イベントドリブンなアプリケーションのトレーサビリティ向上が期待できます。早速試してみたので、簡単に内容をご紹介します。
やってみる
早速実際に試してみたいと思います。今回は
API GW → Lambda → EventBrdge → Lambda
という流れでAWSの各種サービスを連携させ、X-Rayのコンソールからトレース結果を表示してみます。
SAMテンプレート
各種リソースは以下のSAMテンプレートからデプロイしました。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: 'EventBridge with X-Ray Test' Globals: Function: Runtime: python3.8 Tracing: Active Layers: - <事前に登録しておいたX-Ray SDKを含むレイヤーのARN> Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: dev TracingEnabled: true EventPublishFunc: Type: AWS::Serverless::Function Properties: Handler: publisher.handler Policies: - EventBridgePutEventsPolicy: EventBusName: default Events: ApiEvent: Type: Api Properties: Method: get Path: / RestApiId: Ref: MyApi EventPublishFuncLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub /aws/lambda/${EventPublishFunc} EventConsumeFunc: Type: AWS::Serverless::Function Properties: Handler: consumer.handler Events: Invoked: Type: EventBridgeRule Properties: Input: '{"Key": "Value"}' Pattern: source: - "jp.classmethod.iwata.x-ray-test" EventConsumeFuncLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub /aws/lambda/${EventConsumeFunc} Outputs: MyAPIEndPointURL: Value: !Sub https://${MyApi}.execute-api.${AWS::Region}.amazonaws.com/dev
LambdaのコードでX-Ray SDKを利用しているので、事前にX-Ray SDKを含んだレイヤーをデプロイしておき、作成したレイヤーのARNをLayers
で指定します。レイヤーのデプロイ手順については割愛します。
Lambdaのコード
Lambdaのコードです。まずはAPI GWから起動されるLambdaです。
import json from aws_xray_sdk.core import patch_all import boto3 patch_all() client = boto3.client('events') def handler(event, context): res = client.put_events( Entries=[ { 'Source': 'jp.classmethod.iwata.x-ray-test', 'Resources': [], 'DetailType': 'X-Ray-Test', 'Detail': json.dumps({ 'key': 'val' }) } ] ) return { 'statusCode': 200, 'body': json.dumps(res) }
EventBridgeにイベントを送信してレスポンスを返却するだけの処理です。
続いてEventBridgeから起動されるLambdaです
def handler(event, context): print(event)
こちらは単にイベントデータをログに出力するだけの処理になっています。
動作確認
準備ができたのでデプロイして動作確認です。まずはSAMテンプレートのパッケージとデプロイ
$sam package --template-file sam.yml --s3-bucket <適当なS3バケット> --output-template-file output.yml $sam deploy --template-file output.yml --stack-name event-bridge-test --capabilities CAPABILITY_IAM
デプロイできたら作成されたAPI GWのエンドポイントに対してcurlでリクエストしてみます。
$curl https://<API GWのID>.execute-api.ap-northeast-1.amazonaws.com/dev {"FailedEntryCount": 0, "Entries": [{"EventId": "a4c242e7-4599-0ca8-181a-93d85475f870"}], "ResponseMetadata": {"RequestId": "f4efdfa4-5c4c-45d6-aee3-510d00187a8e", "HTTPStatusCode": 200, "HTTPHeaders": {"x-amzn-requestid": "f4efdfa4-5c4c-45d6-aee3-510d00187a8e", "content-type": "application/x-amz-json-1.1", "content-length": "85", "date": "Sat, 06 Mar 2021 06:51:22 GMT"}, "RetryAttempts": 0}}
正常にレスポンスが返却されてきました。X-Rayのコンソールを確認してみます。
ちゃんとトレースできていますね。ボトルネックの調査なども簡単に行なえそうです。
まとめ
EventBridgeを利用しているシステムにとっては非常にうれしいアップデートだと思います。これまでEventBridgeがX-Rayに対応していなかったためにX-Ray SDKを利用していなかった環境もあるかと思いますが、ぜひこの機会にX-Ray SDKの利用についてご検討下さい。