RailsのECS環境構築で詰まったこと
はじめに
Railsのstaging環境をECS上に構築するにあたり詰まったことをまとめました。
随時更新していきます。
前提
環境:Rails 6.0(nginxなし, unicornのみ), Ruby 2.7, ECS, CircleCI
ECS
[ipアドレス:ポート]にブラウザからアクセスしてもタイムアウトする
セキュリティグループのインバウンドルールに、
タイプ:カスタムTCP
ポート範囲:32768 - 61000
ソース:マイIP or 任意の場所(アクセス元となりうるIPアドレス)
という設定を追加するとブラウザからのアクセスができるようになるはずです。
ポート範囲は、ポートマッピングでホストポートを0に設定した場合(動的ポートマッピングを使用している場合)は上記の範囲で、それ以外は設定した値で
[ipアドレス:ポート]にブラウザからアクセスしてもアクセス拒否される
自分の場合にはなるのですが、動的ポートマッピングを使用している為、デプロイ毎にポートが変更される為、アクセスしたポートが古いものとなっている可能性があるので確認してみてください
サーバー起動には成功しているのにブラウザからアクセスできない
ターゲットグループのヘルスチェックを確認してみると原因がわかるかもしれません
サービスを更新したのにPENDINGのまま進まない(EC2)
docker container ls -a
を実行すると、終了したコンテナが多数(10個以上)、
docker image ls -a
を実行すると、手動デバッグしていた頃の不要イメージの数々が見つかりました。
その結果を元に、不要なイメージ・コンテナ等を削除した後に再度サービスのアップデートをすると無事RUNNINGになりました。
Rails
assets:precompileをどこでするか
Dockerfileの最下部に追加
rails db:migrateをどこでするか
ECSのタスク定義のコンテナ追加で、サーバー起動と同じイメージを使用してrails db:migrateだけをするコンテナを立てると簡単です。
CircleCI
aws-ecs/deploy-service-updateで失敗する
- familyに書かれたサービスがECS上で設定されていないのかもしれません
aws-ecs/deploy-service-updateの中のcontainer-image-name-updatesで複数のコンテナを指定したい
container-image-name-updates: 'container=コンテナ名,image-and-tag=イメージ名:タグ,container=コンテナ名,image-and-tag=イメージ名:タグ'
のように、container・image-and-tagを1セットとして列挙すると複数指定できる
参考:https://circleci.com/orbs/registry/orb/circleci/aws-ecs
複数のECSのサービスの更新をしたい
ステージング環境と本番環境の両方のデプロイを行いたいときに、どうやってworkflowを書けばいいか迷っていましたが、難しく考えずに
- aws-ecs/deploy-service-update:
を複数書けばいいだけでした。
複数指定した場合、CircleCI側で勝手に番号が振られ、
aws-ecs/deploy-service-update-1
aws-ecs/deploy-service-update-2
のように区別されていました