AWS re:InventでリリースされたLambda Layersの機能を使うと、パッケージをLambda間で共有して使えます。
この楽さを試すために、例として、どんなLambdaからでも呼び出して使いそうな、CloudWatch Logsに固定のフォーマットでログ出力するパッケージ (命名: cwlogging
) をLayer化してみます。
今回の前提はPython3.6です。
cwloggingを作る
作ります。よくあるやつです。logStrでログフォーマットを決めています。
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をインポートします。
import cwlogging
# lambda_handler
def lambda_handler(event, context):
# TODO implement
cwlogging.logging("INFO", "LambdaLayerTest", "This is test.")
return ''
Lambda関数からLayerを参照
Lambda関数の下に、Layerの参照状況を示す画面があります。
ここで「レイヤーの追加」を押して、Lambda関数とLayerを接続します。
Lambdaを実行する
Lambda関数からLayerを参照できるようにした後、Lambda関数を実行すると、以下の通りの結果となります。
Lambda関数からLayerを呼び出して処理できていることが分かります。
別のLambda関数からこのcwlogging
を呼び出す時も、別のLambda関数の.zipに固めるのではなく、
同じようにLambda関数からLayerを参照できるようにして、コード内でimport cwlogging
してあげるだけで良いです。
Lambda Layersの登場で、どのLambda関数でも実行するような共通処理があれば、
その処理をLayer化することで、手軽に再利用できるようになりました。便利です。
参考文献
AWS Lambda Layers - AWS公式