こんにちは、広野です。
AWS X-Ray をご存知でしょうか?
クラウド、特にサーバーレスサービスを組み合わせてアプリを開発すると、分散した数多くのリソース間で連携が行われます。
どのリソースが他のどのリソースと連携しているのか?どのリソースがボトルネックになっているのか?
そういったことを可視化してくれるサービスが AWS X-Ray です。名前の由来は文字通り X 線でレントゲン写真を撮ることから来ているのではないでしょうか。
多くのサービスは基本、簡単な設定だけで AWS X-Ray によるトレース対象にできるのですが、AWS Lambda はひと手間かけないとコードの中のトレースまではしてくれません。
本記事では、AWS X-Ray が AWS Lambda 関数の処理をトレースしてくれるようにするために必要な準備方法を紹介します。
やりたいこと
- AWS Lambda 関数コード内の処理を AWS X-Ray でトレースできるようにしたい。
実現方法
- AWS Lambda 関数内で AWS X-Ray SDK を import し、AWS SDK をラップする。
- 対象ランタイムは Python, Node.js とする。
- AWS X-Ray SDK は、AWS SDK とは異なり、AWS Lambda 環境には用意されていない。
自分で AWS X-Ray SDK を ZIP ファイルで作成する必要がある。 - AWS X-Ray SDK の ZIP ファイルは、AWS Cloud9 で作成する。
- 作成した ZIP ファイルを AWS Lambda 関数で import できるようにするため、AWS Lambda Layer に登録する。
- AWS Lambda 関数で作成した AWS Lambda Layer を関連付ける。
手順
この手順は、以下の記事とほぼ同じです。作成対象の SDK が異なるだけで。こちらも参考になるかと思います。
SDKの準備
AWS Cloud9 で、以下のコマンドを実行します。
Python
# pythonディレクトリを作成 mkdir python # pythonディレクトリに移動 cd python # aws-xray-sdk をインストール python3 -m pip install aws-xray-sdk -t . # 一段上のディレクトリに移動 cd .. # pythonディレクトリもろともZIP圧縮 = これがPython用AWS X-Ray SDK zip -r aws-xray-sdk-python.zip python # ZIPファイルを任意のS3バケットに転送 aws s3 cp ./aws-xray-sdk-python.zip s3://example-sdks-xxxxxx/sdk/Python/
Node.js
# nodejsディレクトリを作成 mkdir nodejs # nodejsディレクトリに移動 cd nodejs # aws-xray-sdk をインストール npm init npm install --save aws-xray-sdk # 一段上のディレクトリに移動 cd .. # nodejsディレクトリもろともZIP圧縮 = これがNode.js用AWS X-Ray SDK zip -r aws-xray-sdk-nodejs.zip nodejs # ZIPファイルを任意のS3バケットに転送 aws s3 cp ./aws-xray-sdk-nodejs.zip s3://example-sdks-xxxxxx/sdk/Node.js/
AWS Lambda Layer の登録
作成した ZIP ファイルを、AWS Lambda Layer として登録します。
AWS CloudFormation だと、以下のテンプレートになります。
AWSTemplateFormatVersion: 2010-09-09 Description: The CloudFormation template that creates sample resources for Lambda Layer. # ------------------------------------------------------------# # Input Parameters # ------------------------------------------------------------# Parameters: SystemName: Type: String Description: The system name. Default: xxxxx MaxLength: 10 MinLength: 1 S3BucketNameSdk: Type: String Description: S3 bucket name where SDKs are uploaded. (e.g. example-sdks-xxxxxx) Default: example-sdks-xxxxxx MaxLength: 50 MinLength: 1 S3KeyAwsXraySdkPython: Type: String Description: S3 key of aws-xray-sdk-python.zip. Fill the exact key name if you renamed. (e.g. sdk/Python/aws-xray-sdk-python.zip) Default: sdk/Python/aws-xray-sdk-python.zip MaxLength: 100 MinLength: 1 S3KeyAwsXraySdkNodejs: Type: String Description: S3 key of aws-xray-sdk-nodejs.zip. Fill the exact key name if you renamed. (e.g. sdk/Node.js/aws-xray-sdk-nodejs.zip) Default: sdk/Node.js/aws-xray-sdk-nodejs.zip MaxLength: 100 MinLength: 1 Resources: # ------------------------------------------------------------# # Lambda Layer # ------------------------------------------------------------# LambdaLayerAwsXraySdkNodejs: Type: AWS::Lambda::LayerVersion Properties: LayerName: !Sub example-${SystemName}-aws-xray-sdk-nodejs Description: !Sub aws-xray-sdk for Node.js to load in example-${SystemName} CompatibleRuntimes: - nodejs16.x - nodejs14.x - nodejs12.x Content: S3Bucket: !Ref S3BucketNameSdk S3Key: !Ref S3KeyAwsXraySdkNodejs LicenseInfo: Apache-2.0 LambdaLayerAwsXraySdkPython: Type: AWS::Lambda::LayerVersion Properties: LayerName: !Sub example-${SystemName}-aws-xray-sdk-python Description: !Sub aws-xray-sdk for Python to load in example-${SystemName} CompatibleRuntimes: - python3.9 - python3.8 - python3.7 Content: S3Bucket: !Ref S3BucketNameSdk S3Key: !Ref S3KeyAwsXraySdkPython LicenseInfo: Apache-2.0
AWS Lambda Layer に登録する ZIP ファイル内のパス構成は、ランタイムによって決まっています。そのため、モジュール構成ファイルを python や nodejs フォルダ内にインストールにコピーした後、フォルダもろとも ZIP 圧縮をかけています。
AWS Lambda 関数の準備
作成した AWS Lambda 関数には、以下の作業が必要です。
- AWS Lambda Layer の紐づけ
- コード内で、AWS SDK を AWS X-Ray SDK でラップ
- AWS X-Ray のアクティブトレースをオン
AWS Lambda Layer の紐づけ
AWS 公式ドキュメントの通りです。AWS Lambda 関数に、必要な AWS Lambda Layer を設定するだけです。
AWS SDK を AWS X-Ray SDK でラップ
AWS 公式ドキュメントの以下のページが参考になります。コード冒頭で各種ライブラリをロードするときに、AWS X-Ray SDK でラップさせるような書き方をしています。
AWS X-Ray のアクティブトレースをオン
AWS 公式ドキュメントの通りです。簡単な作業になります。
ここまで設定できると、AWS X-Ray でトレースした情報の可視化ができるようになります。
まとめ
いかがでしたでしょうか?
AWS X-Ray の説明は省きましたが、AWS Lambda 関数側の準備作業はご理解頂けるのではないかと思います。
本記事が皆様のお役に立てれば幸いです。