top of page

AWS Lambda Layersで外部ライブラリを使う

更新日:2023年8月24日


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を活用できるとよいと思います。

0件のコメント

Comments


bottom of page