はじめに
先日より、RailsアプリをECS(Fargate)で動かすことを実施しています。今回はECSの設定です。
当初はCDKを使って実装しようとしていましたが、あまりうまくいかなかったこともあり、コンソール上で実装することにしました。
なお、今回動かそうとしているRailsアプリは以下の記事で実装したものです。
このRailsアプリをコンテナイメージ化するには以下の記事が参考になるかなと思います。
VPCの設計については以下の記事を参照してください。
ECSの概要を把握する
ECSは色々と前提知識が必要なサービスです。クラスターとか、タスク定義とかサービスとかが出てきて単純にコンテナイメージを動かしたいだけなんですが色々と設計することが必要となります。詳細はBlackBeltの資料を確認すると良いかなと。
タスク定義
概要を理解した後にタスク定義を設定します。色々と設定する項目がありますが、個人的に注意点は以下のところです。
- ポートマッピングは
3000
を指定する
Railsの設定にもよりますが、デフォルトではRailsアプリは3000ポートで処理を受け付けます。ポートマッピングの値はそのポート番号に合わせる必要があります。
- 環境変数の設定
環境変数として以下のものを設定します。
- RAILS_ENV
- productionを指定
- RAILS_LOG_TO_STDOUT
- 1を指定(値は何でも良い。設定されていることが重要)
- RAILS_SERVE_STATIC_FILES
- 1を指定(値は何でも良い。設定されていることが重要)
- RAILS_MASTER_KEY
- 作ってあるRailsアプリの
config/master.key
の中身。
- 作ってあるRailsアプリの
他にはデータベースの接続先を環境変数で指定します。本当はここはSecrets Managerの値を参照させたかったのですが、ちょっと上手くできずに今回は断念しました。
ALBのターゲットグループ
ECSの前段にALBを設置する場合、ターゲットグループのポート番号が3000になっていることを確認することも注意点の一つです。これが設定できていないと、ECSではアプリが起動しているが、ALBとしてはアプリとのヘルスチェックが通らないため起動に失敗したとみなされます。結果として少し時間が経つと勝手にアプリが終了する事象に遭遇してしまいます。
Railsアプリの修正
Railsアプリでも修正が必要です。config/environments/production.rb
にてconfig.force_ssl = true
の記述をconfig.force_ssl = false
にします。
ALBからのヘルスチェックの確認がHTTPで送られててもRailsアプリからHTTPSの使用を強制され、いつまで経ってもヘルスチェックが通らないことに陥ります。本当はHTTPSを通るようにしたかったのですが、まずは動くことを優先しました。
考察
以上のことを対処することでRailsアプリをECSで動かすことができました。ECSは色々と前提知識が必要となるサービスなので、動かすのも一苦労です。わかってしまえば簡単なのですが、久しぶりに触ると色々と忘れていて手間取りました。今回はRailsアプリ固有の設定誤りもあり、複数の構成要素があると一度動かなくなった場合原因究明が難しくなるのがECSの難しいところかなと思います。
当初はCDKで実装しようとしたり、Secrets Managerの値を参照させることを考えていましたがまずは動くことを優先しました。徐々に実装は変えていこうかなと考えています。