Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 无法在AWS Lambda上加载文件mysql2_Ruby_Amazon Web Services_Aws Lambda - Fatal编程技术网

Ruby 无法在AWS Lambda上加载文件mysql2

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.

试图让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.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,我在那里执行复制操作。这里有人从我的Makefile
docker 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