Elastic Beanstalkで使用していたAmazon Linux AMI ベースの Docker プラットフォームがリタイヤ予定になっていたので、Amazon Linux 2 Docker プラットフォームへ移行しました。その移行作業で変更した箇所をメモ。
↓対象の環境はざっくりこんな感じ
- 起動するDockerコンテナは1つ
- ローカルCLIからeb deploy
- デプロイ時にEBがDockerfileを参照してカスタムイメージをビルド
- EC2インスタンス2台 ALBで冗長化
- WebフレームワークはRails 5系
変更点
1. Dockerrun.aws.jsonを追加
{
"AWSEBDockerrunVersion": "1",
"Ports": [
{
"ContainerPort": "3000"
}
]
}
移行前はソースバンドル(デプロイに使用するzipファイル)に含まれたDockerfileを自動で読み込んでビルドしてくれたのですが、Linux 2になってからはdocker run用のAWS独自フォーマットのファイルが必要になりました。
AWSEBDockerrunVersion
はDocker Composeを使用しないので1、ContainerPort
はDockerfileのEXPOSE
と合わせています。
ちなみにdocker-compose.ymlが含まれていると、Dockerrun.aws.jsonを無視してdocker composeとして起動してしまうので注意が必要です。
2. .ebextensionsで設定していたnginx設定を.platform/nginxに移動
.platform/nginx/nginx.conf
など
デプロイ時に拡張したい設定をまとめておける.ebextensionsにnginxの設定を記載していたのですが、移行後はうまくnginxの設定ファイルに展開できなくなりました。
そのため移行に伴い、EBで用意しているnginx設定を展開してくれるディレクトリを用意。.patform/nginx以下に上書きや追加したいファイルを配置するとデプロイ時に自動でインスタンスに展開してくれます。
例).platform/nginx/nginx.conf → /etc/nginx/nginx.conf
3. timezoneの設定方法をtimedatectlに変更
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
↓
timedatectl set-timezone Asia/Tokyo
Amazon Linux 2はCentOS7ベースと言われているのでタイムゾーン設定をtimedatectlで行うよう変更。
ちなみにAmazon Linux AMIの方はCentOS6ベースと言われています。
4. eb deploy時の不要なファイルを記載するファイルの名前を変更
.gitattributes
→ .ebignore
eb deploy時に作成されるソースバンドルに含めないファイルを記載するファイル名を変更。.gitignore的なやつですね
5. おまけ)EBデプロイ時のログファイル名が変更
/var/log/eb-activity.log
→ /var/log/eb-engine.log
まとめ
移行自体はブルーグリーンデプロイで行っていますが、そちらはEBの環境 URL
のスワップを使用したらほぼワンクリックで行うことができました。
今更ながらAmazon Linux 2への移行を行いましたが、こういった作業が初めてだったため良い勉強になりました。特に公式ドキュメントを読み込むことの大切さを学べた気がします。
参考
- Elastic Beanstalk Linux アプリケーションを Amazon Linux 2 に移行する - AWS Elastic Beanstalk
- Docker プラットフォームの使用 - AWS Elastic Beanstalk
- Docker の設定 - AWS Elastic Beanstalk
- Elastic Beanstalk Linux プラットフォームの拡張 - AWS Elastic Beanstalk
- Elastic Beanstalk で Amazon Linux AMI とAmazon Linux 2 の違い - Qiita
- ElasticBeanstalkでAmazonLinux2 Ruby環境にデプロイする - bagelee(ベーグリー)