Edited at

Lambda Layersで共通パッケージを作る (ロギングを例にして)

AWS re:InventでリリースされたLambda Layersの機能を使うと、パッケージをLambda間で共有して使えます。

この楽さを試すために、例として、どんなLambdaからでも呼び出して使いそうな、CloudWatch Logsに固定のフォーマットでログ出力するパッケージ (命名: cwlogging) をLayer化してみます。

今回の前提はPython3.6です。


cwloggingを作る

作ります。よくあるやつです。logStrでログフォーマットを決めています。


cwlogging.py

import datetime

# Lambdaログ出力(CloudWatch Logs)関数
def logging(errorLv, lambdaName, errorMsg):
loggingDateStr=(datetime.datetime.now()).strftime('%Y/%m/%d %H:%M:%S')
logStr = loggingDateStr + " [" + errorLv + "] " + lambdaName + " " + errorMsg
# CloudWatch Logsに出力
print(logStr)
# ログ文字列を返却
return logStr



cwloggingをzip化

お作法に従う必要があります。

公式ドキュメントを読むと、pythonの場合は「python」ディレクトリを作って、その下に.pyを格納する必要があるようです。

先ほど作ったcwlogging.pyを以下のようにzip化して、s3にアップロードします。

$ mkdir python

$ mv cwlogging.py python/
$ zip -r cwlogging.zip python/
$ aws s3 cp cwlogging.zip s3://lambdalayertest/


Lambda Layersの作成

Lambdaの管理画面に行くと、左側に「Layers」が増えています。

「Layers」の管理画面から、s3上の.zipのパスを指定してアップロードすると、Layerが出来上がります。

今回アップロードしたLayerはimport cwloggingとすることで呼び出せます。


Lambda関数からLayerをimport

Lambda関数のコードは、テストなので簡単にいきます。

忘れずに import cwlogging を書いて、先ほどのLayerをインポートします。


lambda_function.py

import cwlogging

# lambda_handler
def lambda_handler(event, context):
# TODO implement
cwlogging.logging("INFO", "LambdaLayerTest", "This is test.")

return ''



Lambda関数からLayerを参照

Lambda関数の下に、Layerの参照状況を示す画面があります。

lambdalayer2.png

ここで「レイヤーの追加」を押して、Lambda関数とLayerを接続します。

lambdalayer1.png


Lambdaを実行する

Lambda関数からLayerを参照できるようにした後、Lambda関数を実行すると、以下の通りの結果となります。

Lambda関数からLayerを呼び出して処理できていることが分かります。

lambdalayer4.png

別のLambda関数からこのcwloggingを呼び出す時も、別のLambda関数の.zipに固めるのではなく、

同じようにLambda関数からLayerを参照できるようにして、コード内でimport cwloggingしてあげるだけで良いです。

Lambda Layersの登場で、どのLambda関数でも実行するような共通処理があれば、

その処理をLayer化することで、手軽に再利用できるようになりました。便利です。


参考文献

AWS Lambda Layers - AWS公式