91s

プログラミング関係、日記などを書きます

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)

自分の場合、sshで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

のように区別されていました