AWS Lambda での Node.js コードの作成 - AWS Lambda

AWS Lambda での Node.js コードの作成

Lambda が AWS X-Ray と統合され、Lambda アプリケーションのトレース、デバッグ、および最適化が可能になります。X-Ray を使用すると、フロントエンド API からバックエンドのストレージとデータベースまで、アプリケーション内のリソースを横断する際にリクエストをトレースできます。X-Ray SDK ライブラリをビルド設定に追加するだけで、関数が AWS のサービスに対して行う呼び出しのエラーとレイテンシーを記録できます。

X-Ray サービスマップには、アプリケーションからのリクエストのフローが表示されます。エラープロセッサ のサンプルアプリケーションの次の例は、2 つの関数を持つアプリケーションを示しています。プライマリ関数はイベントを処理し、エラーを返す場合があります。2 番目の関数は、最初のロググループに表示されるエラーを処理し、AWS SDK を使用して X-Ray、Amazon S3 と Amazon CloudWatch Logs を呼び出します。


          Service map showing nodes for Lambda functions, X-Ray, Amazon S3 and CloudWatch Logs

トレースヘッダーがないリクエストをトレースするには、関数の設定でアクティブトレースを有効にします。

アクティブトレースを有効にするには

  1. Lambda コンソール (関数ページ) を開きます。

  2. 関数を選択します。

  3. [AWS X-Ray] で、[アクティブトレース] を選択します。

  4. [Save] を選択します。

料金

X-Ray には期限なしの無料利用枠があります。無料利用枠のしきい値を超えると、X-Ray ではトレースのストレージと取得に課金されます。詳細については、「AWS X-Ray 料金表」を参照してください。

関数には、トレースデータを X-Ray にアップロードするためのアクセス許可が必要です。Lambda コンソールでアクティブトレースを有効にすると、Lambda によって関数の実行ロールに必要なアクセス許可が追加されます。それ以外の場合は、AWSXRayDaemonWriteAccess ポリシーを実行ロールに追加します。

X-Ray はサンプリングアルゴリズムを適用することで、トレースを効率的にしつつ、アプリケーションが処理するリクエストの代表的なサンプルを提供できるようにします。デフォルトのサンプリングルールは 1 秒あたり 1 回のリクエストおよび追加リクエストの 5 パーセントです。

アクティブなトレースが有効な場合、Lambda は呼び出しのサブセットのトレースを記録します。Lambda は 2 つのセグメントを記録し、サービスマップ上に 2 つのノードを作成します。最初のノードは、呼び出しリクエストを受信する Lambda サービスを表します。2 番目のノードは、関数のランタイムによって記録されます。


      単一の関数を持つ X-Ray サービスマップ。

ハンドラーコードを実装して、メタデータを記録し、ダウンストリームコールをトレースできます。ハンドラーが他のリソースやサービスに対して行うコールの詳細を記録するには、X-Ray SDK for Node.js を使用します。SDK を取得するには、アプリケーションの依存関係に aws-xray-sdk-core パッケージを追加します。

blank-nodejs/package.json

{ "name": "blank-nodejs", "version": "1.0.0", "private": true, "devDependencies": { "aws-sdk": "2.631.0", "jest": "25.4.0" }, "dependencies": { "aws-xray-sdk-core": "1.1.2" }, "scripts": { "test": "jest" } }

AWS SDK クライアントを実装するには、captureAWS メソッドで aws-sdk ライブラリをラップします。

blank-nodejs/function/index.js – AWS SDK クライアントのトレース

const AWSXRay = require('aws-xray-sdk-core') const AWS = AWSXRay.captureAWS(require('aws-sdk')) // Create client outside of handler to reuse const lambda = new AWS.Lambda() // Handler exports.handler = async function(event, context) { event.Records.forEach(record => { ...

次の例は、2 つのセグメントのあるトレースを示しています。どちらも my-function という名前ですが、1 つは AWS::Lambda 型で、もう 1 つは AWS::Lambda::Function 型です。関数セグメントを拡張して、そのサブセグメントを表示します。

最初のセグメントは、Lambda サービスによって処理される呼び出しリクエストを表します。2 番目のセグメントは、関数によって行われた処理を記録します。この関数セグメントには、3 つのサブセグメントがあります。

  • 初期化 – 関数のロードと初期化コードの実行にかかった時間を表します。このサブセグメントは、関数の各インスタンスによって処理される最初のイベントに対してのみ表示されます。

  • 呼び出し – ハンドラコードによって行われた処理を表します。コードをインストルメント化することにより、このサブセグメントを追加のサブセグメントで拡張できます。

  • オーバーヘッド – 次のイベントを処理する準備をするために Lambda ランタイムによって行われた処理を表します。

HTTP クライアントをインストルメントし、SQL クエリを記録し、注釈とメタデータからカスタムサブセグメントを作成することもできます。詳細については、AWS X-Ray 開発者ガイド の「X-Ray SDK for Node.js」を参照してください。

Lambda API でのアクティブトレースの有効化

AWS CLI または AWS SDK を使用してトレース設定を管理するには、以下の API オペレーションを使用します。

以下の例の AWS CLI コマンドは、my-function という名前の関数でアクティブトレースを有効にします。

$ aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active

トレースモードは、関数のバージョンの公開時にロックされるバージョン固有の設定に含まれます。公開後のバージョンのトレースモードを変更することはできません。

AWS CloudFormation でのアクティブトレースの有効化

AWS CloudFormation テンプレートで AWS::Lambda::Function リソースに対してアクティブトレースを有効にするには、TracingConfig プロパティを使用します。

function-inline.yml – トレース設定

Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

AWS サーバーレスアプリケーションモデル (AWS SAM) AWS::Serverless::Function リソースに、Tracing プロパティを使用します。

template.yml – トレース設定

Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...

ランタイム依存関係をレイヤーに保存する

X-Ray SDK を使用して AWS SDK クライアントをインストルメントする (関数コードを埋め込む) 場合は、デプロイパッケージが巨大になる可能性があります。関数コードを更新するたびにランタイムの依存関係をアップロードしないようにするには、それらを Lambda レイヤーにパッケージ化します。

以下の例では、X-Ray SDK for Node.js を保存する AWS::Serverless::LayerVersion リソースを示しています。

template.yml – 依存関係レイヤー

Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs12.x

この設定では、ランタイム依存関係を変更した場合にのみ、ライブラリレイヤーを更新します。関数デプロイパッケージには、コードのみが含まれています。関数コードを更新すると、デプロイパッケージに依存関係を含める場合よりもアップロード時間が大幅に短縮されます。

依存関係のレイヤーを作成するには、デプロイ前にレイヤーアーカイブを生成するようにビルドを変更する必要があります。実際の例については、blank-nodejs サンプルアプリケーションを参照してください。