【アップデート】EventBridgeがX-Rayのトレースコンテキストの伝搬をサポートしました。

イベントドリブンなシステムのトレーサビリティが向上するアップデートです
2021.03.06

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の利用についてご検討下さい。