この記事は Lambda の Runtime が Node16 以下でSDK for JavaScript v3
を AWS SAM でデプロイする方法について記述しています。
Node18以降はv3に対応しているので、v3で書かれたソースだけをデプロイしても動きます。代わりに、Node18以降でv2で書いている場合はv2のSDKをソースに含めてデプロイする必要があります。
プロジェクトをsam init
で作成した場合、ルートパスでデプロイするとtemplate.yaml
や__tests__
などのファイルもアップロードされてしまい見た目が悪いです。そのためtemplate.yaml
でCodeUri
を指定すると思います。
SampleFanction:
Type: AWS::Serverless::Function
CodeUri: src/
このようにすると、v3のSDKがsam build
の対象に含まれなってしまいます。この場合はpackage.json
をCodeUri
で指定したパスのルートに置くことでビルドに含まれるようになります。
SAMルート
|- __tests__
|- events
|- src
| |- handlers
| | |- program.js
| |- package.json
|- template.yaml
...
↓ ビルド後
SAMルート
|- .aws-sam
| |- build
| | |- SampleFanction
| | | |- handlers
| | | | |- program.js
| | | |- package.json
| | | |- node_modules
| | |- template.yaml
| |- build.toml
node_modulesがビルドに含まれるようになりました。
Node.jsは実行中のファイルと同じ階層にnode_modules
ディレクトリがあるか検索し、無ければ親ディレクトリとルートのパスまで遡りnode_modules
ディレクトリを探してインポートします。
Loading from node_modules folders
Lambda Layerがベストプラクティスかもしれませんが。