AWS ECS on Fargate チュートリアル Level 2

## はじめに
AWSのFargateを使ってみたいけど、何から始めていいかわからない...という方へ。
一緒に超シンプルな構成を試して「これがFargateか😃」を体感してみましょう！の第２弾です。
具体的には、パブリックサブネットにECSを構築しDjangoとNginxの２つのコンテナを起動します。

ちなみに、第1弾はこちら。
Dockerfileとhtmlファイルを使ってNginxコンテナを起動しました。

https://qiita.com/yuzu_ponz007/items/a07cc611871c1e1cfd10

第1弾は魔法ファイルをCloudFormationにアップロードしてVPCやセキュリティグループ、ロールなどを自動で構築しましたが、今回はコンソール画面で作っていきますよ。

:::note inf
AWS ECS on Fargateを使って簡易アプリを動かすまでの手順をまとめました。 
:::


## やってみよう
**前提** : AWSにログインしている。GitとLinuxコマンドチョット分かる

以下の手順で進めます。作業にかかる時間は50分ほどです。
ゴールはFargateでコンテナ起動し「Hello,World！」の画面を表示することです。

1.ロールを作成する
2.VPCとセキュリティグループを作成する
3.ECRにリポジトリを作成
4.CloudWatchにロググループを作成する
5.GitHubから簡易アプリをクローンする
6.リポジトリにDockerイメージをプッシュする
7.タスク定義を作成する
8.クラスターを作成する
9.サービスを作成する
10.「これがFargateか😃」を体感
11.CloudWatchのログを見てみよう

それではチュートリアルスタートです。


## 1.ロールを作成する

IAM → ロール →「ロールを作成」をクリック

![ロール作成1のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/a5a86a42-8146-4c4d-999a-db7606105d0c.png)

![ロール作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/6a082ccc-64be-4908-b245-4c7949198f30.png)

![ロール作成3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/f2e32444-9450-484d-b5df-088c4c4d9425.png)

![ロール作成4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/839fccbd-b1d3-4641-8449-2c82ef2f7aa4.png)

![ロール作成5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/faf669dd-48d0-4763-acbe-5d74a80d1b5d.png)

ロール名は「ecsTaskExecutionRole」にしてください。後で作成するタスク定義と合わせるためです。
![ロール作成6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/cc36fc71-32d0-49a1-945a-b3c482ba45c3.png)

追加されました
![ロール作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/c388050a-d27b-45f3-9723-3b849033cdb3.png)



## 2.VPCとセキュリティグループを作成する
VPC-> 「VPCを作成」をクリックし、画像のようにVPCを作成します
![VPC作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/5f271f2c-230d-4051-9435-c6e5a42cf98d.png)

![VPC作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/35f6d83b-f558-4d7a-9b62-195640c2469f.png)

![VPC作成3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/dea19faf-ad49-445c-b4f3-7d7a5dab84fe.png)

![VPC作成4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/16ab659a-5a57-42a9-bd9e-c6b078094b04.png)

セキュリティグループも作成します
![SG作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/219a5ab9-7af9-41ac-b168-4f2570bbd438.png)

![SG作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/89dfacdb-b913-4b49-bde0-9dd219cc165d.png)


## 3.ECRにリポジトリを作成
Django用とNginx用に２つのリポジトリを作成します。
リポジトリ名はそれぞれ「reverse-proxy-django-app」と「reverse-proxy-django-nginx」にしてください。後で作成するタスク定義に合わせるためです。

![スクリーンショット 2025-04-05 8.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/6de254f2-3ec5-4a61-9740-2a72f7568bb8.png)

## 4.CloudWatchにロググループを作成する

どの画面でも構いませんので、画面左下にあるCloudShellを開いてください。

![スクリーンショット 2025-04-05 8.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/2fa751d8-8240-4b61-855e-7ad28c6eb450.png)

CloudShellで下記コマンドを実行します
```ruby:CloudWatch にロググループが存在するか確認
aws logs describe-log-groups --query "logGroups[*].logGroupName"
```
```ruby:ロググループが存在しない場合は下記コマンドで作成
aws logs create-log-group --log-group-name "/aws/ecs/reverse-proxy-cluster"
```

## 5.GitHubから簡易アプリをクローンする
以下のGitHubリポジトリを使用させていただきます

https://github.com/free-honda/reverse-proxy-django-prd

CloudShellで下記コマンドを実行します

```ruby:GitHubからリポジトリをクローンする
git clone https://github.com/free-honda/reverse-proxy-django-prd.git
```

## 6.リポジトリにDockerイメージをプッシュする
ECS → リポジトリ → 「reverse-proxy-django-app」をクリック → CloudShellを開き、CloudShell内でdjango_appディレクトリに移動してください

![スクリーンショット 2025-04-05 8.44.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/0974c347-30d6-434a-a8d7-42bf943af93d.png)

コンソール画面の「プッシュコマンドを表示」をクリックし、４つのコマンドを実行します

![スクリーンショット 2025-04-05 8.44.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/914db230-9c00-4b0f-bb58-a3c5c434db25.png)

![スクリーンショット 2025-04-05 15.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/e6c14026-8c6a-4859-bc20-fa4a9e07c164.png)

更新ボタンを押してみてください
「reverse-proxy-django-app」リポジトリにイメージをプッシュできました


![スクリーンショット 2025-04-05 8.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/c9db5c30-3a03-41bb-a8a0-1913ae3a5e91.png)


<br>
次は「reverse-proxy-django-nginx」リポジトリにイメージをプッシュします

