【AWS】Lambda Layersで自作モジュールをレイヤー化する方法

こんにちは、ウヤルームのうや(@uyaroom)です!
今回はAWS関連の技術記事です。

Lambda Layersで自作モジュールをレイヤー化する方法についてご紹介します。

はじめにLambda Layersとは何か、そのメリットについてご紹介します。
その後、Lambda Layersで共通モジュールをレイヤー化する方法についてご紹介します。

注意
本記事はPythonの使用を前提に書いています。ご了承ください。

Lambda Layersはモジュール共有機能

一言で言うと、Lambda間でモジュールを共有する機能です。
2018年のre:Inventで発表されました。

Lambda Layersの利点

Lambdaで外部モジュールを使う場合、Lambda Layersが発表される前は作成した関数と一緒に外部モジュールをzip化してlambda関数として登録する必要がありました。

Lambda Layersを使うと外部モジュールと関数をそれぞれ独立してLambdaにアップロードすることができます。

外部モジュールと関数をそれぞれ独立してLambdaにアップロードすることによって2つのメリットがあります。

  • 自作モジュールをLambda Layersに置いて共通モジュールとして使い回せる
  • モジュールの容量が大きい場合でもインラインコード編集ができる。

自作モジュールをLambda Layersに置いて共通モジュールとして使い回せる

Lambda LayersはLambda間でモジュールを共有できる機能です。
このモジュールは外部のモジュールだけでなく、自作のモジュールも対象です。
そのため、よく使う関数などをLambda Layers化することで、すべてのLambdaから呼び出すことができます。

モジュールの容量が大きい場合でもインラインコード編集ができる。

Lambdaのコンソール画面にはコードの編集・確認ができるインラインコード編集という機能があります。

しかし、コードの容量が多い場合、次のような警告が表示されてインラインコード編集ができなくなります。見覚えのある方も多いと思います。

Lambda 関数 「〇〇」のデプロイパッケージが大きすぎて、インラインコード編集を有効にできません。ただし、関数を呼び出すことはできます。

だいたいの原因はLambda関数として登録した外部モジュールの容量が大きいためです。

Lambda Layersは外部モジュールと関数を独立して管理するので外部モジュールの容量によってインラインコード編集ができなくなることはありません。

Lambda Layersで自作モジュールをレイヤー化する方法

前置きが長くなりましたが、ここから本題に入ります。
Lambda Layersで自作モジュールをレイヤー化する方法はとっても簡単です。

  1. レイヤー化したい関数(func_sample)が書かれたPythonモジュール(layer.py)を作成する
  2. layer.pyをpythonという名前のディレクトリに格納する
  3. pythonという名前のディレクトリをzip化してコンソール画面からLambda Layersにアップロードする

手順の2つ目が最重要です。
Lambda Layersにアップロードされたモジュールは/optの領域に展開されます。
そのため、pythonという名前のディレクトリにPythonモジュールを格納してアップロードすることでLambdaを実行した際にモジュールとして自動的に読み込むことができます。

私はこのディレクトリ名を別の名前にしていたため、1時間ほどハマりました。。

ぜひLambda Layersで自作モジュールをレイヤー化してみては

今回はLambda Layersで自作モジュールをレイヤー化する方法についてご紹介しました。
自作モジュールをレイヤー化して全Lambdaで共有する構成は、まだ流行っていないもののかなり便利だと思います。

私もLINE Bot開発などで作成していた共有関数をまとめてレイヤー化してみたいと思います。

最後までご覧いただきありがとうございました。
LINE Bot開発の記事「LINE Botでゴミ出し通知システムつくってみた」もあわせてどうぞ。

LINE Botでゴミ出し通知システムつくってみた

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です