使用Lambda Layers将自制模块共享为通用库 [Python,Node.js]
首先
通过使用Lambda层,可以将模块作为共享库,并在多个Lambda函数中使用。下面以Python和Node.js的模式将方法进行总结。
作为优点,可以减少Lambda源代码的数量,而且不再需要为每个Lambda上传模块。
关于Lambda Layers
Lambda层是一个允许包含额外代码和数据的.zip文件存档。可以包含库、自定义运行时、数据或配置文件在层中。使用层可以促进代码共享和责任分离,并且可以更快地重复编写业务逻辑的描述。
自制模块的目录结构
上传到Lambda Layers的模块将被部署在/opt目录中。
因此,只需将Python模块存储到指定目录(参见下表),然后上传到Lambda中执行时,模块将自动被读取为一个模块。
各 Lambda 运行时的层路径
言語パスNode.jsnodejs/node_modules〃nodejs/node14/node_modules (NODE_PATH)Pythonpython〃python/lib/python3.9/site-packages (サイトディレクトリ)
创建一个[Node.js]模块
module.exports = () => {
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;
};
module.exports = (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;
};
我們將上述的兩個檔案作為自製模組使用。在本地創建一個資料夾,把模組檔案放入並壓縮成ZIP格式。
$ mkdir nodejs
$ cd nodejs
$ mkdir node_modules
$ cd node_modules
$ pwd
/nodejs/node_modules
将today.js和days_after.js放入node_modules目录中。
nodejs
└── node_modules
├── days_after.js
└── today.js
将其压缩成zip文件。zip文件可以随意命名,但这次我们将以nodejs_layer命名。
$ zip -r nodejs_layer nodejs
创建Python模块
Python允许将多个逻辑整合到一个文件中。
from datetime import datetime, timedelta
import boto3
# Method
def today():
# 2022-01-16 20:54:05.134159
dateJST = datetime.today() + timedelta(hours=9)
# 2022-01-16
return dateJST.strftime("%F")
def days_after(days_after_number):
dateJST = datetime.today() + timedelta(hours=9)
days_after_JST = dateJST + timedelta(days=days_after_number)
return days_after_JST.strftime("%F")
# Table
dynamodb = boto3.resource('dynamodb')
dynamodb_table = dynamodb.Table("users")
# Constant
TYPE = 'all'
$ mkdir python
python
└── python_layer.py
将其压缩为zip文件。并以python_layer为名称进行压缩。
$ zip -r python_layer python
将代码上传至Lambda Layer[Python和Node.js通用]



[Node.js] 调用 Lambda Layer 的方法
方法
exports.handler = async (event) => {
// Layerを使って共通ライブラリ化
const today = require("today");
const days_after = require("days_after");
console.log("本日:" + today());
console.log("3日後:" + days_after(3));
};
可以通过require(“文件名”)来调用。
执行。
INFO 本日:2022-01-30
INFO 3日後:2022-02-02
如何调用Lambda Layer[Python]
方法
#python_layer.pyからLayerを使って共通ライブラリ化
from python_layer import today,days_after
# from python_layer import *
def lambda_handler(event, context):
return (today() + "と" + days_after(3))
可以使用从文件名导入方法名的方式来调用。
另外,可以使用从文件名导入*的方式来调用文件内的所有方法。
进行执行操作。
Response
"2022-01-30と2022-02-02"
确定的数字
#python_layer.pyからLayerを使って共通ライブラリ化
from python_layer import TYPE
def lambda_handler(event, context):
return TYPE
Response
"all"
Python相比较于其他语言更适合将文件整合到一个单一的地方,这样非常不错。
如果想要使用Python的外部库Layer。
如果在下面的GitHub已经创建了,那么您无需手动安装模块并将其上传到Layer中。请参考文章。
