AWSラムダでカスタムレイヤーを使用できない(Ruby 3.2.0)
概要
カスタムレイヤー (pg gem) を使用してラムダ (ランタイム: Ruby 3.2) を実行するときに問題が発生します。
このドキュメントの Ruby ファイル構造に従ってカスタム レイヤー (.zip) を作成しました。
pg.zip
└ ruby/gems/3.2.0/
| build_info
| cache
| doc
| extensions
| gems
| └ pg-1.5.3
└ specifications
└ pg-1.5.3.gemspec
このカスタム レイヤーはすでにラムダに追加されています。
テストしたところ、エラーが発生しました:
{
"errorMessage": "cannot load such file -- pg",
"errorType": "Init<LoadError>",
"stackTrace": [
"/var/lang/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/task/lambda_function.rb:2:in `<top (required)>'",
"/var/lang/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb:59:in `require'"
]
}
[email protected] がインストールされた Mac (x86_64) でパッケージをビルドしました。
Ruby スクリプトはローカルで実行するとうまく機能しました。
質問:
解決策
Ruby 3.2ランタイムでラムダレイヤーを使用した場合も同様のエラーに直面しました。
QNS へ:
それを解決するために私がとった手順は次のとおりです。
Dockerfile
FROM public.ecr.aws/lambda/ruby:3.2
RUN yum install -y amazon-linux-extras \
&& amazon-linux-extras enable postgresql14 \
&& yum group install "Development Tools" -y
RUN yum install -y postgresql postgresql-devel
ADD Gemfile Gemfile.lock ${LAMBDA_TASK_ROOT}
ENV GEM_HOME=${LAMBDA_TASK_ROOT}
RUN bundle config set without 'development test'
RUN bundle config set path 'vendor/bundle'
RUN bundle install
Gemfile
# frozen_string_literal: true
source 'https://rubygems.org'
gem 'pg'
#!/bin/sh -e
rm -rf $DIST_DIR
mkdir -p "$DIST_DIR/lib"
mkdir -p "$DIST_DIR/ruby/gems"
cd "$SOURCE_DIR" >/dev/null || exit
docker build -t ruby-builder -f Dockerfile .
CONTAINER=$(docker run -d ruby-builder)
# See https://northsail.io/articles/aws-lambda-ruby-2-7-pg-gem-libldap-error
# for what to libpq binaries to copy for Amazon Linux 2
docker cp \
$CONTAINER:/usr/lib64/libpq.so.5.14 \
$DIST_DIR/lib/libpq.so.5
docker cp \
$CONTAINER:/usr/lib64/libldap_r-2.4.so.2.10.7 \
$DIST_DIR/lib/libldap_r-2.4.so.2
docker cp \
$CONTAINER:/usr/lib64/liblber-2.4.so.2.10.7 \
$DIST_DIR/lib/liblber-2.4.so.2
docker cp \
$CONTAINER:/usr/lib64/libsasl2.so.3.0.0 \
$DIST_DIR/lib/libsasl2.so.3
docker cp \
$CONTAINER:/usr/lib64/libssl3.so \
$DIST_DIR/lib/
docker cp \
$CONTAINER:/usr/lib64/libsmime3.so \
$DIST_DIR/lib/
docker cp \
$CONTAINER:/usr/lib64/libnss3.so \
$DIST_DIR/lib/
docker cp \
$CONTAINER:/usr/lib64/libnssutil3.so \
$DIST_DIR/lib/
docker cp \
$CONTAINER:/var/task/vendor/bundle/ruby/3.2.0 \
$DIST_DIR/ruby/gems/3.2.0
docker stop $CONTAINER
docker rm $CONTAINER
docker cp コマンドは、Amazon Linux 2 で実行されている lambda 環境で実行する場合に、pg gem に必要な不足しているネイティブ拡張ファイルをコピーするために使用されます。
結果のレイヤーの内容は次のようになります。
├── lib
│ ├── liblber-2.4.so.2
│ ├── libldap_r-2.4.so.2
│ ├── libnss3.so
│ ├── libnssutil3.so
│ ├── libpq.so.5
│ ├── libsasl2.so.3
│ ├── libsmime3.so
│ └── libssl3.so
└── ruby
└── gems
└── 3.2.0
├── bin
│ ├── bundle
│ └── bundler
├── build_info
├── cache
│ ├── bundler-2.4.6.gem
│ └── pg-1.5.3.gem
├── doc
├── extensions
│ └── aarch64-linux
├── gems
│ ├── bundler-2.4.6
│ └── pg-1.5.3
├── plugins
└── specifications
├── bundler-2.4.6.gemspec
└── pg-1.5.3.gemspec