使用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通用]

スクリーンショット 2022-01-30 10.10.04.png
スクリーンショット 2022-01-30 10.16.13.png
スクリーンショット 2022-01-30 10.19.55.png

[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中。请参考文章。

スクリーンショット 2022-02-19 19.41.06.png

 

bannerAds