AWS 基礎 Part 3 -- ECS で ECR を使って VPC に nginx の Public サーバーを立てる。
Tags: aws, ecs
Published: 2023-01-22 14:14:50



# ECS (Elastic Container Service) を理解する

---

## EC2 ( Elastic Compute Cloud ) とは？

EC2 インスタンスをクラスターとして作成できるサービス。

EC2 は Elastic Compute Cloud の略。コンテナではない。
E の後に C が 2 つだから　EC2 。

https://it.impress.co.jp/articles/-/12382

Elastic とは、伸縮可能と言う意味。アクセス増えたら増強してくれることだと解釈する。

EC2 は
Springboot などで作った API サーバーをクラウド上で稼働させて、インターネットからアクセスできるようにするものだと解釈している。

EC2 インスタンスとは、EC2 で作成するサーバーの名称。

---

## (Elastic Container Service) とは？

https://business.ntt-east.co.jp/content/cloudsolution/column-try-37.html

Docker を使ってサーバーをコンテナで立ち上げ
コンテナをクラスタとして同じものを同時に立ち上げて管理できるらしい。

---


## なぜ ECS を使うのか？

クラスタとしてたくさん同じインスタンスを立ててサービスを提供することで、一つインスタンスが落ちても他のインスタンスに繋がるので、サービスが安定して提供できると考えている。

https://business.ntt-east.co.jp/content/cloudsolution/column-25.html

NTT の記事を見ると、ECS を使えば k8s を使わずに GUI でクラスタ管理ができるように見えた。

EC2 でサービスを作ると、k8s を使って複数コンテナのスケーリングを自分で管理しないといけないと解釈した

---

## ECS を動かすための他のサービスを確認。

前回の記事で作った VPC シリーズが必要。

単体では動かないようだ。

https://youtu.be/2_FxLp9xgmo?t=533

クラインさんを参考にすると

ECR と並列で　
VPC, サブネット、Internet Gateway,
これらを立てて、サブネットの中に ECR を放り込む必要があるようだ。






---
---

# 実際に ECS のクラスタを作る

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ba64he8zfgl5rmqrhchq.png)

Amazon ECS のクラスターのページに移動する
クラスターを作成のボタンを押し

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ue7r0cv4mpzyculwk42.png)

ネットワークのみ(VPCとサブネットがついてない)を選択して
クラスターを作成する
自動的に Fargate と言うサービスが使われる

https://business.ntt-east.co.jp/content/cloudsolution/column-171.html

Fargate を使うことで、Amazon Web Service のインスタンスや、Amazon Web Service のインスタンスをまとめたクラスターを管理しなくて良くなるらしい。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f6mug7znhpwcu2m73iid.png)

名前を決めて作成
小文字始まりのタグも必要。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jae92pl8aq4mez7fuao4.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bkx60mu4s3kc8dhl5lar.png)



これで hello-cluster が作成された





---

# ロールのページで ECS 用のロールを作成する。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-tasks-pull-images-ecr-repository/

動画にはなかったので公式サイトを参考にする

---

## IAM ロールとは？

IAM ロールとは、 ECS を別のサービスである Fargate で動かすために必要な概念らしい。

Jenkins でいうエージェントのようなものだと想像した。

---

## ロールの作成を開始

IAM の Roles のページにアクセスして

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6dgkaa3rjxl1985m8o7l.png)

Create Role をクリック

---

## エンティティタイプとユースケースの設定

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nt1n4jfw62tdsy0bw72p.png)

Trusted Entity Type に AWS Service

Use case に　
Elastic Container Service **Task** 
これを選択
Elastic Container Service
ではない。似ているが。

これによって、ECS タスクが他の AWS サービスから使用できる権限を付与できるようだ。

Elastic Container Service では、ECS の作成と管理(無効化などと想像)のみしかできない。こちらでは ECS を呼べないと解釈した。

なので、間違えずに ECS Task を選択した。



---

## permission に ECS の実行権限を追加

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wqgs4fsh4fcgabkq4srs.png)

次に 許可の境界のセットで、
「許可の境界をロールの許可の最大化のために使う」
と言うラジオボタンをクリックする。

これは「検索して許可のプリセットを探す」と言う意味だと解釈した。

検索すると、たくさん許可のプリセットリストが出てくる。

公式記事に従って、ECS で検索してカスタム許可をつける

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmr17zectgzrl2byvxoh.png)

次に、記事の通りに ロール名に ecsTaskExecutionRole と
ECS タスク実行用と明記する。

---

## ロールの作成を終了

ようやく作成が終了した。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hi5l66j1x9atinalz3ws.png)


これで ECS **のタスク** を動かすためのロール、ecsTaskExecutionRole が完成した。

---
---









# タスクを作成する

## why

Fargate で Docker イメージを動かすには、タスクいうものクラスターの中に 作成して、ECR をロール付きでセットする必要があるらしい。

クラスターのページで Run New Task を押しても作成できない。
できそうに見えるができなかった。

---

## タスク定義のページで新規タスクを作成

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0jngshjd9i5poh8r6eqv.png)

