使用AWS Lambda的Layer有三种类型

由于我经常忘记如何创建和使用AWS Lambda Layer,所以我把它们记录在备忘录中。
我将创建一个Layer,它可以执行以下三个操作。您可以选择性地将这三个操作都包含在Layer中,或者根据需要选择其中的某个并加入到Layer中。
这适用于Node.js语言。

① 包含自己创建的类
② 包含 Npm 模块
③ 包含可执行文件

筹备

首先,创建一个合适的文件夹。例如,我们创建一个名为”layer_test”的文件夹。从此之后,我们将视它为根文件夹。

> mkdir layer_test
> cd layer_test

假设工作环境已经设置了Node.js。版本将与Lambda指定的版本匹配,本次我们选择了v14系列。

将自己创建的类包含在内

将自己创建的类包含进来。
将其创建在先前创建的根文件夹中。

> vi hello.js

东西的内容是这样的。

class Hello{
    constructor(message){
    	this.message = message;
    }

    say(){
        return this.message;
    }
}
module.exports = Hello;

稍后我会整理上传到AWS Lambda的说明。

包括Npm模块

然后,我们尝试包括npm模块。
当然,不一定要用Layer,但对于大型的npm模块,由于无法在AWS管理控制台上进行源代码编辑,将大型文件转移到Layer也是一个选项。
在刚才的根文件夹中,创建一个名为nodejs的文件夹。

> mkdir nodejs
> cd nodejs
> npm init -y

然后,我们安装需要的npm模块。这次我们以uuid作为例子进行安装。

> npm install uuid

这样做的话,我认为在nodejs文件夹中会生成一个node_modules文件夹。某些npm模块可能需要进行本地编译。在这种情况下,由于AWS Lambda是在Linux环境中运行的,所以请在Linux环境中(例如Ubuntu)执行,而不是在Windows中执行。

将可执行文件包括在内

在使用child_process的execSync或exec时,有时候需要执行本机的可执行文件。
首先,在之前的根目录下创建一个名为bin的文件夹。

> mkdir bin
> cd bin

本次我们作为例子来讨论一下”ffmpeg”。

请从以下网站上下载 ffmpeg-release-amd64-static.tar.xz 文件。请注意,下载的是适用于 Linux 的可执行文件,而不是适用于 Windows 的版本。

 

由于被tar.xz压缩,因此展开如下。

> xz -dc ffmpeg-release-amd64-static.tar.xz | tar xfv –

这样一来,您会在展开的文件夹中找到两个执行文件,即ffmpeg和ffprobe。请将它们复制到根目录中的bin文件夹中。

> cp XXXX/{ffmpeg,ffprobe} .

将文件上传至Layer。

要上传文件,首先需要将要上传的文件组打包成ZIP文件。

最后我认为会变成这样一个文件夹。

***.js
bin\***
nodejs\node_modules\***

刚才在根文件夹中执行以下操作。

> zip -r index.zip .

只需一个选项即可。

完成后,将生成ZIP文件”index.zip”。
然后,从AWS管理控制台上传ZIP文件作为Layer。

 

image.png

点击“创建图层”按钮。

image.png

我随意地将其命名为”layer_test”。
您可以选择直接从此页面上载ZIP文件,或先将其上传到S3再上传到Layer。如果ZIP文件超过10兆字节,则必须通过S3上传。

选择具有互换性的架构选项,我们选择了x86_64。选择具有互换性的运行时选项,此次我们选择了”Node.js 14.x”。

使用Lambda函数

那么,我们立即从Lambda函数中尝试使用。
对于运行环境,选择了之前指定的Layer运行环境中的Node.js 14.x。

image.png

创建完Lambda函数后,点击下方的“添加图层”按钮。

image.png

选择自定义图层,然后选择先前创建的“layer_test”。
版本在每次图层更新时会递增 1。

image.png

最后,点击“添加”按钮。

当使用时的源代码如下:
需要补充一点说明,自定义类似乎会被释放在 /opt 文件夹下。

const Hello = require('/opt/hello');
const { v4: uuidv4 } = require('uuid');
const execSync = require('child_process').execSync;

exports.handler = async (event) => {
    var hello = new Hello("Hello World");
    console.log(hello.say());
    
    var uuid = uuidv4();
    console.log(uuid);

    var message = execSync('ffmpeg -version');
    console.log(message.toString());

    
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

以上

bannerAds