概要
下記の記事を参考に、RailsアプリケーションがFargate上で動作するよう設定を行ったが、そのままでは動作せず。発生した事象と対応についてまとめ。
環境
-
アプリ
- ruby 3.0.2
- rails 6.1.4
- mysql 8.0.31
-
インフラ
基本的に元記事の通り。
HTTPSでアクセスできるようSSL化まで行っている、
ローカル→(HTTPS)→ALB→(HTTP)→Fargate⇄RDS
の状態。
タスクを起動し、ドメイン名からアクセスすると、503 service temporarily unavalibanleエラーとなる
各種設定が完了したので、Fargateを起動しようと、下記操作を実施した。
タスク詳細のログでも正常に起動していることが確認できた。
しかし、この状態で、ドメイン名からアクセスをすると、503 service temporarily unavalibanleエラーとなる。
原因:サービスからではなくスタンドアロンでタスクを実行していた
タスクには、
- スタンドアロンのタスク
- サービスタスク
の2種類が存在する。
これまで起動していたのは、スタンドアロンのタスクであり、
ALBを介したアクセスを実現するためには、サービスからタスクを起動する必要がある。
参考
サービスタスクの起動
元記事に沿ってサービス自体は作成していたため、そちらを利用。
これで、サービスに紐付けられているタスクが起動する。
サービスから起動されたタスクは、対象タスクの詳細で、
グループ service:サービス名
となっている。
タスクが起動→停止→再起動を繰り返しており、依然アクセスできない
上記までの操作で、サービスからタスクを実行することができたが、実行されたタスクが、自動的に起動→停止→再起動を繰り返している。
ALBに設定しているターゲットグループのHealth status details
は、Health checks failed
となっている。
原因:ALBのヘルスチェックが失敗していることで、タスクが停止されていた
参考
(抜粋)
ALBのヘルスチェックで異常と判定したターゲットに紐づくECSタスクはECSが停止します
そしてサービスに設定したタスクの数に達するまで新しいタスクを作成します
ヘルスチェックが失敗する原因は?
①セキュリティグループの設定がうまくできていない
サービスタスクのセキュリティグループは、サービス作成時に設定する必要あり。
更新では修正できなかったため、作り直す。
このセキュリティグループのインバウンドのルールにて、ALBからのアクセスを許可すればOK。
タスクのログにて、compile完了後であれば、curl http://タスクIP
で疎通が確認できる状態となった。
しかし、compile完了とほぼ同時に、タスクが停止→再起動されてしまう。
この時点では、ALBに設定しているターゲットグループのHealth status details
は、Health checks failed with these codes: [502]
となっている。
②アプリケーション起動完了前にヘルスチェックが実行されている
タスクのログでは、タスク起動直後から断続的にヘルスチェックが実行され、compile完了時点で規定の失敗回数に達してしまっていることで、ヘルスチェック失敗とみなされているように見受けられた。
アプリケーション起動完了後にヘルスチェックが開始されるようにするため、下記設定を行う。
参考
ここまでの設定を行うことで、ブラウザ上で、ドメイン名からアプリケーションにアクセスすることができた。
最後に
より良い方法や間違い等ありましたらご指摘いただけますと幸いです!