はじめに
Lambda Layersを用いることで、モジュールを共通ライブラリとして、複数のLambdaで使用できるようなので、PythonとNode.jsのパターンで方法をまとめます。
メリットとして、Lambdaのソースコードの量を減らすことができること、各Lambdaごとにモジュールをアップする手間がなくなることがあげられます。
Lambda Layersについて
Lambda レイヤーは、追加のコードやデータを含めることができる .zip ファイルアーカイブです。レイヤーには、ライブラリ、 カスタムランタイム 、データ、または設定ファイルを含めることができます。レイヤーを使用すると、コードの共有と責任の分離を促進し、ビジネスロジックの記述をより迅速に繰り返すことができます。
自作モジュールのディレクトリ構造
Lambda Layersにアップロードされたモジュールは、/optの領域に展開されます。
そのため、指定されたディレクトリ(下記の表参照)にPythonモジュールを格納してアップロードすることでLambdaを実行した際にモジュールとして自動的に読み込むことができます。
各 Lambda ランタイムのレイヤーパス
言語
パス
Node.js
nodejs/node_modules
〃
nodejs/node14/node_modules (NODE_PATH)
Python
python
〃
python/lib/python3.9/site-packages (サイトディレクトリ)
モジュールを作成 [Node.js]
today.js
module.exports = {
today: () => {
const dateUTC = new Date();
// JSTに変更後、タイムスタンプに変える
const dateJST = new Date(dateUTC.getTime() + 32400000);
// タイムスタンプを日付の年月日に変える。時間は切り捨て
let year = dateJST.getFullYear();
let month = dateJST.getMonth()+1;
let day = dateJST.getDate();
// 値が1桁であれば '0'を追加
if (month < 10) month = '0' + month;
if (day < 10) day = '0' + day;
//"2022-01-16"
const result = year + "-" + month + "-" +day;
return result;
}
};
day_after
module.exports = {
days_after: (days_after_number) => {
const dateUTC = new Date();
// days_after_number日分、進める
const days_after_UTC = new Date().setDate(dateUTC.getDate() + days_after_number);
const days_after_JST = new Date(days_after_UTC + 32400000);
let days_after_year = days_after_JST.getFullYear();
let days_after_month = days_after_JST.getMonth()+1;
let days_after_day = days_after_JST.getDate();
if (days_after_month < 10) days_after_month = '0' + days_after_month;
if (days_after_day < 10) days_after_day = '0' + days_after_day;
const result = days_after_year + "-" + days_after_month + "-" + days_after_day;
return result;
}
};
上記の2つのファイルを自作モジュールとして使用します。
ローカルで、ディレクトリを作成し、モジュールファイルを入れて、zip化します。
$ mkdir nodejs
$ cd nodejs
$ mkdir node_modules
$ cd node_modules
$ pwd
/nodejs/node_modules
node_modulesディレクトリ内に、today.jsとdays_after.jsを入れます。
nodejs
└── node_modules
├── days_after.js
└── today.js
zip化します。zip名は何でも良いですが今回は、nodejs_layerという名前でzip化します。
$ zip -r nodejs_layer nodejs
モジュールを作成 [Python]
pythonの方は、複数のロジックを1つのファイルにまとめることができます。
python_layer.py
from datetime import datetime, timedelta
def today():
# 2022-01-16 20:54:05.134159
dateJST = datetime.today() + timedelta(hours=9)
# 2022-01-16
today = dateJST.strftime("%F")
return today
def days_after(days_after_number):
dateJST = datetime.today() + timedelta(hours=9)
days_after_JST = dateJST + timedelta(days=days_after_number)
days_after = days_after_JST.strftime("%F")
return days_after
$ mkdir python
python
└── python_layer.py
zip化します。python_layerという名前でzip化します。
$ zip -r python_layer python
Lambda Layerにアップロード[Python,Node.js共通]
レイヤーの作成をクリックします。
互換性のあるランタイムは、作成したLayerと同じ言語を指定します。
zip化したファイルをアップロードし、作成をクリックします
Lambdaの最下部のレイヤーを追加をクリックします。
カスタムレイヤーから選択し、追加します。
Lambda Layerの呼び出し方法[Node.js]
lambda
exports.handler = async (event) => {
// Layerを使って共通ライブラリ化
const today = require("today");
const days_after = require("days_after");
console.log("本日:" + today.today());
console.log("3日後:" + days_after.days_after(3));
};
require("ファイル名")で呼び出せます。
実行します。
INFO 本日:2022-01-30
INFO 3日後:2022-02-02
Lambda Layerの呼び出し方法[Python]
lambda
#python_layer.pyからLayerを使って共通ライブラリ化
from python_layer import today
from python_layer import days_after
def lambda_handler(event, context):
return (today() + "と" + days_after(3))
from ファイル名 import メソッド名で呼び出せます。
実行します。
Response
"2022-01-30と2022-02-02"
↧