Chapter 17

AWS ECS(バックエンド編)

hibriiiiidge
hibriiiiidge
2020.10.23に更新
このチャプターの目次

それでは前章で ECR に登録した image を使って ECS にデプロイをしていきます。
基本的にはフロントエンドでのデプロイと同じで、

  1. タスク定義でタスクを登録する
    1. で登録したタスクを用いたサービスを作成する

という流れです。
フロントエンド編で実装した部分と重なる部分が多いので、詳細は割愛して大まかな流れと入力値、フロントエンドと異なる点にフォーカスして記載します。

1. タスク定義

「起動タイプの互換性の選択」で「Fargate」を選択します。
「タスクとコンテナの定義の設定」の入力値は以下です。

項目
タスク定義名 zenn-app-task-backend(任意の値)
タスクロール ecsTaskExecutionRole
タスク実行ロール ecsTaskExecutionRole
タスクメモリ 0.5GB
タスク CPU (vCPU) 0.25vCPU

「コンテナの定義」の入力値は以下です。

項目
コンテナ名 zenn-app-container-backend(任意の値)
イメージ xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/zenn-app-backend
ポートマッピング 80

ポートマッピングは 80 ポートを指定します。(フロントエンドでは 3000 ポートでした。)
また、「環境変数」では以下のキーと値を入力します。

キー
RAILS_ENV production
RAILS_LOG_TO_STDOUT true
DATABASE_URL zenn_app_database_url
RAILS_MASTER_KEY zenn_app_rails_master_key

この zenn_app_database_urlzenn_app_rails_master_key は SystemManager で設定した値がセットされることになります。

以上で、タスク定義の入力は完了なので、[作成] ボタンをクリックしてください。

続いて、サービスを作成していきます。

2. サービスの作成

「サービスの設定」では以下の値をセットしてください。それ以外はデフォルトで OK です。

項目
起動タイプ FARGATE
タスク定義 zenn-app-task-backend
サービス名 zenn-app-service-backend
タスク数 1

「ネットワーク構成」では、「クラスター VPC」、「サブネット」共にデフォルトのものを選択します。
セキュリティグループについては、「新しいセキュリティグループの作成」を選択し、以下の値を入力します。

項目
セキュリティグループ名 zenn-app-security-group-backend(任意)
インバウンドルール HTTP/TCP/80/あらゆる場所/0.0.0.0/0,::0

「ロードバランシング」については、バックエンドの ECS においても ALB を ECS の前に設置するので、バックエンド用のロードバランサーを作成します。

[Amazon EC2 コンソール] リンクをクリックし、ロードバランサーのダッシュボードに進みます。

そして、フロントエンドのロードバランサーと同様のフローでロードバランサーの設定を行います。
ロードバランサー名やセキュリティグループ名、ターゲットグループ名は適宜変えてください。
今回は以下の名前で作成した前提で進めていきます。

項目
ロードバランサー名 zenn-app-alb-backend
セキュリティグループ名 zenn-app-alb-security-group-backend
ターゲットグループ名 zenn-app-alb-security-group-backend

フロントエンドのロードバランサー作成時も記載していますが、ここのターゲットグループは実際には使用せず、スキップできないので作るという感じです。実際には ECS の画面で作成するターゲットグループを使用します。

ロードバランサーを作成したら、この時点でロードバランサーの DNS 名をドメイン登録します。
Route53のダッシュボードを開き、フロントエンドの時と同様に、 レコードの作成画面に進んでいきます。
ルーティングポリシー > シンプルなレコードを定義 と進み、以下のように登録します。

これで、 http://backend.hibriiiiidge.com でロードバランサーの DNS である zenn-app-alb-backend-xxxxxx.ap-northeast-1.elb.amazonaws.com にアクセスすることができます。

そしてようやく ECS の画面に戻り、ロードバランサーの [リロードボタン] をクリックし、先ほど作成したロードバランサーを選択します。

そして「ロードバランス用のコンテナ」で以下の設定を追加します。

項目
プロダクションリスナーポート* 80:HTTP
ターゲットグループ名 ecs-zenn-app-service-tg-backend
ターゲットグループのプロトコル HTTP
パスパターン /
評価順 1
ヘルスチェックパス /api/v1/backend

そして、ステップを進み、最後に [サービスの作成] ボタンをクリックします。
そして ECS のステータスが更新されるのを待ちます。
...が、しかし、このままだとステータスは [STOPPED] になってしまいます。

CloudWatch Log を確認してみます...

すると、エラーが出ていることがわかるかと思います。

Mysql2::Error::ConnectionError: Can't connect to MySQL server on 'zenn-app-database.xxxxx.ap-northeast-1.rds.amazonaws.com'

MySQL への接続でエラーが出ていることがわかります。

対応としては、RDS のセキュリティグループのインバウンドルールに、バックエンドのコンテナのセキュリティグループを追加し、バックエンドのコンテナからの通信を許可してあげる必要があります。

バックエンドのコンテナのセキュリティグル-プ名は zenn-app-security-group-backend なので、それを選択し、 [ルールを保存] をクリックします。

しばらくして、 タスクのステータスが [RUNNING] になれば OK です。

最後に、 http://hibriiiiidge.com で [タスク取得] ボタンをクリックします。
以下のようにタスクが表示されれば OK です。

もしうまくいかない場合は、CloudWatch Log でエラーメッセージを確認してどこがうまくいっていないのかを確認してください。
私は、ロードバランサーのリスナーがルールが適切でなくて(ターゲットを向いていなくて)、ハマりました...