ECSにアプリケーションをデプロイする

# はじめに
この記事はコンテナ勉強用として試したことまとめたものです。
今回はECSにWebアプリをデプロイしてみました。

# ECSとは
* EC2 Container Serviceの略
* コンテナ管理用のマネージドサービス。
* Dockerコンテナの実行、更新、停止を管理する。
* クラスタ構成やロードバランサーと連携、コンテナの監視も行ってくれる。
* 2つの料金モデルがあるFageteとEC2起動タイプ。
* 公式ドキュメント  
https://aws.amazon.com/jp/ecs/pricing/

# デプロイまでの流れ
1. ECRにイメージをプッシュ
2. タスク定義を登録
3. クラスターを作成
4. タスクの実行<br>
  ※サービスの登録は次回にでも...

# ECSタスク定義の登録
* 以下リンクにあるjsonファイルを利用してタスク定義を登録する。コンソールから登録することも可能。<br>（事前にECRリポジトリにイメージを登録しておきます。）
https://github.com/aws-samples/ecs-demo-php-simple-app/blob/master/simple-app-task-def.json

* 設定例

```json

{
    "family": "console-ecs-app-test",
    "volumes": [
        {
            "name": "my-vol",
            "host": {}
        }
    ],
    "containerDefinitions": [
        {
            "environment": [],
            "name": "simple-app",
            "image": "1111111111111.dkr.ecr.ap-northeast-1.amazonaws.com/amazon-ecs-repo-test:latest",
            "cpu": 10,
            "memory": 300,
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "my-vol",
                    "containerPath": "/var/www/my-vol"
                }
            ],
            "entryPoint": [
                "/usr/sbin/apache2",
                "-D",
                "FOREGROUND"
            ],
            "essential": true
        },
        {
            "name": "busybox",
            "image": "busybox",
            "cpu": 10,
            "memory": 300,
            "volumesFrom": [
            {
              "sourceContainer": "simple-app"
            }
            ],
            "entryPoint": [
                "sh",
                "-c"
            ],
            "command": [
                "/bin/sh -c \"while true; do /bin/date > /var/www/my-vol/date; sleep 1; done\""
            ],
            "essential": false
        }
    ]
}
```
* タスク登録コマンドを実行する。<br>（今回はEC2起動タイプを使用していきます。

```json

# aws ecs register-task-definition --cli-input-json file://simple-app-task-def.json
/usr/lib/python2.7/site-packages/urllib3/util/ssl_.py:365: SNIMissingWarning: An HTTPS request has been made, but the SNI (Server Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  SNIMissingWarning
{
    "taskDefinition": {
        "status": "ACTIVE",
        "family": "console-ecs-app-test",
        "placementConstraints": [],
        "requiresAttributes": [
            {
                "name": "com.amazonaws.ecs.capability.ecr-auth"
            }
        ],

・・・（省略）・・・

                "volumesFrom": [
                    {
                        "sourceContainer": "simple-app"
                    }
                ]
            }
        ],
        "revision": 4
    }
}
```
* コンソールからタスク登録されていることを確認する。
<img width="954" alt="task定義確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/96714e97-0b0c-d9c4-63ff-6c0e4a89a288.png">

# ECSクラスターを作成
* 「クラスターの作成」ボタンを押下する。
<img width="960" alt="①cluster作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/43637eb6-2ea9-9270-3d71-7937b54fe3ff.png">

* 「EC2 Linux + ネットワーキング」を選択する。
<img width="942" alt="②clusterテンプレ選択.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/2d1d2da6-7d1a-0467-8101-32482a234b3d.png">

* クラスターの設定をする。
<img width="640" alt="③cluster設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/ffd58726-ea95-b5e1-3b9a-f8f22c3189d8.png">

* クラスターが起動するのを待つ。
<img width="640" alt="④起動ステータス.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/69148f0d-c945-f0d4-0e1c-ae984ce9356b.png">

* クラスターの起動を確認する。
<img width="960" alt="⑤クラスター確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/a620b656-02a1-1ccf-ea0e-0f16beeac119.png">

# タスクの実行
* 「新しいタスクの実行」ボタンを押下する。
<img width="960" alt="⑥タスクの実行.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/603b66c4-07c1-3306-e597-bfad343b6dc9.png">

* 起動タイプを「EC2」、タスク数を「2」設定する。
<img width="960" alt="⑦タスクの設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/1cdb1b9e-2e54-8991-4eb9-2d5b43777f03.png">

* タスク実行されたことを確認する。
<img width="960" alt="⑧タスクの設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/7578c493-1f12-8732-dddb-8715560fd4de.png">

* ブラウザからアクセス確認する。<br>クラスターの「ECSインスタンス」タブからコンテナインスタンスを選択するとDNSやIPなど確認できる。
<img width="583" alt="⑨タスクの設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/744fc34e-fe49-ea66-59d4-9eb4a18c9659.png">

# まとめ
* 「No Container Instances were found in your cluster.」といったエラーでタスク実行に失敗したが、<br>そもそもEC2インスタンスを削除してしまったものだった。クラスターを再作成することで解消。
* ECSのタスク定義項目が多いのでドキュメントで確認しながら覚えていくしかないかな。

# 参考
* https://scrapbox.io/docker/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86
* https://qiita.com/aikan-umetsubo/items/e4cf1c6a092d82503c63