タスク定義のページでのみ新規タスクは作成できる。
作成を押す。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9ymvpoj2mfy1fbk4f2l.png)

FARGATE を選ぶ。

---

## タスク定義の基本設定をする

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mg6kx5n9j9i1sgtks6r.png)

* タスク名に hello-task
* タスクロールに先ほど作った ecsTaskExecutionRole
* ネットワークモードは aws vpc で固定値
* OS は Linux

これで基本定義を作れた。

---

## タスク実行 IAM ロールと タスクサイズを設定

* タスク実行ロールは、デフォルトで ecsTaskExecutionRole
* タスクメモリと CPU は最初の 0.5, 0.25 を選択

---

## コンテナ定義に ECR からコンテナイメージを追加する

名前は　hello-nginx 
ECR のコンテナイメージと同一にした。

イメージは、ECR のページで事前に作った hello-nginx のリンクを貼る。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6phqsz9e7ijpqd8k9bwc.png)

```
YourDomain.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx
```

URL はこの形になる。

メモリのリミットはデフォルトの 128 MiB

ポートは 80 

これで追加する。

---

## タスク定義の作成を完了

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/09bh31q7rkf6wzejfxx3.png)

これで ECS クラスタで使うためのタスクが作成できた。

---
---






# ECS にタスク定義を設定

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/od3es2wc0s0ygpj8xsyg.png)

ECS クラスタのページで　Run New Task をクリック

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eztj36jodb3i0e4ovcjw.png)

* ローンチタイプに Fargate
* OS に Linux
* タスク定義に先程作った hello-task
* VPC に 最初に作った hello-vpc
* サブネットに 最初に作った hello-subnet

この設定で Run Task する。


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/anm3gumkda8jakjn5em8.png)



するとタスクがクラスタにセットされて RUN しているのがわかる。






---
---

# サービスの作成

---

## サービスとは

https://youtu.be/2_FxLp9xgmo?t=2907

クラインさんの動画によると、サービスとはクラスタとタスクを結びつけるものらしい。

---

## サービスの作成を開始

クラスターのページの hello-cluster の
サービスタブから　Create を押す。

---

## タスク定義やクラスタをセットして、サービス名とサービス数を入力

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a4o1yqzuzxjmtwnzjz1j.png)

* ローンチタイプに FARGATE
* OS に Linux
* タスク定義に hello-task
* Cluster に hello-cluster

これらを選び

* サービス名に hello-service
* サービス数に　1 (クラスタの安定性は試せなくなるが、今回は構築手順の学習なので問題ないと解釈)

これらを入力して次に行く。

---

## VPC とサブネットをセット

https://youtu.be/2_FxLp9xgmo?t=3032

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p81191b7n8em5zssmade.png)

hello-vpc と　hello-subnet をセットする。

この時、サブネットはインターネットゲートウェイに繋がっている必要がある。
繋がっていないサブネットでは、ECR から Docker イメージを pull するときにエラーになってしまうからだ。

---

## セキュリティグループを編集

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z9rodk7q1gu35tqab6sh.png)

デフォルトだとサービス名の一部とランダムな数字4桁で作成されている。
これを編集する。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9pw83j76fsrypb0ltk1b.png)

開いてみると

* 新しいセキュリティグループをこのサービス用に以下の設定で作成する
* 名前は hello-5081(ランダム)
* 詳細説明は作成日時
* インバウンドファイアウォールのルール(制限)は、どこからでも 80 ポートから繋がる

になっている。

---

### インバウンドファイアウォールとは？

https://techtarget.itmedia.co.jp/tt/news/1709/29/news10.html

IT Media のこの記事によると、
インバウンドファイアウォールとは、インターネットからアクセスするときに、許可されてない IP からの接続などをブロックするもののようだ。

対義語として、社内 LAN から守るアウトバウンドがあるようだ。

---

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umlycz12aho6513o1qvc.png)

名前を hello-security-group に
説明を Accessible from anywhere by port 80 に
( 日本語だと作成時にエラーになる )

して、セキュリティグループを作成した。

残りのロードバランサーなどはデフォルトで大丈夫なので、次のステップに行く。

自動スケーリングは無しにする。落ちて損失が大きいサービスではないので。

---

## サービスの作成を完了

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5z0yek2g0m70d9geg4hm.png)


レビュー画面で一覧で確認して、サービスを作成完了する。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0bgppdczf0yjowcwtr11.png)

するとローンチされて、

* セキュリティグループ
* インバウンドファイアウォールの設定
* サービス本体

これらが作成できたとわかる。

設定に不備があった場合は該当の箇所がエラーになる。



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qyo7xzlip5xjrv2pl8tl.png)





そして、クラスタのページのタスクのタブで、
今作成した hello-service がつながっているのをみることができる。

---


# インターネットからアクセスする

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ep9931hz4wv1yr4tfme.png)

タスク詳細に、ネットワーク情報がある。

Public IP でインターネットからアクセスできる。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p3bdn54yvxt38otb0jv3.png)

これでインターネットから、ECS で動かしている nginx コンテナにアクセスすることができた。