リポジトリ → 「reverse-proxy-django-nginx」をクリック → CloudShellを開き、CloudShell内でreverse-proxy-django-prdディレクトリに移動

![スクリーンショット 2025-04-05 8.52.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/f89c8568-9ecf-47a0-b38a-744344f5ce9a.png)

:::note warn
再度「プッシュコマンドを表示」のコマンドを実行しますが、
2つ目のコマンドの代わりに下記を実行してください
```ruby:Nginx のビルド
docker build -t reverse-proxy-django-nginx -f nginx.Dockerfile .
```
:::

「reverse-proxy-django-nginx」リポジトリにイメージをプッシュできました

![スクリーンショット 2025-04-05 8.54.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/1877ead8-eb22-4795-87ca-cd241b4f403d.png)



## 7.タスク定義を作成する
ECS → タスク定義　→ 新しいタスク定義の作成 → JSONを使用した新しいタスク定義の作成
![タスク定義1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/d4bc2812-c7f7-47f8-a5ed-90c1da8ed227.png)

編集画面内に下記のJSONをペーストします
ただし「xxx」の部分はご自身のアカウントIDに変更してください。３カ所あります。
```ruby
{
  "family": "reverse-proxy-task",
  "executionRoleArn": "arn:aws:iam::xxx:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "1024",
  "memory": "2048",
  "containerDefinitions": [
      {
          "name": "django",
          "image": "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/reverse-proxy-django-app",
          "cpu": 512,
          "memory": 1024,
          "portMappings": [
              {
                  "containerPort": 8000,
                  "protocol": "tcp"
              }
          ],
          "essential": true,
          "environment": [
              {
                  "name": "DJANGO_SETTINGS_MODULE",
                  "value": "mysite.settings"
              },
              {
                  "name": "DJANGO_SECRET_KEY",
                  "value": "your-secret-key"
              },
              {
                  "name": "STATIC_ROOT",
                  "value": "/app/staticfiles"
              }
          ],
          "logConfiguration": {
              "logDriver": "awslogs",
              "options": {
                  "awslogs-group": "/aws/ecs/reverse-proxy-cluster",
                  "awslogs-region": "ap-northeast-1",
                  "awslogs-stream-prefix": "ecs"
              }
          }
      },
      {
          "name": "nginx",
          "image": "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/reverse-proxy-django-nginx",
          "cpu": 512,
          "memory": 1024,
          "portMappings": [
              {
                  "containerPort": 80,
                  "protocol": "tcp"
              }
          ],
          "essential": true,
          "logConfiguration": {
              "logDriver": "awslogs",
              "options": {
                  "awslogs-group": "/aws/ecs/reverse-proxy-cluster",
                  "awslogs-region": "ap-northeast-1",
                  "awslogs-stream-prefix": "ecs"
              }
          }
      }
  ]
}

```

![タスク定義2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/b97e9e21-e088-40d9-aa7d-5dc3669f66eb.png)



## 8.クラスターを作成する

![スクリーンショット 2025-04-05 8.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/6855c599-723b-43c6-9abc-da00b33122a7.png)

![スクリーンショット 2025-04-05 8.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/d48f6931-0767-48aa-821a-c700b0cba841.png)


## 9.サービスを作成する
サービスを作成します。
![スクリーンショット 2025-04-05 8.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/d0ccf9f5-5266-4733-8c79-2d830a332f8f.png)

![スクリーンショット 2025-04-05 9.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/e33866c4-03c0-4c37-b3c6-ca4276c95b6a.png)

![スクリーンショット 2025-04-05 9.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/5d0fc21f-25fe-4d11-9800-97d9e21f1f55.png)

VPCやセキュリティグループは自分で作成したものに変更してください
![スクリーンショット 2025-04-05 9.25.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/ee4d8722-e4d6-4bfb-8e42-19eb81414038.png)

サービスをクリック
![スクリーンショット 2025-04-05 9.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/309e6dcc-a70b-40ee-bd70-952ceadfc91b.png)



## 10.「これがFargateか😃」を体感
タスクをクリック
![スクリーンショット 2025-04-05 9.28.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/ad98973d-f5f6-43a9-bc27-dcd43e31cdec.png)

２つのコンテナが起動できているのを確認して、パブリックIPアドレスでアクセスします
![スクリーンショット 2025-04-05 9.28.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/6c28e1b5-b525-4365-9693-a84f2c913706.png)

いけましたね！🎊
![スクリーンショット 2025-04-05 9.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/6041d9df-295b-4933-9554-d973d2b8a296.png)

## 11.CloudWatchのログを見てみよう
CloudWatch → ロググループ →　ロググループ名をクリック

![スクリーンショット 2025-04-05 16.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/57690b5f-784e-4aef-a982-89994479c37b.png)

とりあえずNginxをクリック
![スクリーンショット 2025-04-05 16.29.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/0cee0ce8-9d24-492b-bc74-4b95abf3484a.png)

ログを表示できます
![スクリーンショット 2025-04-05 16.30.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999989/fdd4278c-f000-4691-a594-f772da5f43cd.png)


:::note warn
**お金かかるので使い終わったら削除してね**
     - ECSのタスク、サービス、クラスター
     - VPC
     - CloudWatchのログストリーム


:::


## まとめ
最後までお付き合いくださりありがとうございます。

今回はタスク定義以外のリソースを作成してみました。
自分の詰まりポイントとしては、IAMユーザのロール設定とCloudWatchのロググループの作成ですかね。
これであなたも「Fargateチョットワカル」気なりましたか？

## 参考文献

https://qiita.com/free-honda/items/7e0a5a02dad7c3bdb981#%E3%81%BE%E3%81%A8%E3%82%81