[AWS] Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル(第2回)

※本記事は [Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル(第1回)](https://qiita.com/VA_nakatsu/items/c8a4b24b8cffd0e9047b) の続きです。

前回は、ECRにイメージをプッシュするところまで行いました。今回はECSクラスターの作成までを行います。

<font color="red">注：今回からAWS利用料が発生します。このチュートリアルでは [ELB 1台](https://aws.amazon.com/jp/elasticloadbalancing/pricing/) と、[t3.microのEC2 2台](https://aws.amazon.com/jp/ec2/pricing/) を作成しています。</font>

# 2) ECSクラスター作成の前に・・・VPC等の作成

ECSクラスターとは、ECSにおけるコンテナの実行環境( ≒ ここでは自分で管理する複数のEC2インスタンス)です。

クラスターだけの状態は簡単な方の図ではこれだけなのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/6fea61fe-16c2-238c-6e61-d1d212255ae7.png)

実際の構成図の方ではこうなります。コンテナが動いていないだけで、実行環境としてはほぼ完成となります。この図では、セキュリティグループとロールも追記しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/451db773-beac-78e6-cac5-ecea9f3ffa2e.png)

ここではクラスター作成の前に、VPC、セキュリティグループ、ロール、キーペア、ELB（結構数があります・・・）を作成しておきます。
中にはポータルのECS新規作成ウィザード中に作成可能なものもあるのですが、UIがちょっと分かりづらいのと、初見では何が作成されているか分かりづらいところがあるので手動で作成します。

## VPC作成

ECSクラスターを実行するVPCを作成します。ELBとEC2を作成できるだけのIPアドレスが必要ですが、他には特別な手順はありません。ここでは /26 アドレスを割り当て、アベイラビリティゾーン(AZ)を2つ使用します。

VPC作成：

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/1ab80654-bc42-ab9b-6820-e4e9c9c46143.png)|
|:-:|

サブネット(AZ 1つ目)作成：作成したVPC内に /27アドレスで作成

|![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/35269f26-13e2-3577-2e46-9b1045dda554.png)|
|:-:|

サブネット(AZ 2つ目)作成：1つ目とは別のAZを指定し、/27アドレスで作成

|![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/4c466589-be1f-cf05-f835-ad23b8bbb763.png)|
|:-:|

インターネットゲートウェイ作成：

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/dc9209fa-cc08-383e-6b38-f11816a5e28f.png)|
|:-:|

作成したインターネットゲートウェイをVPCにアタッチ：

|![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/49ec4953-53f7-f9a1-3909-2406d4047d5c.png)|
|:-:|

ルートテーブルにインターネットゲートウェイ追加：

|![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/b6e8a7ce-675e-6294-8482-12c62586c08e.png)|
|:-:|

## セキュリティグループ作成

セキュリティグループは、ELB用のものと、インスタンス用のものが2つ必要です。
今回は、第1回で作成したテスト用のnginxコンテナを使うので、アクセス元は狭く設定しておきます。

 <b><font color="blue">ELB用セキュリティグループ</font></b> ：マイIPからのTCP 8080のみ許可

|![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/7bc3e75b-784f-9b6c-d440-651becc8d969.png)|
|:-:|

<b><font color="blue">インスタンス用セキュリティグループ</font></b>：マイIPからSSH接続と、先ほど作成したELB用セキュリティグループからのTCP 8080のみ許可

|![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/df54ce2a-adce-bada-9a08-c13ca35eff56.png)|
|:-:|

## ロール作成

ロールも、インスタンス用のものと、タスク用のもので2つ必要です。
実運用ではコンテナに必要な機能(通信)によって設定する必要がありますが、ここではそれぞれ用意されているデフォルトポリシをアタッチします。

<b><font color="blue">インスタンス用ロール</font></b>：ロールの作成から、AWSサービス → Elasitc Container Serviceを選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/9f3a9b92-dd8a-05d6-037f-12a4e67add23.png)|
|:-:|

画面下に進み、ユースケースの選択で"EC2 Role for Elasitc Container Service"を選択して次のステップに進みます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/2f70268f-4237-f7f2-b2c0-781d0843fb0a.png)|
|:-:|

デフォルトで "AmazonEC2ContainerServiceforEC2Role" が選択されているので、次に進みます。

|![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/385bf02f-b0a7-f2d9-fec0-7e5be5333091.png)|
|:-:|


ウィザードの最後に、ロール名を入力して作成します。

|![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/00861dac-440e-05b3-fa1c-849b2c68b0fc.png)|
|:-:|

2つめの <b><font color="blue">タスク用ロール</font></b> も同様に作成します。ウィザード中、ユースケースの選択で"Elasitc Container Service Task"を選択して次のステップに進みます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/59bab5d6-ec90-5a6b-b3ac-afcfc8d1ac5e.png)|
|:-:|

