ECSでExpressをデプロイしてみた
はじめに
業務でECSを使用することになったのだが、ECSについてしらないことばかりなので学習した内容をメモしていく。
でてくる言葉
ECS
ECR
Fargate
EKS
そもそもECSとはなに?
AWS上でコンテナのデプロイや運用管理を行うフルマネージなコンテナオストレーションのことを言うみたい。
わからない用語を確認する
-
コンテナ
- 仮想化技術で使用するコンテナ技術なこと(Dockerが有名)
-
コンテナオストレーション
- コンテナを管理する技術なこと(Kubernetesが有名)
そしてECSは、コンテナの管理は行うけれども実行環境は別のサービスが行うようです。。
(よくわからなくなってきた)
どうやらコンテナ技術の実行環境には、FargateとEC2が選択できるようで
これからのサービスを使用してコンテナを動かして、ECSで管理していくようですね。
似たサービスとの比較
ECSには似たようなサービスでEKSも存在するようです。
違いとしては、EKSはKubernetesをベースに作られているサービスで、ECSはAWSオリジナルのソフトウェアで作られているようです。
EKSはKubernetesを使用しているので、すでに使用している人にはとっつきやすそうですね。
逆にECSはAWSのオリジナルなのでベンダーロックが怖いですが、学習コストは引くいようです。
(筆者はコンテナの経験が浅いのでECSから学習したいですね)
ECSの仕組み
ECSはコンテナを管理する仕組みとして、以下の概念があります。
タスク定義
タスク
サービス
クラスター
-
タスク定義
タスクのテンプレートをここで定義します。
内容としては、実行環境、コンテナ定義、割り当てるIAMロール(処理内でS3にアクセスする際に使う用) -
タスク
タスク定義に基づいて、起動するコンテナのこと。
1つのタスクで1つ以上のコンテナで構成されている。 -
サービス
タスクを管理する機能。
タスクの数やネットワーク設定を行う -
クラスター
サービスを管理するもの。
クラスターを分けることで、開発・検証環境など環境毎に分けることができる見たい。
ECSは上記仕組みを利用してFargetre or EC2上に稼働しているコンテナを管理しているようです。
ここでじゃあ元となるコンテナイメージはどこからもってくるのか気になりますよね。
コンテナイメージの管理については、ECRとゆうサービスが管理してくれます。
ECR上にコンテナイメージを配置してそこからコンテナイメージを取得しているようです。
図にするとこんな感じ。
大分イメージができてきましたね。
最後にマネジメントコンソール上で、実際にECSを使用してアプリをデプロイしてみたいと思います。
マネジメントコンソール上でのデプロイ
こちらのサイトとAWS公式サイトのハンズオン教材を参考に実施。
手順の順番を記載する。
- expressを使用したプログラムを用意する
- dockerを使用して、No1で用意したプログラムのコンテナイメージを作成する
- ECRにNo2で作成したコンテナイメージをPUSHする
- ECSのAWSマネジメントコンソールでクラスターを作成する
- ECSのAWSマネジメントコンソールでタスク定義を作成する
- ECSのAWSマネジメントコンソールでサービスを作成する
- 動作確認を行う
- 作成したサービスを停止する(そのままにしていると課金されてしまうので必ず行うこと)
No1.expressを使用したプログラムを用意する
- expressとtypescriptの環境構築を行い、プログラムを用意する。
import express from "express";
import type { Express, Request, Response } from "express";
const app = express();
const port = 3000;
app.get("/", (req: Request, res: Response) => res.send("Hello ECS!!!"));
app.listen(port, () => console.log(`Example app listening on port ${port}!`));
No2.dockerを使用して、No1で用意したプログラムのコンテナイメージを作成する
- No1で作成したプログラムのルートディレクトリにDockerfileを用意する。
FROM node:16.13.1
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "node", "index.js" ]
- index.tsをコンパイルしてindex.jsを用意する。(コマンド:npx)
- ビルドを実行してコンテナイメージを作成する。(docker build -t 付けたいイメージ名 .)
- 作成したイメージからコンテナを作成し動作確認を行う(docker run -p 3000:3000 イメージ名)
No3.ECRにNo2で作成したコンテナイメージをPUSHする
- ECRのマネジメントコンソールからコンテナイメージを格納するリポジトリを作成する
- 作成したリポジトリの"プッシュコマンドの表示"ボタンをクリックして手順通りにイメージをPUSHする
No4.ECSのAWSマネジメントコンソールでクラスターを作成する
- ECSのマネジメントコンソールからクラスターを作成する
選択する項目は任意なものを選べがいいが、"インフラストラクチャ"はFargateを選択すること
No5.ECSのAWSマネジメントコンソールでタスク定義を作成する
- ECRのマネジメントコンソールからタスク定義を作成する
- 新しいタスク定義を作成する
任意な内容を入力していく。
"インフラストラクチャの要件"はクラスター同様Fargateを選択。
CPUとメモリは予算との相談だが、スペックは下げておく
"コンテナ - 1"
"コンテナの詳細"にはECRのURLを記載。
"ポートマッピング"は、アプリのポート番号を指定。(今回の場合は3000)
他の項目は任意
No6.ECSのAWSマネジメントコンソールでサービスを作成する
-
No4で作成したクラスターのサービスを作成する
"デプロイ設定"
No5で作成したタスク定義を指定。
常時起動するコンテナ数を指定する。
-
"ネットワーク"
VPCを設定する(アプリ用のVPCがなければ、作成すること) -
"ロードバランシング"
新しいALBを作成。
コンテナは、3000ポートのコンテナを選択
新しいリスナーを作成には、HTTPを選択
ターゲットグループは、HTTPでデフォルトのパスを指定
No7.動作確認を行う
作成したサービスのネットワークからDNS名を確認してアクセス。
サクセスして添付画像の文言が表示されればOK!
No8.作成したサービスを停止する
以下の順番でサービスを停止する。
- ALB
- TargetGroup
- ECS Service の Task 数を 0 に変更
- ECS Service の削除
- クラスターの削除
- VPC の削除
- ECR の削除
Discussion