ECSの構築 [ 備考録 ]

## アーキテクチャー図
![ecs-github-actions-learning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/659efb52-9a50-4e21-8864-25c6158347e8.png)

## 作成したリソース

| リソース種別 | リソース名 | 備考 |
|-------------|-----------|------|
| VPC | my-workspace-vpc | 仮想ネットワーク |
| サブネット | my-workspace-subnet-app-private1-a |  |
| サブネット | my-workspace-subnet-app-public1-a |  |
| ルートテーブル | my-workspace-rtb-private1-a |  |
| ルートテーブル | my-workspace-rtb-public1-a |  |
| インターネットゲーテウェイ | my-workspace-igw |  |
| ECS クラスター | my-app-cluster | |
| ECS タスク定義 | my-app-frontend | | |
| IAMロール | ecsTaskExecutionRole | タスク定義を作成時に勝手に作られたもの |
| セキュリティーグループ | my-app-frontend-sg | ECSのタスク向け |
| ECS タスク | なし | nginxのコンテナを起動 (すぐに停止する) |
| ECS タスク定義 | my-app-api | |
| ECR Repository | my-app-api | |
| ECS サービス| my-app-api-service | |
| セキュリティーグループ | my-app-api-sg | |


## VPC, Subnetの作成
以下で作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/c49cf612-e06c-4445-b3d9-7a44064101e2.png)
- `10.0.0.0/20` - IPアドレス数は4096個
- `10.0.0.0/24` - IPアドレス数は256個
- `10.0.1.0/24` - IPアドレス数は256個

**備考: プライベートIPアドレスの範囲 (決まっている)**
- 10.0.0.0 - 10.255.255.255
- 172.16.0.0 - 172.31.255.255
- 192.168.0.0 - 192.168.255.255

https://www.softel.co.jp/labs/tools/network/

### VPC  
`my-workspace-vpc`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/98eae80e-59df-4bbf-88dc-1325fbb45f27.png)

### サブネット
`my-workspace-subnet-app-private1-a`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/09c928f7-26a0-4dcc-8ee8-440d492ea133.png)

`my-workspace-subnet-app-public1-a`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/113d98c7-f8f9-4398-a842-e2e7acbece32.png)

**パブリックサブネット**
インターネットに直接アクセスできるサブネット。
サーバーは、グローバルIPを持つことで外部からアクセスできる。

**プライベートサブネット**
インターネットに直セスアクセスできないサブネット。

この時点では名前をつけただけなので機能上は変わっていない。


## ルートテーブル, インターネットゲートウェイ
### ルートテーブルの作成
AWSのルートテーブルは、VPC（Virtual Private Cloud）内でネットワークトラフィックの経路を制御する仕組みです。

**トラフィックの経路決定**
ルートテーブルは、サブネット内のリソースから送信されるネットワークトラフィックがどこに向かうべきかを決定します。IPアドレスの宛先範囲（CIDR）と、そのトラフィックを転送すべき次のホップ（ターゲット）の組み合わせで構成されています。

**サブネットレベルでの制御**
各サブネットは必ずひとつのルートテーブルに関連付けられます。明示的に指定しない場合は、VPCのメインルートテーブルが自動的に使用されます。

例えば、以下のようなルート設定があるとします：
- `10.0.0.0/20` → local（VPC内通信）
- `0.0.0.0/0` → igw-xxxxx（インターネットゲートウェイ経由でインターネットへ）

この設定により、VPC内のリソースは宛先IPアドレスに応じて適切な経路でトラフィックが転送されます。
ルートテーブルを適切に設定することで、セキュリティを保ちながら必要な通信のみを許可し、ネットワーク構成を柔軟に管理できます。

`my-workspace-rtb-private1-a`
private1-a向けのルートテーブルを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/47db3a9f-8e87-43fd-99f4-dbb0dccc17ef.png)

`my-workspace-rtb-public1-a`
public1-a向けのルートテーブルを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/bc019800-4a1d-493f-821a-f6b4115caaa0.png)

### インターネットゲートウェイの作成とVPCへアタッチ
`my-workspace-igw`
作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/60cfaecb-ca01-455d-9969-7b12d67377a8.png)

アタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/91a9f059-46cc-4fe3-aaab-44b217d7d672.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/50154490-d133-47ec-86e7-17d4e716e3cd.png)
これでVPCにインターネットゲートウェイをくっつけることができた。