ポリシの選択画面で、"AmazonECSTaskExecutionRolePolicy" を選択して次に進みます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/9232ce7c-3d02-9772-c82d-a438cf7912ff.png)|
|:-:|

後はウィザードの最後に、ロール名を入力して完了となります。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/4042e1e4-5d99-7604-4f8e-55935754560b.png)|
|:-:|


## キーペア作成

EC2インスタンスの作成に必要なキーペアを作成しておきます。

|![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/cbe71aad-061e-bdd3-f4cc-574961762a26.png)|
|:-:|

## ELB作成

手動作成の最後はELBの作成です。ELBの作成メニューで、Application Load Balancerを選択します。

|![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/0c3fde96-304e-068a-9858-7850f32a6561.png)|
|:-:|

プロトコル/ポートにHTTP 8080を指定し、今回作成したVPCを指定。

|![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/5c6228d4-7c53-3eda-efa7-239ba20f6ad2.png)|
|:-:|

セキュリティグループは、先に作成した <b><font color="blue">ELB用のセキュリティグループ</font></b> を選択します。

|![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/7ba6be97-cc64-c68e-45ca-f11b872110d1.png)|
|:-:|

ターゲットの種類でIPを選択し、プロトコル/ポートにHTTP 8080を指定。

|![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/67bdc668-8650-f9ce-da9e-d28dcb6a7f0c.png)|
|:-:|

ターゲットはECSタスクになるので、手順5：ターゲットの登録では何も登録せず先に進みます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/c6f72603-525d-653e-9572-c5c04402ad4d.png)|
|:-:|

後は確認画面で作成を押して完了です。

|![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/fb39406e-0dde-3f43-2420-7ba52f0024f7.png)|
|:-:|


# 3) ECSクラスター作成

ようやく、ECSクラスター作成に進みます。クラスターの新規作成メニューで「EC2 Linux＋ネットワーキングを作成」を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/03154563-4ef7-1085-8f1d-845c2cf29d44.png)|
|:-:|

クラスターの設定で必要な情報を入力します。
- クラスター名 : 任意
- プロビジョニングモデル : オンデマンドインスタンス
- EC2インスタンスタイプ ： t3.micro
- インスタンス数 ： 2 
- EC2 Ami Id ： Amazon Linux 2
- EBSストレージ ： 22
- キーペア ： 事前に作成したキーペアを指定
- VPCとサブネット ： 事前に作成したVPCとサブネット(2つ)を指定
- セキュリティグループ ： 事前に作成した <b><font color="blue">インスタンス用セキュリティグループ</font></b> を指定
- コンテナインスタンス IAM ロール ： 事前に作成した <b><font color="blue">インスタンス用ロール</font></b> を指定

|![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/8a002de8-b164-f6f2-2f84-a17b02b991cf.png)|
|:-:|

|![012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/af16aad3-4181-aad7-aca2-a2c40ec89aad.png)|
|:-:|

「作成」ボタンを押すと作成されます。

## 確認

作成後、「クラスターの表示」を選択します。

|![013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/14cb5186-5a72-1ed9-a9b1-105c31e8722e.png)|
|:-:|

表示されたクラスターの情報で「ECSインスタンス」タブを選択すると、インスタンスが作成されたことが確認できます。

|![014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/540c22d8-0f65-116a-81ae-314f96270e5e.png)|
|:-:|

第3回でコンテナ起動しますが、それまではインスタンス費用がからないよう一時的に台数を0にしておきます。「ECSインスタンスのスケール」ボタンを押し、必要数を0に変更します。
![015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/37a9f1e7-c7a6-9582-6f6f-db27617bbef6.png)

# 第2回のまとめ

図は再掲となりますが、今回作成したものを構成図に追記するとこのようになります。ECSの新規作成ウィザードではAuto Scaling Groupのところが作成され、周辺部分を手動で作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/451db773-beac-78e6-cac5-ecea9f3ffa2e.png)

コンソールのAuto Scaling Groupのメニューを見ると、通常のASGと同様に作成されたもの(指定した名称の前後に文字列が付加されています)が確認可能です。

|![016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/2df97848-ce67-c4f8-a497-ad086ef69a86.png)|
|:-:|

次回はいよいよ、サービスとタスクを作成してコンテナを起動してみます。

# Link

- [Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル(第1回)](https://qiita.com/VA_nakatsu/items/c8a4b24b8cffd0e9047b)

# 参考資料

- [Elastic Load Balancing 料金](https://aws.amazon.com/jp/elasticloadbalancing/pricing/)
- [Amazon EC2 の料金](https://aws.amazon.com/jp/ec2/pricing/)