💸

Serverless Framework で作られる Lambda 関数のメモリは 1,024MB がデフォルトになっているので注意

2022/11/22に公開

問題点

AWS Lambda で関数を作る際のデフォルトのメモリは 128MB です。
Serverless Framework で同じ感覚でデフォルトのまま関数を作るとなんと 1,024MB になっています。

Lambda はいくらコストが低いとはいえ 8 倍のメモリが割り当てられるとその分のコストがかかってしまうので流石にもったいないです。
無料枠で収まっている間はいいのかもしれませんが…

ドキュメントにはもちろん各デフォルト値が記載されてはいるのですがここに気付くのはなかなか難しいのではないかと思います。(普通とりあえずデフォルトで実行しますよね?)

https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/#general-function-settings

解決策

providermemorySize: 128 を指定します。
ついでに差し支えなければ architecture: arm64 も指定しておきましょう。

serverless.yml
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 やネットワークなどのスペックもメモリに比例するのでメモリが十分でもメモリ以外がボトルネックになってパフォーマンスが出ないことがあります。

https://aws.amazon.com/jp/blogs/news/operating-lambda-performance-optimization-part-2/

ハイパフォーマンスが必要かは要件にもよりますし、要件になくてもパフォーマンスを上げることで実行時間が減りコストが下がることもあります。
適切な値は実測しつつ調整しましょう。

本家へ提案

個人的にはデフォルトが 1,024MB なのは無駄なコストが発生しがちで初心者泣かせだと思うので Issue を立ててみたんですが長年提案がなかったこと(誰も気にしてない?それともみんな気付いてない?もしくはパフォーマンスを考えると妥当?)やデフォルト値の変更は破壊的変更になるので受け入れてもらえませんでした。
ただ他にも意見があれば検討していただけるとのことなので気になる方は下記の discussion にリアクションかコメントしてみてください。

https://github.com/serverless/serverless/discussions/11534

Discussion