Serverless Framework で作られる Lambda 関数のメモリは 1,024MB がデフォルトになっているので注意
問題点
AWS Lambda で関数を作る際のデフォルトのメモリは 128MB です。
Serverless Framework で同じ感覚でデフォルトのまま関数を作るとなんと 1,024MB になっています。
Lambda はいくらコストが低いとはいえ 8 倍のメモリが割り当てられるとその分のコストがかかってしまうので流石にもったいないです。
無料枠で収まっている間はいいのかもしれませんが…
ドキュメントにはもちろん各デフォルト値が記載されてはいるのですがここに気付くのはなかなか難しいのではないかと思います。(普通とりあえずデフォルトで実行しますよね?)
解決策
provider
で memorySize: 128
を指定します。
ついでに差し支えなければ architecture: arm64
も指定しておきましょう。
provider:
name: aws
region: ap-northeast-1
runtime: nodejs18.x
memorySize: 128
architecture: arm64
パフォーマンス
AWS SDK for JavaScript v3 経由で DynamoDB と SecretsManager にアクセスするだけの関数で 100-130MB のメモリを使うようなので実際は 128MB だと心もとないかもしれません。
また Lambda の場合 CPU やネットワークなどのスペックもメモリに比例するのでメモリが十分でもメモリ以外がボトルネックになってパフォーマンスが出ないことがあります。
ハイパフォーマンスが必要かは要件にもよりますし、要件になくてもパフォーマンスを上げることで実行時間が減りコストが下がることもあります。
適切な値は実測しつつ調整しましょう。
本家へ提案
個人的にはデフォルトが 1,024MB なのは無駄なコストが発生しがちで初心者泣かせだと思うので Issue を立ててみたんですが長年提案がなかったこと(誰も気にしてない?それともみんな気付いてない?もしくはパフォーマンスを考えると妥当?)やデフォルト値の変更は破壊的変更になるので受け入れてもらえませんでした。
ただ他にも意見があれば検討していただけるとのことなので気になる方は下記の discussion にリアクションかコメントしてみてください。
Discussion