AWS Lambda にファイル mysql2 をロードできません

概要

Lambda を RDS データベースに接続しようとしましたが、mysql2 gem をロードできません。元の指示を試しましたが、問題は解決されませんでした。

ビルドされた mysql2 gem がベンダー ディレクトリにあります。これは、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'

解決策

Dhanabal の答えは機能しますが、答えは私にとって手続き的すぎるため、さらに詳しく説明します。

基本的に、ネイティブ拡張機能を備えた gem は、AWS Lambda と同じ環境上に構築する必要があります。 したがって、Lambda 環境を模倣する lambci/lambda:build-ruby2.5 docker イメージ内にネイティブ拡張機能を構築する必要があります。

また、動的ライブラリをロード パスにコピーする必要があります。 まず、ライブラリをどこに配置できるかを調べてみましょう。 コンテナ内でエコーすると、 /var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib。 したがって、ライブラリを /usr/lib64/mysql から [function dir]/lib にコピーしてデプロイするだけです。

それでおしまい。