Lambda関数間の呼び出し (Node.js)
AWS Lambda 関数から別の関数を呼び出す (Node.js)
AWS Lambda では、単一の関数内で複数の処理を実行するのではなく、複数の小さな関数を組み合わせて複雑なアプリケーションを構築することが推奨されています。このアプローチは、サーバーレスアーキテクチャの利点を最大限に引き出すための重要な要素です。
呼び出し方法
-
インラインコード
- Lambda関数のコード内で直接、別の関数を呼び出すことができます。
- この方法では、呼び出される関数のARN (Amazon Resource Name) を指定します。
const AWS = require('aws-sdk'); const lambda = new AWS.Lambda(); exports.handler = async (event) => { const params = { FunctionName: 'my-other-function', Payload: JSON.stringify({ message: 'Hello from the other side!' }) }; try { const response = await lambda.invoke(params).promise(); console.log(response); } catch (err) { console.error(err); } };
-
AWS SDK
- Node.jsの
aws-sdk
モジュールを使用して、Lambda関数を呼び出すことができます。 - この方法では、呼び出される関数のARNを指定します。
- Node.jsの
-
API Gateway
- API Gatewayを使用して、Lambda関数をREST APIとして公開し、他の関数がそのAPIを呼び出すことができます。
- この方法では、API Gatewayのエンドポイントを指定します。
考慮事項
- パフォーマンス
- エラー処理
- 同期呼び出し vs. 非同期呼び出し
- 同期呼び出しでは、呼び出し元の関数は呼び出される関数が完了するまで待機します。
- 非同期呼び出しでは、呼び出し元の関数はすぐに返され、呼び出される関数はバックグラウンドで実行されます。
活用事例
- マイクロサービスアーキテクチャ
- イベント駆動型処理
- ワークフロー
AWS Lambda 関数間の呼び出し (Node.js) のコード例
インラインコードによる呼び出し
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
exports.handler = async (event) => {
const params = {
FunctionName: 'my-other-function', // 呼び出される関数のARN
Payload: JSON.stringify({ message: 'Hello from the other side!' })
};
try {
const response = await lambda.invoke(params).promise();
console.log(response);
} catch (err) {
console.error(err);
}
};
Payload
に呼び出される関数に渡すペイロードを指定します。FunctionName
に呼び出される関数の ARN を指定します。invoke()
メソッドを使用して、指定された関数を呼び出します。AWS.Lambda()
で Lambda クライアントを作成します。
AWS SDK を使用した呼び出し
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
exports.handler = async (event) => {
const params = {
FunctionName: 'my-other-function',
Payload: JSON.stringify({ message: 'Hello from the other side!' })
};
lambda.invoke(params, (err, data) => {
if (err) {
console.error(err);
} else {
console.log(data);
}
});
};
invoke()
メソッドにコールバック関数を渡して、非同期呼び出しを行います。
API Gateway を使用した呼び出し
const AWS = require('aws-sdk');
const https = require('https');
exports.handler = async (event) => {
const options = {
hostname: 'your-api-gateway-endpoint',
path: '/your-path',
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
res.on('data', (d) => {
process.stdout.write(d);
});
});
req.on('error', (error) => {
console.error(error);
});
req .write(JSON.stringify({ message: 'Hello from the other side!' }));
req.end();
};
- API Gateway が呼び出される関数を呼び出し、結果を返します。
- API Gateway のエンドポイントとパスを指定して、HTTP リクエストを送信します。
Step Functions
- エラー処理
Step Functions はエラー処理の機能を提供し、失敗したタスクを再試行したり、別のパスに切り替えることができます。 - 状態マシンの定義
ステートマシンと呼ばれるグラフ構造を使用して、関数の呼び出し順序や条件分岐を指定します。 - ワークフローの管理
Step Functions を使用して、複数の Lambda 関数を連携させ、複雑なワークフローを定義することができます。
EventBridge
- デカップリング
EventBridge を介することで、関数の依存関係を緩くし、スケーラビリティと柔軟性を向上させることができます。 - ルールによるトリガー
ルールを作成して、特定のイベントパターンにマッチするイベントが発生した場合に Lambda 関数を呼び出します。 - イベント駆動型アーキテクチャ
EventBridge を使用して、さまざまなイベントソースからイベントを収集し、Lambda 関数をトリガーすることができます。
SNS (Simple Notification Service)
- 非同期処理
SNS は非同期メッセージ配信を提供するため、Lambda 関数はメッセージを受信したときにバックグラウンドで処理を開始します。 - Lambda 関数のトリガー
Lambda 関数を SNS のサブスクライバーとして登録し、メッセージを受信したときに呼び出すことができます。 - メッセージの配信
SNS を使用して、メッセージを複数のサブスクライバーに配信することができます。
SQS (Simple Queue Service)
- 負荷分散
SQS を使用することで、複数の Lambda 関数がメッセージを処理し、負荷を分散することができます。 - ポーリングによる処理
Lambda 関数が SQS のキューをポーリングし、メッセージを処理します。 - メッセージキュー
SQS を使用して、メッセージをキューに保存し、Lambda 関数が処理するまで待機させることができます。
node.js amazon-web-services aws-lambda