Amazon ECS コンソールの初回実行ウィザードを利用してコンテナを動かす

<img width="800" alt="ecs01.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/e32343c6-87bc-3b47-5dfc-b81dbfa4c948.png">

# 全体の流れ

1. [ローカルでコンテナを動かす](https://qiita.com/NaokiIshimura/items/8d0698735d506e5790c9)
2. [ECSでコンテナを動かす](https://qiita.com/NaokiIshimura/items/45d2288b5a2fc4e4e4e4)　←今回の投稿
3. [ECSでコンテナをクラスタリングする](https://qiita.com/NaokiIshimura/items/a1a2a6182a1505950789)
4. [ECSのログをCloudWatchで収集する](https://qiita.com/NaokiIshimura/items/d1b8f54d863b8755c3d6)
5. [ドメインを取得する](https://qiita.com/NaokiIshimura/items/89e104dd2d8dd950780e)
6. [ドメインにALBを割り当てる](https://qiita.com/drafts/654f1f82adb039f1ad47/edit)
7. [HTTPS化する](https://qiita.com/NaokiIshimura/items/014a163c60feebec570b)

# もくじ

今回の投稿ではAmazon ECS コンソールの初回実行ウィザードを利用してコンテナを動かします。

**Amazon ECR によりコンテナイメージをセキュアに保存する**

- ステップ 1: リポジトリの設定
- ステップ 2: Docker イメージの構築、タグ付け、プッシュ


**Amazon ECS クラスターにサンプルアプリケーションをデプロイする**

- ステップ 3: タスク定義の作成
- ステップ 4: サービスの設定
- ステップ 5: クラスターの設定
- ステップ 6: 確認

**サービス・タスクの確認**

**アクセス確認**

- コンテナを実行しているEC2インスタンスを確認
- EC2インスタンスのパブリックDNS/IPを確認
- EC2インスタンスのセキュリティポリシーを確認
- ブラウザアクセス

# 準備

## Dockerfile

index.htmlが含まれたnginxイメージを作成するDockerfileをローカルに用意しておきます。

```dockerfile:Dockerfile
FROM nginx
COPY static-html-directory /usr/share/nginx/html
```

```html:static-html-directory/index.html
<h1>Test</h1>
```

<img width="828" alt="ecs02.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/715e5409-26a6-a913-6ebb-5b973bc7e65f.png">

## AWSコンソール

ブラウザで[Amazon ECS コンソールの初回実行ウィザード](https://console.aws.amazon.com/ecs/home#/firstRun)を開きます。

- Amazon ECR によりコンテナイメージをセキュアに保存する
- Amazon ECS クラスターにサンプルアプリケーションをデプロイする

チェックボックスをONにして**続行**ボタンをクリックします。

![ecs11.png](https://qiita-image-store.s3.amazonaws.com/0/141934/b95afb27-8c6c-a1aa-29df-47c3c496a6b0.png)

# Amazon ECR によりコンテナイメージをセキュアに保存する

- ステップ 1: リポジトリの設定
- ステップ 2: Docker イメージの構築、タグ付け、プッシュ

は、コンテナイメージをECR(Amazon EC2 Container Registry)に保存するステップになってます。

![ecs100.png](https://qiita-image-store.s3.amazonaws.com/0/141934/d7872be3-5c17-01c1-fdf3-de434b59c90b.png)

## ステップ 1: リポジトリの設定

**リポジトリ名**を入力して、**次のステップ**ボタンをクリックします。

![ecs12.png](https://qiita-image-store.s3.amazonaws.com/0/141934/62f95e1e-3519-afdd-a6f3-7d0d2497fc4c.png)


## ステップ 2: Docker イメージの構築、タグ付け、プッシュ

ローカルのDockerfileが配置されてるディレクトリで、画面に表示されているコマンドを実行して、**次のステップ**ボタンをクリックします。

![ecs13.png](https://qiita-image-store.s3.amazonaws.com/0/141934/a914e479-fea3-ec6b-19f3-a37b38e18ef8.png)

1)のコマンドはローカルDockerクライアントとECR間の認証に利用する`docker login`コマンドを発行します。

```shell-session
$ aws ecr get-login --no-include-email --region us-east-2

docker login -u AWS -p xxxxx== https://xxxxx.dkr.ecr.us-east-2.amazonaws.com
```

上記コマンドを実行すると`docker login`コマンドが出力されるので、出力されたコマンドをコンソールで実行します。

```shell-session
$ docker login -u AWS -p xxxxx== https://xxxxx.dkr.ecr.us-east-2.amazonaws.com

Login Succeeded
```

3)のコマンドでローカルのDockerfileをビルドしてコンテナイメージを作成します。コマンドはDockerfileが配置されてるディレクトリで実行します。

```shell-session
$ docker build -t sample-repo .

Sending build context to Docker daemon  11.78kB
Step 1/2 : FROM nginx
 ---> 3f8a4339aadd
Step 2/2 : COPY static-html-directory /usr/share/nginx/html
 ---> Using cache
 ---> aa9c034038ec
Successfully built aa9c034038ec
Successfully tagged sample-repo:latest
```

`docker images`を実行するとビルドしたイメージが確認できます。

```shell-session
$ docker images

REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
test-repo                                                  latest              aa9c034038ec        4 hours ago  
```

4)のコマンドでコンテナイメージにタグ付けを行います。

```shell-session
$ docker tag sample-repo:latest xxxxx.dkr.ecr.us-west-2.amazonaws.com/sample-repo:latest
```

`docker images`コマンドを実行するとタグ付けされたイメージが確認できます。

```shell-session
$ docker images

REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
test-repo                                                  latest              aa9c034038ec        4 hours ago         108MB
xxxxx.dkr.ecr.us-east-2.amazonaws.com/test-repo     latest              aa9c034038ec        4 hours ago         108MB
```

5)のコマンドでコンテナイメージをECRにプッシュします。

```shell-session
$ docker push xxxxx.dkr.ecr.us-west-2.amazonaws.com/sample-repo:latest

The push refers to a repository [xxxxx.dkr.ecr.us-west-2.amazonaws.com/sample-repo]
b3c327320b43: Pushed
a103d141fc98: Pushed
73e2bd445514: Pushed
2ec5c0a4cb57: Pushed
latest: digest: sha256:b777701d2c95421d7708a4fb5b90a6f85dd470adce509385d797b680fa424d43 size: 1155
```

# Amazon ECS クラスターにサンプルアプリケーションをデプロイする

ステップ 3: タスク定義の作成
ステップ 4: サービスの設定
ステップ 5: クラスターの設定
ステップ 6: 確認

は、ECRに保存したコンテナイメージをデプロイする手順です。

![ecs101-2.png](https://qiita-image-store.s3.amazonaws.com/0/141934/ab4284fa-ed4d-657a-f7a0-ac7a5e235b22.png)


## ステップ 3: タスク定義の作成

**次のステップ**ボタンをクリックします。

![ecs14.png](https://qiita-image-store.s3.amazonaws.com/0/141934/0f947e1d-d9c9-a7c3-8442-efa745d84da0.png)

> 補足：
> 初回実行ウィザードにおいてこの画面では操作をおこないませんが、
> 「どのコンテナをデプロイするか？」「どのポートを利用するか？」
> などを**タスク定義**として設定しています。
> 
> **イメージ（どのコンテナをデプロイするか？）**
> ステップ1で作成したリポジトリが指定されている
> 
> **ポートマッピング（どのポートを利用するか？）**
> ホストポートの80とコンテナポートの80がマッピングされている

## ステップ 4: サービスの設定

**次のステップ**ボタンをクリックします。

![ecs15.png](https://qiita-image-store.s3.amazonaws.com/0/141934/8d0fb65a-8752-834e-1e9f-d2e880144a7a.png)

> 補足：
> 初回実行ウィザードにおいてこの画面では操作をおこないませんが、
> 「タスクをいくつ起動するか？」「ロードバランサーを利用するか？」
> などを**サービス**として設定しています。
> 
> **タスクの必要数（タスクをいくつ起動するか？）**
> タスクは1つだけ起動される
> 
> **Load Balancing（ロードバランサーを利用するか？）**
> ロードバランサーは利用されない

## ステップ 5: クラスターの設定

**レビューと起動**ボタンをクリックします。

![ecs16.png](https://qiita-image-store.s3.amazonaws.com/0/141934/f956352c-fc27-03e0-b391-f540c6f27323.png)

> 補足：
> 初回実行ウィザードにおいてこの画面では操作をおこないませんが、
> 「コンテナを実行するEC2インスタンスのマシンタイプを何にするか？」
> 「コンテナを実行するEC2インスタンスのを何台用意するか？」
> などを**クラスター**として設定しています。
> 
> **EC2インスタンスタイプ（コンテナを実行するEC2インスタンスのマシンタイプを何にするか？）**
> t2.microが指定されている
> 
> **インスタンス数（コンテナを実行するEC2インスタンスのを何台用意するか？）**
> EC2インスタンスは1つだけ利用される

## ステップ 6: 確認

**インスタンスの起動とサービスの実行**ボタンをクリックします。

![ecs17.png](https://qiita-image-store.s3.amazonaws.com/0/141934/1020ddd4-95f3-9041-c3e1-25547cdc10d2.png)

> 補足：
> クラスター設定を見ると
> 「セキュリティ侵入CIDR：0.0.0.0/0」「EC2ポートを開く：80」
> とあるので、EC2インスタンスへ割り当てられるセキュリティポリシーに
> 「ソース:0.0.0.0/0 ポート範囲:80」へのアクセス許可が設定されることがわかります

# サービス・タスクの確認

起動ステータスが完了すると**サービスの表示**ボタンが有効になるためクリックします。

![ecs18.png](https://qiita-image-store.s3.amazonaws.com/0/141934/56c461fb-46da-f99d-30be-e1dd44fe9489.png)

サービスの起動直後は**Runnning(起動中)**のタスクが表示されませんが、

![ecs19.png](https://qiita-image-store.s3.amazonaws.com/0/141934/15b740d8-49ca-396c-58f5-072ac64af6a6.png)

少し待てば**Runnning(起動中)**のタスクが表示されるようになります。

![ecs20.png](https://qiita-image-store.s3.amazonaws.com/0/141934/08f02343-4c96-89f3-2926-9908a37fc7e9.png)

# アクセス確認

ブラウザからコンテナにアクセスします。

![ecs102-2.png](https://qiita-image-store.s3.amazonaws.com/0/141934/aa64c4ec-7eea-98f5-8f15-4da44803db69.png)

今回のケースでは初回実行ウィザードで

- ロードバランサーをOFFにしていた
- ポートマッピングでホストポート80とコンテナポート80をマッピングしていた

ため、EC2インスタンスの80ポートへアクセスすることでコンテナへアクセスできます。

## コンテナを実行しているEC2インスタンスを確認

`タスク > EC2インスタンス`とクリックすると、コンテナが実行されているEC2インスタンスのステータスが確認できます。

![ecs22.png](https://qiita-image-store.s3.amazonaws.com/0/141934/c1cc9bbc-c5f0-83a8-3534-30568540e9ec.png)

![ecs23.png](https://qiita-image-store.s3.amazonaws.com/0/141934/6c4e0623-4189-a7ef-d491-87f0adc28085.png)

![ecs24_origin.png](https://qiita-image-store.s3.amazonaws.com/0/141934/43ecbc7d-9db9-16e7-0fbe-eed27f536417.png)

## EC2インスタンスのパブリックDNS/IPを確認

EC2インスタンスの**説明**タブにパブリックDNS/IPが表示されてます。

![ecs24.png](https://qiita-image-store.s3.amazonaws.com/0/141934/4043c786-a4cc-900d-7e29-efd1252484de.png)

## EC2インスタンスのセキュリティポリシーを確認

EC2インスタンスのセキュリティポリシーを確認すると80ポートへのアクセスが許可されててることがわかります。

![ecs26.png](https://qiita-image-store.s3.amazonaws.com/0/141934/d4a8b964-4e31-a7d5-ca8a-3646bed2651d.png)

![ecs27.png](https://qiita-image-store.s3.amazonaws.com/0/141934/c1713bbb-bbf1-044c-9442-c635f8a067f4.png)

## ブラウザアクセス

ブラウザからEC2インスタンスのパブリックDNS/IPにアクセスして、`index.html`が表示されることを確認します。

![ecs25.png](https://qiita-image-store.s3.amazonaws.com/0/141934/1f4beac5-deba-baab-b006-bb5b9555f0c4.png)