我正在使用AWS Lambda中的加密库。我已经在Amazon Linux VM中使用pip编译了软件包。我已经将该包上传为图层。无论哪种方式,每次调用库时,都会出现一个根本无法描述的错误:
supportedRuntime
如您所见,错误并非与找不到lib有关,而是我无法找到的另一个共享模块。
这是我尝试在Lambda上执行的代码的示例:
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
这不是我第一次编译可在AWS Lambda上使用的库,但在这种情况下,即使是我也编译了加密库。我应该添加或更改什么?
[编辑] 我发现该库在我创建的zip文件中丢失了,就像在一个隐藏文件夹中一样。我使用'。'压缩。而不是'*',但是现在我遇到了一个新问题,当我运行lambda时,我得到了:
Unable to import module 'lambda_function': libffi-ae16d830.so.6.0.4: cannot open shared object file: No such file or directory
有什么主意吗?
答案 0 :(得分:1)
即使我遇到了同样的问题,在压缩时我也忘记了在站点包中包含隐藏文件(.libs_cffi_backend)。 包含它之后,我没有看到此错误。
答案 1 :(得分:0)
由于您使用的库需要本机库,因此您还必须将本机.so文件与图层一起打包。尝试在aws lambda上运行wkhtmltopdf时遇到了类似的问题。
库的二进制文件必须在与lambda实例相同的环境中进行编译。 Lambda使用AWS Linux启动。
您可以启动运行AmazonLinux的EC2或使用docker,最简单的方法是启动docker容器。
$ sudo docker run -it amazonlinux bash
现在,您需要将所有.so文件下载/解压缩到目录中,然后将其压缩。另外,请确保将所有.so文件保留在zip中名为lib的文件夹中。压缩后,压缩后的外观应类似于以下内容:
.
├── lib
│ ├── libcrypto.so.10
│ ├── libcrypto.so.1.0.2k
│ ├── libfontconfig.so.1
│ ├── libfontconfig.so.1.7.0
.......
然后,您可以将其压缩并上传为图层。它将被上传到您的Lambda容器中的/ opt /中。 AWS在many other locations中的/ opt / lib下查找库文件。
您面临的挑战性部分是弄清楚如何获取所有必需的.so文件,以使依赖项正常运行。