Ruby 无法在AWS Lambda上加载文件mysql2
试图让Lambda连接到RDS数据库,但无法加载mysql2 gem。尝试了原始的指令,但没有解决问题 我已经在供应商目录中创建了mysql2 gem。这是使用捆绑包安装--deployment实现的 这可能是一个问题,因为mysql2使用了编译后的扩展。但我不知道如何为AWS Lambda排序。想法 以下是日志输出:Ruby 无法在AWS Lambda上加载文件mysql2,ruby,amazon-web-services,aws-lambda,Ruby,Amazon Web Services,Aws Lambda,试图让Lambda连接到RDS数据库,但无法加载mysql2 gem。尝试了原始的指令,但没有解决问题 我已经在供应商目录中创建了mysql2 gem。这是使用捆绑包安装--deployment实现的 这可能是一个问题,因为mysql2使用了编译后的扩展。但我不知道如何为AWS Lambda排序。想法 以下是日志输出: START RequestId: 62f35c49-039f-11e9-be04-1fd1111df42b Version: $LATEST Ignoring mysql2-0.
START RequestId: 62f35c49-039f-11e9-be04-1fd1111df42b Version: $LATEST
Ignoring mysql2-0.5.2 because its extensions are not built. Try: gem pristine mysql2 --version 0.5.2
Init error when loading handler lambda_function.lambda_handler
{
"errorMessage": "cannot load such file -- mysql2",
"errorType": "Init<LoadError>",
"stackTrace": [
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/task/lambda_function.rb:3:in `<top (required)>'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'"
]
}
END RequestId: 62f35c49-039f-11e9-be04-1fd1111df42b
REPORT RequestId: 62f35c49-039f-11e9-be04-1fd1111df42b Duration: 1439.17 ms Billed Duration: 1500 ms Memory Size: 128 MB Max Memory Used: 17 MB
Unknown application error occurred
Init<LoadError>
Gemfile.lock
GEM
remote: https://rubygems.org/
specs:
mysql2 (0.5.2)
sequel (5.15.0)
PLATFORMS
ruby
DEPENDENCIES
mysql2 (~> 0.5.2)
sequel (~> 5.15.0)
BUNDLED WITH
1.17.2
这是我的lambda_function.rb文件的顶部
require 'json'
require 'logger'
require 'mysql2'
require 'sequel'
先决条件:
*码头工人
像这样创建一个docker文件
FROM lambci/lambda:build-ruby2.5
RUN yum -y install mysql-devel
RUN gem update bundler
CMD "/bin/bash"
建造码头工人
docker build -t lambda-ruby2.5-mysqldep .
使用下面的命令在源代码文件夹中运行Docker
docker run --rm -it -v $PWD:/var/task -w /var/task lambda-ruby2.5-mysqldep
它会让你参加聚会
在狂欢中
- 将mysql文件夹从/usr/lib64/mysql移动到/usr/mysql
- mkdir-p/var/task/lib
- cp-a/usr/mysql/.so/var/task/lib/
- bundle config--local build.mysql--with mysql config=/usr/local/mysql/bin/mysql\u config
- 捆绑安装,包括部署和不部署
然后退出狂欢。并创建lambda部署包并将其上载到AWS。这对我来说很有效达纳巴尔的答案很有效,但让我详细说明一下,因为答案对我来说太程序化了 基本上,具有本机扩展的gem应该构建在与AWS Lambda相同的环境上。
所以我们需要在模仿lambda环境的
lambci/lambda:build-ruby2.5
docker映像内部构建本机扩展
此外,我们还需要将动态库复制到加载路径中。首先,让我们找出图书馆的位置。
echo$LD\u LIBRARY\u路径
在容器中,您将获得
/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib
因此,我只需将库从
/usr/lib64/mysql
复制到[function dir]/lib
并部署
就这样。关于达纳巴尔答案的两件事 1) cp-a/usr/mysql/。因此步骤缺少*
2) 确保lib目录中没有sym链接,您需要实际的文件,因为符号链接在压缩后会断开。还没有机会完全阅读它,但我似乎可以使用Docker在类似Lambda使用的环境中构建gem及其扩展。谢谢你,Sam。关于为什么以及如何给出答案,这一点非常好。当我猛击docker容器
var/task/lib
时,我看到了*。so
文件。但是当我退出docker容器时,我看到lib
目录是空的。我需要绘制它们的地图吗?执行lambda函数时,我获取libmysqlclient.so.18:无法打开共享对象文件:没有此类文件或目录。Docker有点复杂。我不能为您的设置说话,但对我来说,我使用docker compose进行开发。我将整个代码目录装入开发环境中的容器中。我有打包zip文件的Makefile,我在那里执行复制操作。这里有人从我的Makefiledocker compose run--rm application cp$(shell docker compose run--rm application realpath/usr/lib64/libnettle.so.4)中观察到,/lib/libnettle.so.4
虽然不是MySQL库,但希望这有帮助。像run yum-y install MySQL devel一样,有用于postgres10的命令吗
docker run --rm -it -v $PWD:/var/task -w /var/task lambda-ruby2.5-mysqldep