created: 2018-11-24T03:47:49.000Z

Lambdaでcallbackを呼んでるのにタイムアウト扱いになる場合

lambdaはcallbackが呼ばれても、イベントループが残っていたらプロセスを待機させてしまう。使用しているライブラリがコネクションをポーリングしていたりすると、そのイベントループが延々残ってしまってプロセスが終了せず、その結果callbackを時間内に呼んでるのにタイムアウトエラーになってしまう状態が発生する

そういう場合はcallbackWaitsForEmptyEventLoopfalseにすればよい

async function f (
  event: APIGatewayEvent,
  context: Context,
  callback: Callback,
) => {
  context.callbackWaitsForEmptyEventLoop = false;
  callback(null, { statusCode: 200, body: response });
}

callbackWaitsForEmptyEventLoop デフォルト値は True です。このプロパティはコールバックメソッドのデフォルト動作を変更する場合にのみ使用できます。デフォルトでは、コールバックはイベントループが空になるまで待機してから処理を停止し、呼び出し元に結果を返します。このプロパティを false に設定して、イベントループにイベントがある場合でも、callback が呼び出されたすぐ後に処理を停止するように AWS Lambda にリクエストできます。

参考

古代ローマ人の24時間---よみがえる帝都ローマの民衆生活
[ad] 古代ローマ人の24時間---よみがえる帝都ローマの民衆生活
アルベルト・アンジェラ, 関口 英子 (単行本)