起因

收到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的错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ERROR Error: write EPIPE
at afterWriteDispatched (internal/stream_base_commons.js:156:25)
at writeGeneric (internal/stream_base_commons.js:147:3)
at Socket._writeGeneric (net.js:787:11)
at Socket._write (net.js:799:8)
at doWrite (_stream_writable.js:403:12)
at writeOrBuffer (_stream_writable.js:387:5)
at Socket.Writable.write (_stream_writable.js:318:11)
at gm._spawn (/var/task/node_modules/gm/lib/command.js:253:18)
at /var/task/node_modules/gm/lib/command.js:140:19
at series (/var/task/node_modules/gm/node_modules/array-series/index.js:11:36) {
errno: 'EPIPE',
code: 'EPIPE',
syscall: 'write'
}

调查了一下,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平台使用。

记录了下步骤:

  1. 克隆代码

    1
    git clone https://github.com/serverlesspub/imagemagick-aws-lambda-2.git
  2. 开启Docker services, 我Mac下使用的是Docker Desktop

  3. 进入代码目录,进行编译

    1
    2
    cd imagemagick-aws-lambda-2/
    make all
  4. 命令会拉取基础镜像lambci/lambda-base-2:build,下载依赖包,然后编译ImageMagic组件,

  5. 最后执行打包命令make build/layer.zip, 会将ImageMagic相关内容打包到build/layer.zip

    1
    make build/layer.zip
  6. 在AWS Console中添加对应的Layer层。
    add_imagemagick_layer_to_lambda_node12.png

  7. 添加Layer层成功。
    add_imagemagick_layer_to_lambda_node12_success.png

  8. 在Function中,使用刚添加的Layer。在Function页面的Code的Tab中,在最底部可以找到Layers相关的设置。
    lambda_function_layer_list.png

  9. 点击Add a layer来给function添加layer, Layer source中选取Custom layers,再选择之前上传的layer, 点击”Add”,Layer就添加成功了。
    lambda_function_add_layer.png

  10. 添加完ImageMagick的Layer后,原先的函数就可以在node 12.x环境上正常运行了。

Reference

留言