AWS CDKのNodejsFunctionでsource mapを使う

2022.02.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

課題

NodejsFunction、TSをバンドルしてデプロイまでシュッとやってくれてめっちゃ便利。 けど、trace logががsource map効いてなくて/var/task/index.js:73679:5ってなってしまう。

対策

以下のように設定する。 (追記の通り、とくに本番環境では推奨されません。)

new NodejsFunction(this, 'lambda-function', {
  environment: {
    NODE_OPTIONS: '--enable-source-maps',
  },
  bundling: {
    sourceMap: true,
  },
});

2022-03-07追記

以下の記事の通り、現在--enable-source-maps NODE_OPTIONS を使用すると、nodeの実行パフォーマンスが著しく落ちます。

NODE_OPTIONS=–enable-source-mapsを有効化したらLambdaのコールドスタートが1.5秒から5.3秒まで悪化した話

このパフォーマンス問題はnodejs自体の問題です。

対策2で示すとおり、lambdaのコードに追記して対応するのが良さそうです。

対策2

対策1はパフォーマンス問題の懸念があるためこちらが推奨されます。

1. source-map-supportをインストールする。

npm i source-map-support
npm i -D @types/source-map-support

or

yarn add source-map-support
yarn add -D @types/source-map-support

2. lambdaのhandlerの先頭に以下の記述を追加する。

import 'source-map-support/register'

3. cdkのNodejsFunctionを以下のように設定する。

new NodejsFunction(this, 'lambda-function', {
  bundling: {
    sourceMap: true,
  },
});

余談

AWS CDKにissue立ててPRも出してたけど、同じ理由でお蔵入りするなどした。CloudWatch Logsのソースマップサポートが待たれるなぁ。。。