🤖

ECSでExpressをデプロイしてみた

2023/11/04に公開

はじめに

業務で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公式サイトのハンズオン教材を参考に実施。
https://zenn.dev/program_panda/articles/d6fc8b147d7739#ecs作成
https://aws.amazon.com/jp/blogs/news/aws-hands-on-for-beginners-21/

手順の順番を記載する。

  1. expressを使用したプログラムを用意する
  2. dockerを使用して、No1で用意したプログラムのコンテナイメージを作成する
  3. ECRにNo2で作成したコンテナイメージをPUSHする
  4. ECSのAWSマネジメントコンソールでクラスターを作成する
  5. ECSのAWSマネジメントコンソールでタスク定義を作成する
  6. ECSのAWSマネジメントコンソールでサービスを作成する
  7. 動作確認を行う
  8. 作成したサービスを停止する(そのままにしていると課金されてしまうので必ず行うこと)

No1.expressを使用したプログラムを用意する

  1. 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で用意したプログラムのコンテナイメージを作成する

  1. No1で作成したプログラムのルートディレクトリにDockerfileを用意する。
FROM node:16.13.1

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000
CMD [ "node", "index.js" ]
  1. index.tsをコンパイルしてindex.jsを用意する。(コマンド:npx)
  2. ビルドを実行してコンテナイメージを作成する。(docker build -t 付けたいイメージ名 .)
  3. 作成したイメージからコンテナを作成し動作確認を行う(docker run -p 3000:3000 イメージ名)

No3.ECRにNo2で作成したコンテナイメージをPUSHする

  1. ECRのマネジメントコンソールからコンテナイメージを格納するリポジトリを作成する

  1. 作成したリポジトリの"プッシュコマンドの表示"ボタンをクリックして手順通りにイメージをPUSHする

No4.ECSのAWSマネジメントコンソールでクラスターを作成する

  1. ECSのマネジメントコンソールからクラスターを作成する
    選択する項目は任意なものを選べがいいが、"インフラストラクチャ"はFargateを選択すること

No5.ECSのAWSマネジメントコンソールでタスク定義を作成する

  1. ECRのマネジメントコンソールからタスク定義を作成する

  1. 新しいタスク定義を作成する
    任意な内容を入力していく。
    "インフラストラクチャの要件"はクラスター同様Fargateを選択。
    CPUとメモリは予算との相談だが、スペックは下げておく

"コンテナ - 1"
"コンテナの詳細"にはECRのURLを記載。
"ポートマッピング"は、アプリのポート番号を指定。(今回の場合は3000)

他の項目は任意

No6.ECSのAWSマネジメントコンソールでサービスを作成する

  1. No4で作成したクラスターのサービスを作成する
    "デプロイ設定"
    No5で作成したタスク定義を指定。
    常時起動するコンテナ数を指定する。

  2. "ネットワーク"
    VPCを設定する(アプリ用のVPCがなければ、作成すること)

  3. "ロードバランシング"
    新しいALBを作成。
    コンテナは、3000ポートのコンテナを選択
    新しいリスナーを作成には、HTTPを選択
    ターゲットグループは、HTTPでデフォルトのパスを指定

No7.動作確認を行う

作成したサービスのネットワークからDNS名を確認してアクセス。
サクセスして添付画像の文言が表示されればOK!

No8.作成したサービスを停止する

以下の順番でサービスを停止する。

  • ALB
  • TargetGroup
  • ECS Service の Task 数を 0 に変更
  • ECS Service の削除
  • クラスターの削除
  • VPC の削除
  • ECR の削除

参考サイト

Discussion