この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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の利用についてご検討下さい。