无法在AWS Lambda上加载文件mysql2

时间:2018-12-19 15:34:40

标签: 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.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:

source 'https://rubygems.org'

gem 'mysql2', '~> 0.5.2'
gem 'sequel', '~> 5.15.0'

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'

3 个答案:

答案 0 :(得分:1)

Dhanabal的答案行得通,但由于答案对我来说太过程序化,因此让我详细阐述一下。

基本上,具有本机扩展的gem应该在与AWS Lambda相同的环境上构建。
因此,我们需要在lambci/lambda:build-ruby2.5模仿Lambda环境的docker映像中构建本机扩展。

此外,我们需要将动态库复制到加载路径中。
首先,让我们找出可以在哪里放置库。
echo $LD_LIBRARY_PATH在容器中,您将获得 /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 :(得分:0)

先决条件: * Docker

创建这样的docker文件

    FROM lambci/lambda:build-ruby2.5
    RUN yum -y install mysql-devel
    RUN gem update bundler
    CMD "/bin/bash"

构建Docker

    docker build -t lambda-ruby2.5-mysqldep .

使用以下命令在您的源代码文件夹中运行Docker

    docker run --rm -it -v $PWD:/var/task -w /var/task lambda-ruby2.5-mysqldep

这会让您大跌眼镜 在bash内

  • 将mysql文件夹从/ usr / lib64 / mysql移至/ usr / mysql
  • mkdir -p / var / task / lib
  • cp -a /usr/mysql/.so。 / var / task / lib /
  • 捆绑配置--local build.mysql --with-mysql-config = / usr / local / mysql / bin / mysql_config
  • 捆绑安装(带部署和不带部署)

然后退出重击。然后创建一个lambda部署程序包,并将其上传到AWS。对我有用

答案 2 :(得分:0)

关于Dhanabal答案的两件事

1)cp -a /usr/mysql/.so步骤缺少* 2)确保lib目录中没有符号链接,您需要实际文件,因为符号链接在压缩后会断开。