ElasticBeanstalkで運用しているRailsアプリケーションがあり、開発環境のRubyのバージョンを2.2から2.4に上げました。
ElasticBeanstalk上の本番環境もアップグレードしようと思ったのですが、GUIのプラットフォームのプルダウンに2.4の候補が現れず、しばらくハマリました。
調べたところ、CLIから解決する方法しか見当たりませんでした。メモ程度ですが、解決までの道のりです。
もっとよい方法があったら教えてください!
選択できるソリューションを調べる
ベースとなるAmazon Linuxと言語のバージョンの組み合わせをソリューションと呼ぶようです。
list-available-solution-stacks
で選択できるソリューションをリストアップできます。
aws elasticbeanstalk list-available-solution-stacks | jq -r '.SolutionStacks[]'
今回は64bit Amazon Linux 2018.03 v2.8.6 running Ruby 2.4 (Passenger Standalone)
を使うことにしました。
ハマったポイント
以下のページにプラットフォーム一覧があります。
Elastic Beanstalk でサポートされているプラットフォーム
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/concepts.platforms.html#concepts.platforms.ruby
最初にここから選んだのですが、実際にソリューションを適用するステップで見つからないと何度も怒られてしまいました。
選択できるソリューションのバージョンには縛りがあるようです。aws elasticbeanstalk list-available-solution-stacks
で取得できるリストから選びましょう。
環境のクローン
次に少し乱暴なやり方をするので、環境をクローンしてから作業した方が安全です^^
GUIやeb
コマンドからクローンしてください。後でDNSの付け替えをします。
アプリケーションの新しいバージョンをアップロード
Ruby 2.4に対応したアプリケーションコードをアップロードして新しいバージョンを作成するために、クローンした環境にひとまずデプロイしちゃいます。
zipに固めてアップロードだけするのがお行儀のよいやり方ですが、eb deploy
と同じパッケージングをしたいのでこうしました。ビルドだけ行うコマンドが見当たらず。
エラーが発生してヘルスチェックが終わらない場合は、オペレーションを中断しちゃいます。それでも新しいバージョンラベルは発行されます。
eb deploy クローンした環境
ソリューションの変更によるRubyのアップグレード
list-available-solution-stacks
で取得した中から、64bit Amazon Linux 2018.03 v2.8.6 running Ruby 2.4 (Passenger Standalone)
にアップグレードします。
aws elasticbeanstalk update-environment
コマンドを使います。
aws elasticbeanstalk update-environment \
--environment-name '環境' \
--solution-stack-name '64bit Amazon Linux 2018.03 v2.8.6 running Ruby 2.4 (Passenger Standalone)' \
--version-label '新しいアプリケーションのバージョンラベル'
これで無事に新しい環境にデプロイができたので、DNSを付け替えて作業完了です。
誤ってプラットフォームをアップグレードしない措置なのかなーと推測しましたが、なかなか大変でした。