aws-samples / aws-samples/serverless-full-stack-webapp-starter-kit

bug(db-migrator): Lambda のウォーム再利用時、初回呼び出し後にクローズ済みの DSQL プールが返る

Open
#219 2 comments 0 reactions 0 assignees View on GitHub
bug needs-triage
Dominant language
TypeScript
Stars
229
Forks
45
Avg merge
1m
Merged PRs (30d)
4

Description

### キットのバージョン / コミット

dev/v3 @ e3a3954

### 期待される挙動

DSQL マイグレータの Lambda ハンドラは、リトライやウォームな実行環境での再呼び出しを含め、毎回の呼び出しで正常に機能するデータベース接続を取得できるべきである。

### 実際の挙動

`packages/db/src/client.ts` は単一の `AuroraDSQLPool` をモジュールスコープでキャッシュしている。`apps/db-migrator/src/handler.ts` はそのシングルトンを取得し、`finally` 節で無条件に `await pool.end()` を呼ぶ。同一 Lambda 実行環境での 2 回目の呼び出し(リトライ、手動 invoke、あるいはウォームなサンドボックスの後続再利用)では、`getPool()` が既に終了済みのプールを返す。終了済みの `node-postgres` プールは新規接続を受け付けられないため、2 回目の呼び出しはマイグレーションが評価される前に失敗する。

### 問題が発生する条件

- マイグレータ Lambda が少なくとも 1 回呼び出されて完了している(成功・失敗を問わない)
- その後 AWS Lambda がウォームな実行環境を後続の呼び出しに再利用する(一時的失敗後のリトライ、またはマイグレーション再実行のための手動 invoke)

### 再現手順

1. `dev/v3` をデプロイする
2. 短時間のうちに DSQL マイグレータのハンドラを 2 回トリガーする(Custom Resource トリガーを強制的に再実行させる、または Lambda を手動で invoke する)
3. 2 回目の呼び出しが接続取得の時点でエラーになることを観測する

### 分析と修正案(任意)

根本原因: シングルトンのプールキャッシュが `pool.end()` 後に無効化されない。選択肢:

- 再利用可能なプールをハンドラ呼び出し間で保持する(`pool.end()` を呼ばない)
- プール終了時にモジュールレベルのキャッシュをクリアし、次回呼び出しで新しいプールを再構築する

回帰テスト: 単一の Node ランタイムインスタンス内でハンドラを 2 回呼び出し、両方が接続を取得できることをアサートする。v3 差分レビュー(executor 06 の発見 F-DB-01)で発見。

Contributor guide

Open the contributing guide

Research direction

Start with packages/db/src/client.ts and apps/db-migrator/src/handler.ts, tracing how the cached AuroraDSQLPool is obtained and ended. Reproduce the issue by invoking the handler twice in one Node runtime, then add the regression test described in the issue and verify that both invocations can acquire a connection.

Written by the indexing model from the issue text.

Assessment

Tech stack
aws, nodejs, typescript
Domain
backend, cloud, databases
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
78/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.