### ルートテーブルにインターネットゲートウェイをくっつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/10706f6b-0850-4b6e-a0df-862022a453f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/5a37a447-e434-4218-99c3-5ea017881d90.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/262e2cb7-21af-469c-85cf-e0dc2daca7dd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/da87ed93-6cfb-4209-8a29-7ceece7a4718.png)

これでpublic向けのルートテーブルにインターネットゲートウェイをくっつけることができた。

### ルートテーブルをサブネットにくっつける
private
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/58f66d9e-3613-4167-ac5c-1a63617f647f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/fdff0d65-309e-45ca-b86e-f2f1110317bb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/3087b55b-ca78-4a96-a13a-7a96f4740261.png)

public
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/7b0d8d6e-5f94-4bc0-b0df-373a87a3fd74.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/2bf56904-51ac-4294-b2c0-0e417daabf64.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/6575d450-f637-4235-a574-d4d32951415b.png)

## ECSクラスターの作成
`my-app-cluster`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/5d2a658d-f1a2-4ba5-8fa3-d14af12376f8.png)
作成に失敗しても、CloudFormationに行き、再度試行すると作成される。

## タスク定義を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/d35f1a57-5253-45ba-b718-0f00290e9c5c.png)

`my-app-frontend`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/9bf35ee8-5f2e-4bd8-b408-4c726d1e4276.png)

- **タスク実行ロール**は実際のタスクの作成やECRからイメージをpullしてくる際などの権限を与えるために利用する。今回使用する。
- **タスクロール**はコンテナの中からS3や他のAWSサービスにアクセスする必要がある時に必要な権限をIAMロールを通じて何かしらの権限を与えることができる。今回は不要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/86a9654b-8d72-404f-99fb-718cfa5eaa0d.png)
新しいロールの作成としておけば勝手に作ってくれる。

nginxのイメージURIを以下で検索
https://gallery.ecr.aws/nginx/nginx

実際のイメージURIはこちら。
`public.ecr.aws/nginx/nginx:stable-perl`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/ee3a73d8-7b67-4831-9c83-5dd9fe639aa2.png)

他はデフォルトで良いので作成をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/469b74de-2ffa-48e0-aad1-c672db132541.png)

## Fargateにアプリをデプロイする ( + セキュリティーグループの作成)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/61a3bcad-70cb-4138-8b83-488dc3558fe0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/83d388bb-001c-44ff-b261-63db4798e500.png)

まだ、ECSのタスク向けのセキュリティーグループを作成していないので、こちらで一緒に作る。
`my-app-frontend-sg`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/c53220ac-4225-4dc6-8a79-0f931211466d.png)

セキュリティグループの説明も必須のようなので入力したのちに作成。

パブリックIPのオープンアドレスをクリックして、確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/52c6d67c-20fa-4544-9c36-6535f8542b3c.png)

デプロイ成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/f3114acc-be22-48f5-acd6-789aae344303.png)

先ほど作成したセキュリティーグループの確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/05962fd9-feba-448d-ae1c-bb347a4fe5b9.png)

お金がかかるので、タスクを停止する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/7991df47-61bd-4b59-b534-e501cfd86180.png)

---
ここから下はspring bootのアプリをデプロイしていく。

## タスク定義の作成 my-app-api
`my-app-api`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/361820a4-96a9-4781-a22b-7c4eedbb2320.png)

イメージURIはまだECRにあげていないのでここではダミーのnginxのコンテナを入れておく。
github actionsで後ほどCICDを作成する際にタスク定義ファイルも更新をかける時に名前やイメージURIも書き換わるので、一旦はダミーで大丈夫。ポートマッピングなども後ほど上書きされるのでそのままにしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/575ab49e-2a69-440e-b676-d346feff23ed.png)
作成をクリック。

## ECRの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/02c76953-f9aa-45b0-8c2e-75da60839025.png)

## ECS サービスの作成 ( + セキュリティーグループの作成 my-app-api-sg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/078dac53-45ad-4894-ba95-aa2906f58e4b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/617f46be-7e73-4abc-ab1b-70351a36b8e1.png)

`my-app-api-sg`も同時に作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/32e10099-aa20-41cc-a6b8-789a0ca9d4ad.png)
作成。

---

## 続きはこちら

https://qiita.com/oyne2561/items/06416880b33f76b06f3d