如何为 Ruby 的 mysql2 库设置 Lambda 层?

问题描述 投票:0回答:1

我一直在尝试为我的 Ruby Lambda 函数设置 Lambda 层,但由于某种原因无法使其工作。 我已经按照AWS的教程创建(https://docs.aws.amazon.com/lambda/latest/dg/ruby-layers.html),但是对于mysql2,我正在尝试安装的库,它不起作用。 我知道有一些依赖关系可能会导致此问题。

当我运行我的函数时,我收到以下错误消息:

"errorMessage": "libmariadb.so.3: cannot open shared object file: No such file or directory - /opt/ruby/gems/3.3.0/gems/mysql2-0.5.6/lib/mysql2/mysql2.so"

编辑:此 lambda 函数应该能够在作为 MySQL 实例的 RDS 数据库上运行查询。
我该如何安装这个 lambda 层?除了 gem 本身之外,我还应该将哪些类型的文件打包到我的图层中?

我尝试将 libmariadb.so.3 文件复制到我的图层文件夹中,结构保持如下:ruby/libs 和 ruby/gems 位于同一级别。/libs 文件夹是我已经保存的文件夹保存了 libmariadb.so.3。它不起作用,我也遇到了同样的错误。

ruby amazon-web-services aws-lambda mysql2 aws-lambda-layers
1个回答
0
投票

发生这种情况是因为 AWS Lambda 的 Ruby 运行时环境默认不包含 mysql2 gem 所需的本机库。

为了更好地解决此问题,请始终尝试在

amazonlinux:2
图像中测试您的代码是否有效,以事先确保可计算性。如果一切顺利,那么也尝试从该映像创建图层,因为在不同的系统上安装东西可能会安装在 lambda 上不起作用的不同东西。

如果我处于你的位置,我会这样做:

docker run -it amazonlinux:2
yum install -y gcc make ruby ruby-devel mariadb-devel
gem install bundler
mkdir -p /lambda/ruby/gems/3.3.0
cd /lambda
BUNDLE_PATH=/lambda/ruby/gems/3.3.0 bundle add mysql2
docker cp <container_id>:/lambda ./lambda-layer
docker cp <container_id>:/usr/lib64/libmariadb.so.3 ./lambda-layer/ruby/lib/
cd lambda-layer
zip -r layer.zip .

这是保证兼容性的最好方法。 也可能是权限问题,您只需在创建 zip 并上传之前更新权限即可

chmod -R 755 ruby/lib

© www.soinside.com 2019 - 2024. All rights reserved.