给AWS Lambda node 12x环境添加Layer
起因
收到AWS侧的通告:
因为Nodejs官方对Node.js 10的支持于2021 年 4 月 30 日结束了,AWS侧于 2021 年 7 月 30 日终止在 Amazon Lambda 中对 Node.js 10 的支持。
- 自 2021 年 7 月 30 日起
- Lambda 将不再对 Lambda 函数使用的 Node.js 10 运行时应用安全修补程序和其他更新,并且使用 Node.js 10 的函数将不再符合获得技术支持的条件。
- 此外,您将无法再使用 Node.js 10 运行时创建新的 Lambda 函数。
- 从 2021 年 8 月 30 日开始
- 您将无法再更新使用 Node.js 10 运行时的现有 Lambda 函数
Lambda的Nodejs 10.x平台在8月底就要不能更改了, AWS官方建议升级到最新的Node.js 14。
有个很老的用来处理图片resize的Lambda Function是10.x版本的,需要升级,稳妥起见,决定先升级到12.x版本。
升级过程
Console上升级版本
直接Console上操作,置换到12.x平台后,运行函数提示有Error: write EPIPE
的错误。
调查了一下,12.x上面官方node环境,不再默认提供ImageMagic的命令组件了。我们函数中使用到了ImageMagic的组件来resize图片,在12.x上面就报错了。
添加ImageMagick的Layer
网上一通调查,发现已经有现成的解决方案了,在Lambda基础环境上再添加一层带有ImageMagic组件的Layer即可解决问题。
现成的解决方案imagemagick-aws-lambda-2
Scripts to compile ImageMagick utilities for AWS Lambda instances powered by Amazon Linux 2.x, such as the nodejs10.x or nodejs12.x or python 3.8 runtime, and the updated 2018.03 Amazon Linux 1 runtimes.
Amazon Linux 2 instances for Lambda no longer contain system utilities, so convert, mogrify and identify from the ImageMagick package are no longer available.
看了一下,该repo的作用就是拉取AWS的官方镜像,然后编译ImageMagic相关命名,然后再打包成layer文件,最后通过console或者命令上传到AWS平台使用。
记录了下步骤:
克隆代码
1git clone https://github.com/serverlesspub/imagemagick-aws-lambda-2.git开启
Docker services
, 我Mac下使用的是Docker Desktop
进入代码目录,进行编译
12cd imagemagick-aws-lambda-2/make all命令会拉取基础镜像
lambci/lambda-base-2:build
,下载依赖包,然后编译ImageMagic组件,最后执行打包命令
make build/layer.zip
, 会将ImageMagic相关内容打包到build/layer.zip
中1make build/layer.zip在AWS Console中添加对应的Layer层。
添加Layer层成功。
在Function中,使用刚添加的Layer。在Function页面的Code的Tab中,在最底部可以找到
Layers
相关的设置。点击
Add a layer
来给function添加layer,Layer source
中选取Custom layers
,再选择之前上传的layer, 点击”Add”,Layer就添加成功了。添加完ImageMagick的Layer后,原先的函数就可以在node 12.x环境上正常运行了。