実現したいこと
- gemを利用したRubyのコードをAWS Lambda上で実行したい。
- なぜ下記の問題が発生したのかを理解したい。
発生した問題
AWS Lambda上でコードを実行したところ、エラーが発生し以下がログ出力される。
{ "errorMessage": "Could not find jaro_winkler-1.5.3 in any of the sources", "errorType": "Init<Bundler::GemNotFound>", "stackTrace": [ "/var/runtime/gems/bundler-2.0.1/lib/bundler/spec_set.rb:87:in `block in materialize'", "/var/runtime/gems/bundler-2.0.1/lib/bundler/spec_set.rb:81:in `map!'", "/var/runtime/gems/bundler-2.0.1/lib/bundler/spec_set.rb:81:in `materialize'", "/var/runtime/gems/bundler-2.0.1/lib/bundler/definition.rb:170:in `specs'", "/var/runtime/gems/bundler-2.0.1/lib/bundler/definition.rb:237:in `specs_for'", "/var/runtime/gems/bundler-2.0.1/lib/bundler/definition.rb:226:in `requested_specs'", "/var/runtime/gems/bundler-2.0.1/lib/bundler/runtime.rb:108:in `block in definition_method'", "/var/runtime/gems/bundler-2.0.1/lib/bundler/runtime.rb:20:in `setup'", "/var/runtime/gems/bundler-2.0.1/lib/bundler.rb:107:in `setup'", "/var/runtime/gems/bundler-2.0.1/lib/bundler/setup.rb:20:in `<top (required)>'", "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:54:in `require'", "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:54:in `require'", "/var/task/main.rb:3:in `<top (required)>'", "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:54:in `require'", "/var/lang/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:54:in `require'" ] }
ソースコード
問題が発生する最小の構成にしています。
↓ディレクトリ構成
% tree -L 6 . ├── Gemfile ├── Gemfile.lock ├── main.rb ├── lambda.zip └── vendor └── bundle └── ruby └── 2.5.0 ├── bin │ ├── rubocop │ ├── ruby-parse │ └── ruby-rewrite ├── build_info ├── cache │ ├── ast-2.4.0.gem │ ├── jaro_winkler-1.5.3.gem │ ├── parallel-1.17.0.gem │ ├── parser-2.6.3.0.gem │ ├── rainbow-3.0.0.gem │ ├── rubocop-0.74.0.gem │ ├── ruby-progressbar-1.10.1.gem │ └── unicode-display_width-1.6.0.gem ├── doc ├── extensions │ ├── x86_64-darwin-17 │ └── x86_64-darwin-18 ├── gems │ ├── ast-2.4.0 │ ├── jaro_winkler-1.5.3 │ ├── parallel-1.17.0 │ ├── parser-2.6.3.0 │ ├── rainbow-3.0.0 │ ├── rubocop-0.74.0 │ ├── ruby-progressbar-1.10.1 │ └── unicode-display_width-1.6.0 └── specifications ├── ast-2.4.0.gemspec ├── jaro_winkler-1.5.3.gemspec ├── parallel-1.17.0.gemspec ├── parser-2.6.3.0.gemspec ├── rainbow-3.0.0.gemspec ├── rubocop-0.74.0.gemspec ├── ruby-progressbar-1.10.1.gemspec └── unicode-display_width-1.6.0.gemspec
↓main.rb
# frozen_string_literal: true require "bundler/setup" Bundler.require def handler(event:, context:); end
↓Gemfile
# frozen_string_literal: true source 'https://rubygems.org' git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } gem 'rubocop', require: false
↓Gemfile.lock
GEM remote: https://rubygems.org/ specs: ast (2.4.0) jaro_winkler (1.5.3) parallel (1.17.0) parser (2.6.3.0) ast (~> 2.4.0) rainbow (3.0.0) rubocop (0.74.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) parser (>= 2.6) rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 1.7) ruby-progressbar (1.10.1) unicode-display_width (1.6.0) PLATFORMS ruby DEPENDENCIES rubocop BUNDLED WITH 2.0.2
AWS Lambdaで実行するために行った手順
こちらの公式ドキュメントを参考にしました。
% bundle i --path=vendor/bundle Using ast 2.4.0 Using bundler 2.0.2 Using jaro_winkler 1.5.3 Using parallel 1.17.0 Using parser 2.6.3.0 Using rainbow 3.0.0 Using ruby-progressbar 1.10.1 Using unicode-display_width 1.6.0 Using rubocop 0.74.0 Bundle complete! 1 Gemfile dependency, 9 gems now installed. Bundled gems are installed into `./vendor/bundle` % zip -r lambda ./*
AWSコンソールからlambda.zipをアップロードし、トリガーをmain.handler
にしてテスト実行しました。
環境
% ruby -v ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18]
AWS Lambdaのランタイム: Ruby 2.5
考えたこと
公式ドキュメントに「gemをつかいたい場合はvendor/bundleにgemをインストールして、それらもまとめてzipにしてアップロードしてね」と書いてある。なので「Lambda上ではgemをsourceからインストールせず」、「アップロードされたパッケージ内に存在するgemの実行ファイルを利用するだけ」と思っていた。
エラーメッセージにCould not find jaro_winkler-1.5.3 in any of the sources
とあるが、これはsourceとして指定したrubygems.orgからgemをインストールしようとしているということだろうか?
スタックトレースから、require 'bundler/setup'
の実行中にエラーが生じたと思われる。
require 'bundler/setup'
によってrequireで探しにいく行先リスト(ロードパス)にbundler管理下のgemがある場所のパスを追加するらしい。
ってことはjaro_winkler-1.5.3
がインストールされた先が分からないのだろうか?
vendor/bundle/ruby/2.5.0/gems/jaro_winkler-1.5.3/
以下に他のgemと同じように問題なく存在するように見えるけど…。
不足している情報などあればお伝え下さい。よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/19 09:07
2019/08/20 12:40