LoginSignup
2
0

bundle install先に 'vendor/bundle'を指定しないとLambdaでInit error when loading handlerになる

Last updated at Posted at 2023-07-20

はじめに

Rubyを使用しているプロジェクトで3.2にバージョンアップする対応を進めていたのですが、その際に発生したエラーに沼ってしまい、参考記事も見つけることができなかったのでまとめることにします。

環境

  • Ruby2.7.5→3.2
  • Rails5.2→7.0
  • Docker image public.ecr.aws/lambda/ruby:2.7→3.2
  • serverless 3.33.0

状況

Ruby on Railsアプリケーションをサーバレスデプロイしているプロジェクトでバージョンアップ対応を行っていました。具体的にLambdaのランタイムイメージとGemfileをRuby2.7から3.2にバージョンアップし、デプロイを行ったのですがページにアクセスできなくなりました。

Cloud Watchでログを確認すると以下のエラーが発生していました。

"Could not find net-pop-0.1.2, net-smtp-0.3.3, rake-13.0.6 in locally installed gems"

image.png

どうやら上記のgemはRuby3.1より標準ライブラリから外れているようなので、手動で追加する必要があるようです。

しかし、追加してデプロイし直してみてもエラーは変わりませんでした。

ローカルのGemfileの変更がデプロイしたコンテナパッケージに含まれていなかったのかなと思い、
ECRにpushしたイメージをpullして中身を確認してみましたが、問題なくGemfile.lockに変更が反映されていました。

また、Gemfileから任意のgemを削除してデプロイし直してみましたがエラーは変わりませんでした。

原因

Lambdaがgemのインストール先を参照できていない…?と思い、
Dockerfileを見直してみました。

FROM public.ecr.aws/lambda/ruby:3.2 as builder

ENV LANG C.UTF-8

RUN yum update -y && yum groupinstall -y "Development Tools"

WORKDIR /var/task

RUN gem install bundler -v 2.3.5

COPY lambda.rb /var/task
COPY ./Gemfile /var/task
COPY ./Gemfile.lock /var/task
ENV GEM_HOME=/var/task
RUN bundle install

ADD . /var/task/

CMD ["lambda.App::Handler.process"]

バージョンアップに成功している他のプロジェクトと比べてみるとbundle install先のpath指定がありませんでした。

試しにapp配下でcat .bundle/configを実行してみるとエラーになりました。
l_9007702_938_93fb0ce626dfdb55bcabd9dc18e68dc5.png

解決方法

公式を参考にbundle installしている箇所を以下のように修正しました。

RUN bundle config set --local path 'vendor/bundle' && bundle install

この状態でデプロイを行うと問題なくページにアクセスできました。

先ほどと同様にcat .bundle/configを実行してみます。

l_9007702_936_68f4a83535aca8f1d9869c2baa65e3b4.png

BUNDLE_PATHがありました。
おそらくLamnbdaでエラーになっていたのはこれが原因なのかなと思います。
(そうなるとバージョンアップ前は問題なく動いていたのが気になりますが…)

おわりに

今回のバージョンアップ対応が原因だったのかまでは分かりませんでした。これまでは問題なく動いていたので原因を突き止めるのに時間がかかってしまいました。同じような状況の方に少しでも参考になればと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0