Lambdaの関数を共通化する方法(Lambda Layerを使わないバージョン)

プログラミング

こんにちは!

本日はLambda Layerを使わずに複数のLambdaを共通化する方法を紹介していきます。

Lambdaを共通化する手法としてLambda Layerを使うという手もありますが、Layerは外部ライブラリを使用したりLambdaのバージョンを管理するツールなので用途が異なります。

Lambda Layerを使用するとWebのコンソール画面上でソースコードが編集できなくなるデメリットもあります。

今回はローカルPC上のファイル管理を工夫することでLambda Layerよりも手軽にLambdaを共通化できるようになりましたので皆さんにご紹介していきたいと思います。

また、他にも普段の生活で役立つテクニックをご紹介していますので興味のある方は以下のリンクからご覧ください。

共通化にはシンボリックリンクを使う

Lambda Layerを使わずに複数Lambdaの関数をを共通化したい際にはシンボリックリンクを使います。

シンボリックリンクとは特定のファイルのショートカットのようなもので作成するとそのシンボリックリンクで参照先に指定したファイルがまるでその位置にあるかのような振る舞いをしてくれます。

実際にシンボリックリンクを使う際のディレクトリ構成を記載していきます。

共通化をする際のディレクトリ構成

共通化を行う際には以下のようなディレクトリ構成にします。

今回はLambda AとLambda Bがあった際にその中の一部の関数を共通化したい場合の例を記載します

# ディレクトリ構成
- - common/   -- common.py(src_a.pyとsrc_b.pyの両方のlambdaで使用したい関数を記載)
 |
 |- lambda_a/ -- src_a.py
 |            -- common.py(common/common.pyのシンボリックリンク)
 |- lambda_b/ -- src_b.py
              -- common.py(common/common.pyのシンボリックリンク)

シンボリックリンクを使い上記の構成にするとsrc_a.pyとsrc_b.pyの両方からcommon.pyファイル内の関数が参照できます。

例ではPythonファイルを用いてますが、本来Pythonは同じディレクトリ内のPythonファイルしか参照できないためその弱点をシンボリックリンクで補い、各Lambdaのディレクトリ内にcommon.pyがあるように見せかけた形です。

シンボリックリンクを使えば元のcommon.pyをいじれば全てのlambdaディレクトリの下のファイルにも変更が反映されるため、コードのメンテナンスも楽です。

コードの書き方

# common.py
def common_function():
    return '共通化できたよ!!'

共通関数は共通関数をまとめて記載するファイルに切り出します。

# src_a.py

import common

def hander(event, context):
    message = common.common_function()
    print(message)

# 実行結果
# 共通化できたよ!!

共通関数を呼び出すファイルではファイルの先頭でimport文を書けばそのまま共通関数が使えます。

コードを書く際もとても簡単で便利です。

まとめ

複数Lambda間の共通関数ファイルを作る際にはローカル環境でシンボリックリンクを作成するのが有効です。

LambdaはAWS上ではリソースが別々の扱いになるため共通化に困っていた方は参考にしてください。

また、他にも普段の生活で役立つテクニックをご紹介していますので興味のある方は以下のリンクからご覧ください。

コメント