Amazon Linux 1(AL1)
$ eb ssh
$ sudo su -
# cd /var/app/current
# bundle exec rails c
Amazon Linux 2(AL2)
$ eb ssh
$ sudo su -
# /opt/elasticbeanstalk/bin/get-config environment | jq -r 'to_entries | .[] | "export \(.key)=\"\(.value)\""' > /opt/elasticbeanstalk/support/envvars
# sudo su - webapp
$ source /opt/elasticbeanstalk/support/envvars
$ rbenv shell $(rbenv global)
$ cd /var/app/current
$ bundle exec rails c
ちょっとだけ解説
AL1のEB環境ではアプリケーションのデプロイ時にrootユーザに必要なEB環境変数等が設定された状態で実行されていました。
RubyやBundler等はシステムグローバルに入っているものが使われています。
AL2のEB環境ではwebappユーザが各種初期化スクリプトを経由してRails(Puma)を起動しています。
RubyやBundler等はrbenvによって管理されるようになりました。
webappユーザは様々なサポートスクリプトを経由してPumaを起動しますが、その際にEB環境に設定されている環境変数を取り込んでいます。
その内容が記述されているファイルをAL1と同様に扱うためにrootユーザで/opt/elasticbeanstalk/support/envvars
へ出力し、source
によって環境変数へ反映させています。
EB環境は複数のRuby用プラットフォームからバージョンのあったものを選択する必要がありますが、64bit Amazon Linux 2 v3.4.6 running Ruby 2.7
のように詳細なバージョンまで指定する方法はありません。
そのため、AL1のEB環境では参照されていなかった.ruby-version
との食い違い1が発生してしまうことがあるのですが、それを回避するためにrbenv shell $(rbenv global)
を実行し、環境変数にRBENV_VERSION=2.7.6
のようなものを設定することでコマンドラインでのRubyバージョンを指定しています。
-
当然ですが
.ruby-version
の方をプラットフォームと同じバージョンにした方が良いです ↩