はじめに
ご無沙汰しております。うらさくと申します
この記事はTechCommit Advent Calendar 2023の6日目の記事です
連投になりますが頑張ります
概要
今のプロジェクトでLambda関数からLambdaLayerを呼び出す際、「LambdaLayerにはないけどLambda関数側にあるライブラリを呼び出せないか?」という要求がありました
そもそもなぜこんな事になっているかというと、Lambda関数+Layerで250MB制限を超えてしまったため、こちらの記事を参考に、EFSを使って回避していました
(※私も最初勘違いしていたのですが、Lambda単体ではなく、Lambda+Layer込で250MB以内じゃないといけないみたいです)
そうした構成にした場合に「LambdaLayerにはないけどLambda関数側にあるライブラリを呼び出す」という特殊なケースが出来上がりました
結論
使えます!
もちろんLambdaにEFSがマウントされている(もしくはLambda本体が持っている)場合のみです
仕組みとしては下記の公式の記載から読み取れます
関数にレイヤーを追加すると、Lambda は関数の実行環境の /opt ディレクトリにレイヤーのコンテンツを抽出します。ネイティブにサポートされているすべての Lambda ランタイムには、/opt ディレクトリ内の特定のディレクトリへのパスが含まれています。これにより、関数はレイヤーコンテンツにアクセスできるようになります。
つまり、「Layerを読み出す際は、Lambdaの実行環境上に物理的に抽出するから、Layer上にないライブラリでも実行元のLambdaが持ってれば実行できる」という感じです(わかりにくいかも笑)
まとめ
正直、運用として正しいのかと言われると結構怪しいと思っています
今回の場合EFSをマウントしていないLambdaから呼び出すとエラーになりますし、Layerとして公開している以上、利用側は何も気にすることなくLayer単品として利用できるというのがあるべき姿だと思います
ただ今回は小さいプロジェクトかつ、利用者も限られているということで暫定的にこの構成で運用しています
みなさんもLambdaの250MB制限に引っかかることはたまにあると思うので、何かの参考になれば幸いです
最後まで読んでいただきありがとうございました