はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます
登場人物
アーキテクチャ先生:
AWSが好きな新上司。Docker on Lambdaを利用したサーバーレスアプリケーションのアーキテクチャなどが得意。いつも忙しい。
ちいかわトミカさん:
先輩で頼りになる方。疲れたらちいかわトミカで遊んでいる?よくダジャレを言う。得意なダジャレは「今日言う共有事項はないです」
はじめてのバージョンアップ対応
私「そろそろRails6のサポートとlambdaランタイムRuby2.7のサポート期限が近いので対応しないといけないですね」
ちいかわトミカさん「調べたことなどはまとめておいてもらえると助かります」
アーキテクチャ先生「社内でも対応できているところは少ないと思うのでお願いします」
はじめてのバージョンアップ対応
Railsの対応で遭遇したエラーは以下の2種類
Failure/Error: require_relative '../config/environment'
NoMethodError:
undefined method `symbolize_keys' for nil:NilClass
Failure/Error: require_relative '../config/environment'
FrozenError:
can't modify frozen Array: []
ymlでaws credentialを参照する書き方をしていましたが、ymlを使わず.rbファイルをinitialize直下に置く形で解決しました。
この辺りは何とかなったのですが、dockerイメージをlambdaに載せてデプロイしアクセスしてみるとエラー…
でもローカルのGemfileにはいます…
色々調べたり社内掲示板で助けを求めたところ、
「デプロイ先のコンテナでbundle installされていないかも…?」という仮説にたどり着きました。
バージョンアップ前はデプロイして問題なくアクセスできていたのでまさかと思っていましたが、
デプロイ前にコンテナ内でbundle configするとvendor/bundleの指定がされていませんでした。
lambda関数がAWS SDK for Ruby以外のライブラリに依存している場合はローカルにインストールしてデプロイパッケージに含める必要があります。
今回はlambda関数がvendor/bundleを参照できていなかったため、Gemfileの更新内容も反映されずにエラーが起きていたようです。
RUN bundle install
を
RUN bundle config set --local path 'vendor/bundle' && bundle install
に変更することで無事解決できました。
おわりに
今回の対応でdokcerのRubyイメージのバージョンも上げたためかデフォルトの参照先が変わってしまったのかもしれないです。