[AWS ECS] FargateとELBを使ってWebサイトを公開する

# この記事について

ECS FargateとELBを利用してWebサイトを公開する手順を記載します。
ECSとFargateについての説明はこちらの記事をご参照ください。

https://qiita.com/K5K/items/0d8dbdb39fbb0375e2bd

また、以下のURLより動画でこちらの手順を視聴することもできます。
https://www.youtube.com/live/0NR8SiYvNCI?feature=share


この記事ではNGINXをインストールしたコンテナをFargateで動かして、ELBで負荷分散させるという最近だとオーソドックスな構成になっているWebサイトを実装します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/7784597a-f3f5-7346-138b-70c475385c45.png)

# やること

手順は以下の通りになります。

- 0 NWリソース作成
- 1 コンテナイメージの作成、ECRへPUSH
- 2 ALBの作成
- 3 クラスターの作成
- 4 タスク定義の作成
- 5 サービスの作成

# 0 NWリソース作成

以下のネットワークリソースを作成します。

- VPC
- インターネットGW
- サブネット(ルートテーブル含む)
    - Public x 2
        - デフォルトルート : インターネットGW
    - Private x 2
        - デフォルトルート：NAT GW
- NAT GW
- セキュリティグループ
    - ALB用
        - Ingress : 80 : ALL
        - Egress : ALL : ALL
    - ECS用
        - Ingress : 80 : from ALB sg
        - Egress : ALL : ALL

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/2c2985e2-2b9c-ae0c-be74-be180cea6ad0.png)


# 1 コンテナイメージの作成、ECRへPUSH


AWSマネージメントコンソールにログインします。

ECSの画面からRepositoriesを選択して、「リポジトリを作成」をクリックします。
(リポジトリは公開する用途ではないため、プライベートにします)

リポジトリ名をtest-webとします。それ以外はデフォルトで「リポジトリを作成」をクリックします。

リポジトリができたことを確認してから、ローカル環境などでDockerイメージを作成します。

```plaintext:Dockerfile
FROM nginx:latest
COPY index.html /usr/share/nginx/html
EXPOSE 80
```

```plaintext:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>test-web</title>
</head>
<body>
  <h1>Welcome to Test Website!!</h1>
  <a>This is website on ecs fargate</a>
</body>
</html>
```

イメージをビルドします。

```plaintext
❯ docker build -t test-web .
```

イメージが作成されたことを確認します。
(IMAGE IDは後から必要になるので控えておいてください)

```
❯ docker image ls test-web
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
test-web     latest    39fc2c76a938   2 minutes ago   142MB
```


ECRにイメージをプッシュします。 [参考](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-push-ecr-image.html)


```
# ECRにログイン
> aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com

# ECRにプッシュするためのタグを付与(控えておいたIMAGE IDに対してタグを付与)
❯ docker tag 39fc2c76a938 xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-web:1.0

# ECRにプッシュ
❯ docker push xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-web:1.0
```


# 2 ALBの作成

AWSマネジメントコンソールからEC2の画面に遷移し、ロードバランサーから「Create load balancer」をクリックします。

以下のようにALBを作成します。

| 項目 | 値 | 備考 |
| --- | --- | --- |
| ロードバランサー名 | test-web-alb |  |
| スキーム | インターネット向け  |  |
| IPアドレスタイプ | IPv4 |  |
| VPC |  作成していたVPC |  |
| マッピング | 作成していたパブリックサブネット2つ |  |
| セキュリティグループ | 作成していたSG  |  |

同時にターゲットグループも作成します。
(この時点ではターゲットの登録は行いません、ECSサービス作成時に行います)

| 項目 | 値 | 備考 |
| --- | --- | --- |
| ターゲットタイプの選択 | IPアドレス  | 重要 |
| ターゲットグループ名 | test-web-tg |  |
| プロトコル：ポート | HTTP:80  |  |
| VPC | 作成していたVPC | |

# 3 クラスターの作成

以下の通りクラスターを作成します。

| 項目 | 値 | 備考 |
| --- | --- | --- |
| クラスターテンプレート | ネットワーキングのみ  |  |
| VPCとサブネット | 作成していたVPCとプライベートサブネット2つ |
| クラスター名 | test-web-cluster |  |

# 4 タスク定義の作成

以下の通りタスク定義を作成します。

| 項目 | 値 | 備考 |
| --- | --- | --- |
| 起動タイプ | FARGATE  |  |
| タスク定義ファミリー | test-web-taskdef |  |
| コンテナ 名前 | test-web-container  | xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-web:1.0 |
| コンテナ イメージURI | ECRにプッシュしたURI |  |
| コンテナ ポート/プロトコル | 80/TCP | |
| アプリケーション環境 | Fargate | |
| CPU | .25vCPU | タスクに使用されるCPU |
| メモリ | .5 GB |タスクに使用されるメモリ容量 |
| タスクロール | なし |  |
| タスクの実行IAMロール | デフォルト(ecsTaskExecutionRole)  |  |
| ログ収集の使用| チェックなし| ログの収集はしない |


# 5 サービスの作成

| 項目 | 値 | 備考 |
| --- | --- | --- |
| コンピューティングオプション | 起動タイプ | |
| 起動タイプ/プラットフォームのバージョン | FARGATE/LATEST |  |
| アプリケーションタイプ | サービス | |
| オペレーティングシステムファミリー | Linux |  |
| タスク定義 ファミリー | test-web-taskdef |  |
| サービス名 | test-web-service |  |
| サービスタイプ | レプリカ | |
| 必要なタスク | 1  |  |
| VPCとサブネット | 作成していたVPCとプライベートサブネット2つ |
| セキュリティグループ | 作成していたSG |  |
| パブリックIP | 割り当てない |  |
| ロードバランシング ロードバランサーの種類 | ALB |  |
| ロードバランシング ロードバランサー | test-web-alb | 作成していたロードバランサー |
| ロードバランシング ロードバランス用のコンテナ | test-web-container:80:80 |  |
| ロードバランシング リスナー | 80:HTTP | | 
| ロードバランシング ターゲットグループ名 | test-web-tg |  |

# 動作確認

ALBのエンドポイントにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/583eacaa-5583-7bf4-3216-780b3c0f2484.png)

Webサイトが公開できていることを確認してください。