質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

2367閲覧

AWS Lambda上でgemがつかえない

k-tokitoh

総合スコア15

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2019/08/17 08:00

編集2019/08/17 08:04

実現したいこと

  1. gemを利用したRubyのコードをAWS Lambda上で実行したい。
  2. なぜ下記の問題が発生したのかを理解したい。

発生した問題

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と同じように問題なく存在するように見えるけど…。

不足している情報などあればお伝え下さい。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

├── extensions │ ├── x86_64-darwin-17 │ └── x86_64-darwin-18

ruby -v の結果から見るに、macOSでビルドされているようですが、Lambdaの実行環境はamazonlinuxなので、C拡張を使っているgemを使う場合には、zipの中身も実行環境に合わせる必要があるかと思います。

先日、別の質問への回答に書いたのですが、bundle i --path=vendor/bundle の代わりに以下を実行してみるとどうでしょうか。

console

1$ docker run -v `pwd`:/var/task -it lambci/lambda:build-ruby2.5 bundle install --path vendor/bundle

投稿2019/08/18 11:07

takahashim

総合スコア1877

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k-tokitoh

2019/08/19 09:07

ありがとうございます!後ほど試してみます。
k-tokitoh

2019/08/20 12:40

試してみたところいけました!まるっきり類似の質問があったのに見過ごしていたのは反省です…。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問