【AWS】ECS + FargateでRailsのサーバーレス環境構築する方法

aws

こんにちは!

エンジニアのオオイシ(@mako_0705)です!

前回に引き続き、AWSでRailsのサーバーレス環境を構築していきます。

全体の流れのうちの本記事では、

  1. Railsのコンテナ作成
  2. ECRにコンテナpush
  3. データベース(Amazon RDS)の作成
  4. ECS + Fargate の構築 ←今ここ
  5. CodePipeline で CI/CD 環境を作る

と言った位置付けです。

Amazon ECS(Amazon Elastic Container Service)とは、dockerコンテナを管理するためのサービスで、AWSでコンテナをうまい具合に増やしたり少なくしたりを調整してくれます。

AWS Fargateとはいわゆるサーバーレス環境のことで、煩雑な細かなサーバーの管理が不要です。

ECSはクラウドコンピューティング環境としてのFargateに対してEC2がありますが、サーバーリソースを気にしなくて良いメリットがあるので、Fargateを試してみることをおすすめします!

Black Belt で詳しいスライドがあるので、ぜひ、確認してみてください。

事前準備

ECSはDockerコンテナが前提となります。

Dockerを使ったRailsの開発環境の構築はこちらを参照してください。

作成したコンテナをリポジトリに登録する記事はこちらを参照してください。

RDSの作成はこちら。

ECSの簡単な用語説明

ECSでは主にクラスタタスクサービスの3つの機能を使って構築していきます。

  • タスクとは、コンテナの情報とCPU、メモリ量やネットーワークなどを定義するなどして、コンテナを起動するための情報を定義します。
  • サービスとは、タスクをWEBサービスのように常時起動するために定義します。
  • ECSクラスタとは、タスクとサービスを論理的なグループにまとめて一元管理します。

ECSクラスタを作成していきましょう。

(STEP1)ECSクラスタを作成する

「クラスターの作成」をクリックします。

Fargateを使うので「ネットワークのみ」を選択します。

クラスター名は任意です。

空っぽのクラスタが作成できました。

(STEP2)タスク定義

タスク定義とは、主にコンテナの実行に必要なCPU、メモリ、ネットワークや環境変数などをを定義します。

「新しいタスク定義の作成」をクリックします。

「FARGATEを選択。

タスク定義名は任意です。

その他はデフォルトでいいでしょう。

 

イメージはECRに登録したコンテナのイメージのURIを登録します。

ポートマッピングコンテナの解放ポートを登録します。

Railsでwebricを実行するための3000ポートとします。

production用の環境変数を登録します。

データベースは作成したRDSの値を入れてください。

RAILS_SERVE_STATIC_FILESはproduction環境で/public配下にアクセス可能にするためtrueを登録します。

/public/health.htmlを設置してALBからのヘルスチェックで利用します。

productionではSECRET_KEY_BASEも入れてください。

「作成」をクリックすると完了です。

(STEP3)サービスの作成

前項で作成したタスク定義をサービスに登録していきます。

外部インターネットからのHTTP(80)へのアクセスをコンテナに接続する為に、事前にALBの設定が必要です。

加えてセキュリティグループも作成も必要になってきます。(※割愛)

ALBの作成

ALBのターゲットグループはIPベースで作成してください。

なぜなら、ECSでコンテナを作成したり自動でスケールさせた場合に、AWSが自動的にターゲットグループにIPアドレスを登録しにいくからです。

サービスの登録

タスク定義したRailsをサービスに登録します。

起動タイプをFargateにしたらあとは任意で大丈夫です。

タスク数はコンテナを起動する数です。

今回はお試しなので1としています。

ヘルスチェック猶予期間とはALBがヘルスチェックするまでの待ち時間です。

Railsだとasset:precompileするのに時間がかかったりするので、

Task failed ELB health checks in XXXXX

などとエラーが出てコンテナが起動しないことがあるため360秒などで余裕を持たせましょう。

事前に作成したALBを選択します。

サービスの作成をクリックします。

しばらくするとしたサービス内のタスクの行が追加され

PROVISIONIN → PENDING → RUNNNING

に遷移するのを待ちます。

ちょっとまつ….

RUNNNING となればコンテナの起動完了です。

実行確認

実行していることを確認してみましょう。

スケールさせてみる

タスク数が1→3に増やしてみます。

変更します。

このようにコンテナを簡単に増やすことができました。

次回は、CodePipeLineを使ったCI/CD環境について紹介して行こうと思います!