Lambda レイヤーは、Lambda関数コードから呼び出すライブラリを共通化できる仕組みです。個別にパッケージ化したライブラリを、別々のLambda関数から共通で利用することができます。Lambda は呼び出されたときに関数と一緒にLambdaレイヤーを読み込みます。
Lambdaレイヤーの便利なところ
複数の関数にわたってコードを再利用する
共通の機能をレイヤーに分離することによって、複数のLambda関数間で同じライブラリを共有しやすくなります。これにより、同じコードを別の場所に複製しまくったり、それらのアップデートやデバックが個別に行わなければならない問題がなくなります。
これまで、コードの複製を回避するための解決策としては、共通の機能を分離されたLambda関数として実装することでした。場合によっては、それが理想的な解決策となる可能性もあります。しかし、その実装方法の問題は、関数から関数へ追加の呼び出しが必要なことでした。場合によっては、関数を並行して実行する必要があり、関数の実行コストやデバッグの手間が増加していました。
レイヤーを使用すると、追加の関数呼び出しを行わずに共通ライブラリを共有できます。
関数のパッケージコードを小さく保つ
関数ごとに大規模なコードを書くと、アプリケーションの保守やテストがより困難になる可能性があります。デプロイも遅くなる可能性があります。
アプリケーションのパッケージを小さく保つために、レイヤーを使用すると、2 つ以上の関数で共通に使用される機能を分離できます。同じコードを複数回デプロイするのではなく、レイヤーは 1 回だけデプロイされます。
メイン機能の管理と展開を簡素化します
関数のパッケージを小さく保つことで、デプロイ時間が短縮されます。大規模な依存関係を使用する場合、メイン関数のコードは数メガバイトしかない場合がありますが、パッケージ全体では最大 50 MB になります。
これらの大きな依存関係はめったに変更されないため、それらをレイヤーとしてパッケージ化して 1 回だけデプロイすると、メイン関数が変更されるたびにデプロイする必要がなくなります。
Lambda Layerの実装方法
公式情報は以下のページに記載されています。
これをもとに、私が実施した内容のみ簡潔にまとめます。
Layerのコードは /opt 以下に展開されて、/opt以下のディレクトリはいくつかすでにPATHが通っています。
PythonのライブラリをLayerにするために /opt/python に展開するようにします。そうすると勝手に読み込んでくれます。
Layerにするコードの記述とzip化
Layerにするコードを以下のように書きます。
python/layer.py
def test():
return 'Layerの呼び出し成功!'
このコードをzipにします
$ zip -r layer.zip ./python
レイヤー作成、ZIPアップロード
Lambdaのコンソールから、メニューのレイヤーを選択し、右側の「レイヤー作成ボタン」を押下。

名前:レイヤーの名前「sample-layer」としました
説明:オプションなので書かなくてもOK
Zipファイル:先ほど作成したZIPファイルをアップロード
互換性のあるアーキテクチャ:今回は「x86_64」を使用
互換性のあるランタイム:実行するランタイム。今回は「Python3.10」「Python3.9」を選択
ライセンスオプション :今回は必要ないので未入力
[作成]ボタンを押せばレイヤーの作成完了
Lambda関数にLayerを追加する

レイヤーを使いたいLambda関数からLayerを選択し、「レイヤーの追加」を押下します。

今回は、自分でつくったレイヤーを関数に追加するのでレイヤーソースは「カスタムレイヤー」を選択し、カスタムレイヤーの中から追加するレイヤーを選択します。
レイヤーを追加する対象のlambda関数のランタイムに応じて、選択可能なレイヤーが変わります。
バージョンがあれば、バージョンを選択して「追加」ボタンを押下。
Lambda関数からLayerを呼び出す
作成したレイヤーはPythonのimportで呼び出せます。
sample-layer.py
import layer
def lambda_handler(event,context):
print('Lambda実行!')
return layer.test()
sample-layer.pyを実行すると
Lambda実行!
実行結果:
Layerの呼び出し成功!
Lambda Layerを試した流れをまとめました。同じような関数をたくさん作るってしまうことがないように、Layerを活用できるとよいと思います。
תגובות