Lambda Layerに配置したデータをServerless Frameworkで使う
Lambdaの環境変数でそこそこ大きなデータを管理していて、環境変数の最大サイズ4KBに引っかかったため、データをLambda Layerで管理することにした。
Uploadするファイル
code:files.zip
├── file1.json
└── dir/file2.txt
zipのファイル名は何でも良い。
頻繁に更新するならIaCを頑張れば良いが、1回しか上げないようなデータであれば手でLayerを作ったほうが効率が良い。
(この手の議論はどれだけIaCに拘るか、によるものなので深掘りはしない。)
Serverless FrameworkでLayerをLambdaにAttachするためには、例えば以下のように書く。
code:serverless.yml
functions:
webapi:
handler: src/api.proxyRouter
layers:
- arn:aws:lambda:${opt:region}:${opt:accountId}:layer:${layerName}:1
Lambdaの/optにzipで固めたファイルが展開される。
ランタイムからは、普通にfsで読み取ることができる。
code:Lambda
const file1 = String(fs.readFileSync('/opt/file1.json));
const file2 = String(fs.readFileSync('/opt/dir/file2.txt));
機械学習のモデルや各種定義ファイル、電子証明書や電子鍵などもLayerで管理すると、データのサイズを (あまり) 気にしなくて良くなり、例えばS3にデータを配置してダウンロードしたりCacheしたりする手間が無いので便利だ。ただしLayerで管理するファイルのサイズが大きいとLambdaのコンテナ初期化のオーバーヘッドが大きくなる気はする。どの程度なのかは未検証。