ECSでRails 7.2製のアプリを動かすための最低限の設定

はじめに

先日より、RailsアプリをECS(Fargate)で動かすことを実施しています。今回はECSの設定です。

当初はCDKを使って実装しようとしていましたが、あまりうまくいかなかったこともあり、コンソール上で実装することにしました。

なお、今回動かそうとしているRailsアプリは以下の記事で実装したものです。

miyohide.hatenablog.com

このRailsアプリをコンテナイメージ化するには以下の記事が参考になるかなと思います。

miyohide.hatenablog.com

VPCの設計については以下の記事を参照してください。

miyohide.hatenablog.com

ECSの概要を把握する

ECSは色々と前提知識が必要なサービスです。クラスターとか、タスク定義とかサービスとかが出てきて単純にコンテナイメージを動かしたいだけなんですが色々と設計することが必要となります。詳細はBlackBeltの資料を確認すると良いかなと。

aws.amazon.com

タスク定義

概要を理解した後にタスク定義を設定します。色々と設定する項目がありますが、個人的に注意点は以下のところです。

  1. ポートマッピング3000を指定する

Railsの設定にもよりますが、デフォルトではRailsアプリは3000ポートで処理を受け付けます。ポートマッピングの値はそのポート番号に合わせる必要があります。

  1. 環境変数の設定

環境変数として以下のものを設定します。

  • RAILS_ENV
    • productionを指定
  • RAILS_LOG_TO_STDOUT
    • 1を指定(値は何でも良い。設定されていることが重要)
  • RAILS_SERVE_STATIC_FILES
    • 1を指定(値は何でも良い。設定されていることが重要)
  • RAILS_MASTER_KEY
    • 作ってあるRailsアプリのconfig/master.keyの中身。

他にはデータベースの接続先を環境変数で指定します。本当はここは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の値を参照させることを考えていましたがまずは動くことを優先しました。徐々に実装は変えていこうかなと考えています。