ECSとFargateとALBでNodeサーバーを立てる

Hapi製APIサーバーをDockerコンテナ化したのでAWS上で動かしたかったのでECS, Fargateを使いデプロイすることにした。その手順を書いていく。

index.js

const Hapi = require("@hapi/hapi");

const init = async () => {
  const server = Hapi.server({
    port: 3030,
  });

  server.route({
    method: "GET",
    path: "/",
    handler: (req, h) => {
      console.log("run");
      return "Hello World!";
    },
  });

  await server.start();
  console.log("サーバー起動");
  console.log("Server running on %s", server.info.uri);
};

init();

Dockerfile

FROM node:12
RUN apt-get update
WORKDIR /app
COPY package*.json /app
RUN npm install
COPY . /app
EXPOSE 3030
CMD node index.js

VPCとかの作成はここを参考

1. リポジトリの作成

ここからリポジトリを作成。

リポジトリ名を入力し、「リポジトリを作成」をクリック

2. Imageのプッシュ

f:id:ri99:20211009182216p:plain

ここの「プッシュコマンドを表示」をクリックして手順を表示

ローカルで全て手順通り打ち込む

3. クラスタの作成

「ネットワーキングのみ」を選択して「次のステップ」

名前などつける

この時、VPCの作成はしない(多分しても平気)。理由はここで色々設定しなくちゃならなくなるから。

右下の「作成」

f:id:ri99:20211010160708p:plain

4. タスク定義

サイドバーの「タスク定義」を開き、「新しいタスク定義の作成」をクリック

「Fargate」を選択し「次のステップ」をクリック

名前やメモリ割り当てなど色々入力していく

「タスクロール」はそのタスクから他のAWSのサービスを使いたい時には必要。ここでは空欄にする

f:id:ri99:20211010162017p:plain

「コンテナの追加」でリポジトリからイメージを選択する

リポジトリのイメージのURLは↓ここからとる

f:id:ri99:20211010162422p:plain

コンテナの追加の設定を行なっている時に「メモリ制限」という欄があるが、ここでサンプルだからって適当に1とか入れるとメモリ足りなくて起動できない可能性があるのである程度の数値入れる

「ポートマッピング」という欄があるが、ここではDockerfileでEXPOSEしてるポートを入れる。今回は3030

右下の「追加」をクリック

f:id:ri99:20211010163207p:plain

コンテナを追加できたら右下の「作成」をクリックして作成する

5. ロードバランサの作成

検索タブでec2を検索しそのページを開き、サイドバーの「ロードバランサー」を選択し、「ロードバランサーの作成」をクリック

ロードバランサーのタイプを選択する画面になるので、ALBを選択

f:id:ri99:20211010164103p:plain

Basic configuration

名前などの設定をしていく

f:id:ri99:20211010165051p:plain

Network mapping

ネットワークの設定をする。AZは最低2つ選択しなければいけない。

f:id:ri99:20211010165236p:plain

Security groups

セキュリティグループの設定

[Create new security group] を選択し新規のものを作成。既存のものでもいいが新規の方が何やってるかわかりやすいのでここでは新規作成する。

インバウンドルールに「カスタムTCP, ポート範囲80, ソースAnywhere 0.0.0.0/0」を追加

これにより、全てのipからのポート80へのリクエストが許可される。

f:id:ri99:20211010170322p:plain

新規作成が完了したらALBの設定画面で選択する。defaultなどが指定されてる場合は削除

f:id:ri99:20211010170629p:plain

Listeners and routing

リッスンするポートやルーティングの設定をする。

それぞれのリクエストに対してどこにルーティングするかを決めるために「ターゲットグループ」を指定する

ここではcreate target groupで新規作成する

ターゲットタイプはIPを選択して、Portにはフォワーディングしたいポートを指定。今回は3030

f:id:ri99:20211010171821p:plain

Nextを押したらRegister targetsというページが出てくる。ここではまだ対象のFargateは作成されていないので特に何もしない。

右下の[create target group]をクリックし作成。

作成されたらロードバランサ作成の画面に戻り、今作ったターゲットグループを選択する。

f:id:ri99:20211010172413p:plain

もしhttpsにしたい場合は[add listner]で追加する。

ここまでできたら右下の[Create load balancer]で作成

作成できたらロードバランサーのページで状態を見てみる。ここが「プロビジョニング」だと動かないので注意

f:id:ri99:20211010172851p:plain

6. サービスの作成

クラスターの詳細から「サービス」タブを選択。青いボタンの「作成」をクリック。

f:id:ri99:20211010173410p:plain

名前だとタイプだのを入力していく

「タスクの数」という項目があるがこれはなるべく少ない数の方がいい。後々スケールできるので。逆にここを50とかにすると常に50起動してしまうことになりコストがかかる。

f:id:ri99:20211010173846p:plain

入力が終わったら右下の「次のステップ」

ネットワーク構成の画面が出てくるのでネットワークを設定してく

ここではvpcはデフォルトのもの。

サブネットはALBでAZとして指定したものを使う。(ただこれはもしかしたら間違ってるかもしれない)

f:id:ri99:20211010174623p:plain

下に行くと「ロードバランサーの種類」があるのでALBを選択

ロードバランサー名」には先程作成したものを選択

f:id:ri99:20211010174934p:plain

「ロードバランス用のコンテナ」という欄の中に「ロードバランサーに追加」というボタンがあるので追加

追加すると新たなコンテンツが現れる。その中の「プロダクションリスナーポート」を80:HTTPに指定

その少し下にある「ターゲットグループ名」で先程作成したターゲットグループを選択

f:id:ri99:20211010175620p:plain

右下の次のステップを押す。Auto Scalingを設定するページが出てくるがここは今は何もしない。次のステップ。

確認ページが出てくるので確認したら「サービスの作成」で作成する。

7. セキュリティグループの修正

今のままでALBのDNSにアクセスすると503エラーが返ってくる。

クラスタに割り当てたセキュリティグループを確認

f:id:ri99:20211010181701p:plain

セキュリティグループの画面で該当のものを選択し、[Edit inbound rules]をクリック

f:id:ri99:20211010181846p:plain

既存のルールを一旦削除する。

追加ボタンを押し↓のように設定する

f:id:ri99:20211010182438p:plain

セキュリティグループではALBで指定したものを選択。保存する。

8. 確認

該当のALBのDNSをコピーしてブラウザのURL欄に打ち込んで確認

参照

https://www.youtube.com/watch?v=o7s-eigrMAI