У вас есть libpq.so.5
в папке lib
?
Ваша ошибка говорит о том, что не удалось найти libpq.so.5
на $PATH
, в AWS Lambda папка lib
автоматически загружаетсяна пути, таким образом, вам просто нужно иметь этот файл там.
Исполняемые файлы, созданные вне лямбда-мира, не запускаются в Lambda, кроме того, вам нужно самостоятельно скомпилировать исполняемые файлы на образе Lambda.Вот пример того, как это сделать:
Gemfile
source "https://rubygems.org"
gem "pg"
gem "mysql2"
handler.rb
require 'pg'
require 'mysql2'
def run(event:, context:)
{
postgres_client_version: PG.library_version,
mysql_client_version: Mysql2::VERSION
}
end
Dockerfile
FROM lambci/lambda:build-ruby2.5
RUN yum install -y postgresql postgresql-devel mysql mysql-devel
RUN gem update bundler
ADD Gemfile /var/task/Gemfile
ADD Gemfile.lock /var/task/Gemfile.lock
RUN bundle install --path /var/task/vendor/bundle --clean
Это собирается создать ваш образ, затем запустить его для генерации исполняемых файлов PG и MYSQL, а затем скопировать его в вашу папку lib.
build.sh
#!/bin/bash -x
set -e
rm -rf lib && rm -rf vendor && mkdir lib && mkdir vendor
docker build -t pg_mysql_layer -f Dockerfile .
CONTAINER=$(docker run -d pg_mysql_layer false)
docker cp \
$CONTAINER:/var/task/vendor/ \
./
docker cp \
$CONTAINER:/usr/lib64/libpq.so.5.5 \
lib/libpq.so.5
docker cp \
$CONTAINER:/usr/lib64/mysql/. \
lib/
docker rm $CONTAINER
После запуска ./build.sh
он сгенерирует папку lib
и vendor
со всем, что вам нужно, теперь вам просто нужно развернуть свою лямбда-функцию.
Для локального тестирования вы можете запустить: docker run --rm -it -v $PWD:/var/task -w /var/task lambci/lambda:ruby2.5 handler.run
Будет возвращено что-то похожее на это:
REF: https://www.stevenringo.com/ruby-in-aws-lambda-with-postgresql-nokogiri/
REF: https://www.reddit.com/r/ruby/comments/a3e7a1/postgresql_on_aws_lambda_ruby/