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
1. リポジトリの作成
2. Imageのプッシュ
ここの「プッシュコマンドを表示」をクリックして手順を表示
ローカルで全て手順通り打ち込む
3. クラスタの作成
「ネットワーキングのみ」を選択して「次のステップ」
名前などつける
この時、VPCの作成はしない(多分しても平気)。理由はここで色々設定しなくちゃならなくなるから。
右下の「作成」
4. タスク定義
サイドバーの「タスク定義」を開き、「新しいタスク定義の作成」をクリック
「Fargate」を選択し「次のステップ」をクリック
名前やメモリ割り当てなど色々入力していく
「タスクロール」はそのタスクから他のAWSのサービスを使いたい時には必要。ここでは空欄にする
「コンテナの追加」でリポジトリからイメージを選択する
リポジトリのイメージのURLは↓ここからとる
コンテナの追加の設定を行なっている時に「メモリ制限」という欄があるが、ここでサンプルだからって適当に1とか入れるとメモリ足りなくて起動できない可能性があるのである程度の数値入れる
「ポートマッピング」という欄があるが、ここではDockerfileでEXPOSEしてるポートを入れる。今回は3030
右下の「追加」をクリック
コンテナを追加できたら右下の「作成」をクリックして作成する
5. ロードバランサの作成
検索タブでec2を検索しそのページを開き、サイドバーの「ロードバランサー」を選択し、「ロードバランサーの作成」をクリック
ロードバランサーのタイプを選択する画面になるので、ALBを選択
Basic configuration
名前などの設定をしていく
Network mapping
ネットワークの設定をする。AZは最低2つ選択しなければいけない。
Security groups
セキュリティグループの設定
[Create new security group] を選択し新規のものを作成。既存のものでもいいが新規の方が何やってるかわかりやすいのでここでは新規作成する。
インバウンドルールに「カスタムTCP, ポート範囲80, ソースAnywhere 0.0.0.0/0」を追加
これにより、全てのipからのポート80へのリクエストが許可される。
新規作成が完了したらALBの設定画面で選択する。defaultなどが指定されてる場合は削除
Listeners and routing
リッスンするポートやルーティングの設定をする。
それぞれのリクエストに対してどこにルーティングするかを決めるために「ターゲットグループ」を指定する
ここではcreate target groupで新規作成する
ターゲットタイプはIPを選択して、Portにはフォワーディングしたいポートを指定。今回は3030
Nextを押したらRegister targetsというページが出てくる。ここではまだ対象のFargateは作成されていないので特に何もしない。
右下の[create target group]をクリックし作成。
作成されたらロードバランサ作成の画面に戻り、今作ったターゲットグループを選択する。
もしhttpsにしたい場合は[add listner]で追加する。
ここまでできたら右下の[Create load balancer]で作成
作成できたらロードバランサーのページで状態を見てみる。ここが「プロビジョニング」だと動かないので注意
6. サービスの作成
クラスターの詳細から「サービス」タブを選択。青いボタンの「作成」をクリック。
名前だとタイプだのを入力していく
「タスクの数」という項目があるがこれはなるべく少ない数の方がいい。後々スケールできるので。逆にここを50とかにすると常に50起動してしまうことになりコストがかかる。
入力が終わったら右下の「次のステップ」
ネットワーク構成の画面が出てくるのでネットワークを設定してく
ここではvpcはデフォルトのもの。
サブネットはALBでAZとして指定したものを使う。(ただこれはもしかしたら間違ってるかもしれない)
下に行くと「ロードバランサーの種類」があるのでALBを選択
「ロードバランサー名」には先程作成したものを選択
「ロードバランス用のコンテナ」という欄の中に「ロードバランサーに追加」というボタンがあるので追加
追加すると新たなコンテンツが現れる。その中の「プロダクションリスナーポート」を80:HTTPに指定
その少し下にある「ターゲットグループ名」で先程作成したターゲットグループを選択
右下の次のステップを押す。Auto Scalingを設定するページが出てくるがここは今は何もしない。次のステップ。
確認ページが出てくるので確認したら「サービスの作成」で作成する。
7. セキュリティグループの修正
今のままでALBのDNSにアクセスすると503エラーが返ってくる。
クラスタに割り当てたセキュリティグループを確認
セキュリティグループの画面で該当のものを選択し、[Edit inbound rules]をクリック
既存のルールを一旦削除する。
追加ボタンを押し↓のように設定する
セキュリティグループではALBで指定したものを選択。保存する。
8. 確認
該当のALBのDNSをコピーしてブラウザのURL欄に打ち込んで確認