Не удается загрузить файл mysql2 на AWS Lambda - PullRequest
0 голосов
/ 19 декабря 2018

Попытка подключить Lambda к базе данных RDS, но не может загрузить гем mysql2.Попробовал нетронутую инструкцию, но это не решило проблему.

Я получил встроенный гем mysql2 в каталоге vendor.Сделал это, используя bundle install --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 голосов
/ 21 февраля 2019

Ответ Дханабала работает, но позвольте мне остановиться подробнее, так как ответ слишком процедурный для меня.

По сути, гем с собственным расширением должен быть построен в той же среде, что и AWS Lambda.
Поэтому нам нужно создать собственное расширение внутри lambci/lambda:build-ruby2.5 образа докера, который имитирует среду Lambda.

Также нам нужно скопировать динамические библиотеки в путь загрузки.
Сначала давайте выясним, где мы можем разместить библиотеки.
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 и развертываю.

Вот и все.

0 голосов
/ 10 июня 2019

2 вещи об ответе Дханабала

1) отсутствует шаг cp -a /usr/mysql/.so a * 2) Убедитесь, что в каталоге lib нет ссылок sym, вам нужны настоящие файлы, потому чтосимволические ссылки прерываются после того, как они заархивированы.

0 голосов
/ 13 февраля 2019

Предварительные требования: * 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 Внутри 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
  • установить пакет с развертыванием и без него

Затем выйдите из bash.И создайте лямбда-пакет развертывания и загрузите его в AWS.У меня сработало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...