おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

lambyを利用したRackアプリケーションが起動しなくなったのを直した

RackアプリケーションをLambdaでホスティングしてみたの続編です。

lamby を使ったRackアプリケーションはここ1年ほど特に問題なく運用できていたのですが、先日Lambdaで動かしているアプリケーションのヘルスチェックが失敗するようになりました。CloudWatch Logsを見てみると次のようなエラーが出ていました。

/usr/local/lib/ruby/3.2.0/bundler/runtime.rb:304:in `check_for_activated_spec!': You have already activated logger 1.5.3, but your Gemfile requires logger 1.7.0. Since logger is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports logger as a default gem. (Gem::LoadError)

lambyでは次のように、aws_lambda_ricというAWS公式のRuby用のクライアントを経由してRackアプリケーションを実行しています。これはlambyの公式ドキュメントにあるコードをそのまま引用して利用しています。

FROM ruby:3.2-bullseye

RUN gem install 'aws_lambda_ric'
ENTRYPOINT [ "/usr/local/bundle/bin/aws_lambda_ric" ]
CMD ["config/environment.Lamby.cmd"]

僕の作ったRackアプリケーションはGemfileで管理されたsinatraを利用していました。上記のコードを見てわかるように、aws_lambda_ricはGemfile管理外で実行されています。そしてaws_lambda_ricとsinatraはどちらもloggerを依存関係として持っています。

ログメッセージとこれらの事実を繋ぎ合わせるとaws_lambda_ricとsinatraのロードするloggerのバージョンが違うのでエラーになっていたということがわかります。Gemfileにaws_lambda_ricを明示的に追加して、ENTRYPOINTをbundle exec形式に変更することで解決しました。

FROM ruby:3.2-bullseye

RUN gem install 'aws_lambda_ric'
ENTRYPOINT [ "bundle", "exec", "aws_lambda_ric" ]
CMD ["config/environment.Lamby.cmd"]

これは本家にフィードバックしようと思ったのですが、gemそのものの問題ではないのでIssueを作りづらいな…となりとりあえずブログとして供養しておこうと思ってエントリを認めた次第です。