はじめに
こちらの Lambda Layer と X-Ray - Qiita という記事で、X-Ray を Lambda Layer で組み込む方法が紹介されています。複数の lambda をデプロイする場合に、個別に X-Ray を組み込まなくても一発で付け外しができるので、けっこういい感じです。
けっこういい感じなんですが、すこしコマンドを叩くのが手間なので、CloudFormation 化できないかな、と思っていたところ AWS SAM CLI で Lambda Layers が ビルドできるようになったよ - Qiita という記事を見つけました。
というわけで、2つの記事の内容をガッチャンコしたら、こんなかんじで
X-Ray の LambdaLayer を CloudFormation で作れて楽チン!
という記事です。
なお、 X-Ray は、AWS Lambda で使えるトレーシングツールです。X-Ray を使うことで、「Lambda のどの部分で時間がかかっているか?」「どこのリソース (DynamoDB, S3, etc) 呼び出しで時間をくっているか?」を下の図のような感じで確認できるようになります。
(図の参照元: AWS X-Ray コンソール: - AWS X-Ray)
X-Ray な Lambda Layer のテンプレート定義
用意するのは、template.yaml の他には xray-layer-src/requirements.txt だけ で OK です。
template.yaml
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: CloufFormation Template X-Ray lambda layer sample
Resources:
# X-Ray の Lambda Layer 定義
XRayLayer:
Type: AWS::Serverless::LayerVersion
Properties:
Description: Lambda Layer for XRay
ContentUri: xray-layer-src
CompatibleRuntimes:
- python3.8 # ここは利用している Python のランタイムを指定
Metadata:
BuildMethod: python3.8 # sam-cli でビルド時に指定が必要
# XRayLayer を利用するラムダ定義の例
SomeFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: lambda/src/
Handler: lambda_handler.lambda_handler
Runtime: python3.8
Tracing: Active
Layers:
- !Ref XRayLayer # 作成した Layer の参照
xray-layer-src/requirements.txt
aws-xray-sdk
Lambda Layer に入れるライブラリの指定で、ここでは aws-xray-sdk のみを指定すれば OK です。
これで、X-Ray Lambda Layer のリソースが作成できます。デプロイは通常の sam を使うときと同じです。
sam build
sam deploy
X-Ray を利用する Lambda の例
X-Ray を利用するソースコードは、例えば次のようになります。
import ...
# XRay SDK をインポート。公式ドキュメントにあるように最後にインポートする必要あり
from aws_xray_sdk.core import patch_all
# boto3 などの関連ライブラリにまとめて X-Ray のパッチをあてる
patch_all()
def lambda_handler(event, context):
...