AWS Lambda 関数の中身を AWS X-Ray でトレースするための準備

こんにちは、広野です。

AWS X-Ray をご存知でしょうか?

What is AWS X-Ray? - AWS X-Ray
Use AWS X-Ray to monitor the components and services that make up your cloud applications. X-Ray provides a detailed tra...

クラウド、特にサーバーレスサービスを組み合わせてアプリを開発すると、分散した数多くのリソース間で連携が行われます。

どのリソースが他のどのリソースと連携しているのか?どのリソースがボトルネックになっているのか?
そういったことを可視化してくれるサービスが 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 が異なるだけで。こちらも参考になるかと思います。

AWS Lambda (Python 3.12) で使用可能な pandas の Lambda Layer を準備する
データ分析や加工でよく使われるライブラリに、pandas があると思います。本記事では、AWS Lambda (Python 3.12) で動作する pandas の Lambda Layer を準備する手順を紹介します。

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 圧縮をかけています。

ERROR: The request could not be satisfied

AWS Lambda 関数の準備

作成した AWS Lambda 関数には、以下の作業が必要です。

  1. AWS Lambda Layer の紐づけ
  2. コード内で、AWS SDK を AWS X-Ray SDK でラップ
  3. AWS X-Ray のアクティブトレースをオン

AWS Lambda Layer の紐づけ

AWS 公式ドキュメントの通りです。AWS Lambda 関数に、必要な AWS Lambda Layer を設定するだけです。

Lambda レイヤーでの作業 - AWS Lambda
このセクションでは、AWS レイヤーを使用してアプリケーションコードを依存関係から分離する方法について説明します。

AWS SDK を AWS X-Ray SDK でラップ

AWS 公式ドキュメントの以下のページが参考になります。コード冒頭で各種ライブラリをロードするときに、AWS X-Ray SDK でラップさせるような書き方をしています。

AWS Lambda での Python コードの作成 - AWS Lambda
X-Ray トレースを使用して Python Lambda 関数の計測を行う方法について説明します。
AWS Lambda での Node.js コードの作成 - AWS Lambda
X-Ray トレースを使用して Node.js Lambda 関数の計測を行う方法について説明します。

AWS X-Ray のアクティブトレースをオン

AWS 公式ドキュメントの通りです。簡単な作業になります。

AWS Lambdaと使用するAWS X-Ray - AWS Lambda
AWS X-Ray を使用して、アプリケーションのコンポーネントの視覚化、パフォーマンスのボトルネックの特定、およびエラーの原因となったリクエストのトラブルシューティングを行うことができます。Lambda 関数はトレースデータを X-Ray...

ここまで設定できると、AWS X-Ray でトレースした情報の可視化ができるようになります。

まとめ

いかがでしたでしょうか?

AWS X-Ray の説明は省きましたが、AWS Lambda 関数側の準備作業はご理解頂けるのではないかと思います。

本記事が皆様のお役に立てれば幸いです。

タイトルとURLをコピーしました