はじめに
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"
どうやら上記の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
を実行してみるとエラーになりました。
解決方法
公式を参考にbundle installしている箇所を以下のように修正しました。
RUN bundle config set --local path 'vendor/bundle' && bundle install
この状態でデプロイを行うと問題なくページにアクセスできました。
先ほどと同様にcat .bundle/config
を実行してみます。
BUNDLE_PATHがありました。
おそらくLamnbdaでエラーになっていたのはこれが原因なのかなと思います。
(そうなるとバージョンアップ前は問題なく動いていたのが気になりますが…)
おわりに
今回のバージョンアップ対応が原因だったのかまでは分かりませんでした。これまでは問題なく動いていたので原因を突き止めるのに時間がかかってしまいました。同じような状況の方に少しでも参考になればと思います。