DockerをAWS ECSで運用する。

#はじめに
　ホスト側（ローカルマシン上）に作成したDockerイメージを
　AWS ECSにデプロイを行い、ブラウザに出力（"Hello Docker"）するまでの手順を記載します。
　※ マシンのOSのバージョンは、macOS High Sierra 10.13.4です。

#前提条件
　(1) AWS アカウントの作成 
　　以下のサイトで、事前にAWS アカウントを作成して下さい。
　　https://aws.amazon.com/jp/register-flow/
　(2) ローカル環境にDockerイメージ、コンテナを構築
　　初めて構築される方は、参考情報（Dockerイメージ、コンテナを構築）を参考下さい。

#1. AWS CLIのインストール
##1-1. pip3の最新化
　ターミナルを開き、「pip3 install --upgrade pip」を実行します。

```php
$ pip3 install --upgrade pip
Requirement already up-to-date: pip in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (10.0.1)
```
##1-2. awscliのインストール
　ターミナルで、「pip3 install awscli」を実行します。

```php
$ pip3 install awscli
Collecting awscli
  Downloading https://files.pythonhosted.org/packages/80/2b/ed30c7941731231afb7d3e97368accd2319047123c75fa7dd043ca39be04/awscli-1.15.59-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 5.3MB/s 
Requirement already satisfied: docutils>=0.10 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from awscli) (0.14)
Requirement already satisfied: rsa<=3.5.0,>=3.1.2 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from awscli) (3.4.2)
Requirement already satisfied: s3transfer<0.2.0,>=0.1.12 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from awscli) (0.1.13)
Requirement already satisfied: PyYAML<=3.13,>=3.10 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from awscli) (3.12)
Collecting botocore==1.10.58 (from awscli)
  Downloading https://files.pythonhosted.org/packages/cb/6e/4d961f0c98007ba077a64626f4e0056e5351cca54653b15d12bb03c32110/botocore-1.10.58-py2.py3-none-any.whl (4.4MB)
    100% |████████████████████████████████| 4.4MB 3.9MB/s 
Requirement already satisfied: colorama<=0.3.9,>=0.2.5 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from awscli) (0.3.9)
Requirement already satisfied: pyasn1>=0.1.3 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from rsa<=3.5.0,>=3.1.2->awscli) (0.3.2)
Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from botocore==1.10.58->awscli) (0.9.3)
Requirement already satisfied: python-dateutil<3.0.0,>=2.1; python_version >= "2.7" in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from botocore==1.10.58->awscli) (2.6.0)
Requirement already satisfied: six>=1.5 in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (from python-dateutil<3.0.0,>=2.1; python_version >= "2.7"->botocore==1.10.58->awscli) (1.10.0)
Installing collected packages: botocore, awscli
  Found existing installation: botocore 1.10.48
    Uninstalling botocore-1.10.48:
      Successfully uninstalled botocore-1.10.48
Successfully installed awscli-1.15.59 botocore-1.10.58
```
　※ 以下のエラーが発生した場合
　　pyasn1-modules 0.0.11 has requirement pyasn1==0.3.2, but you'll have pyasn1 0.3.3 which is incompatible.

　　ターミナルで、以下のコマンドを実行し、pyasn1のバージョンを0.3.2に指定します。
　　pip3 install -U pyasn1==0.3.2 pyasn1-modules==0.0.11

##1-3. 確認
　ターミナルで、「aws --version」を実行します。
　以下のように出力されていれば、成功です。

```php
$ aws --version
aws-cli/1.15.59 Python/3.6.0 Darwin/17.5.0 botocore/1.10.58
```
#2. IAM ユーザーの作成
　(1) AWS のコンソールにログイン
　(2) IAM サービスにアクセス
　(3) サイドメニューから「ユーザー」を押下
　(4) 「ユーザーを追加」ボタンを押下
　　![user01.png](https://qiita-image-store.s3.amazonaws.com/0/165180/fe663ba6-550a-2746-de21-861556204d79.png)

　(5) 必須情報の入力
　　・任意のユーザー名を入力します。
　　・アクセスの種類で「プログラムによるアクセス」にチェックを入れます。
　　![user01.png](https://qiita-image-store.s3.amazonaws.com/0/165180/ae035d10-d179-e27f-4384-39e4fd7c790b.png)

　(6) 「次のステップ:アクセス制限」ボタンを押下
　(7) 「既存のポリシーを直接アタッチ」を押下
　　![user03.png](https://qiita-image-store.s3.amazonaws.com/0/165180/83843e33-dcb8-5909-355d-1ae27b5df2d2.png)

　(8) 以下に示す項目をチェック
　　AmazonEC2FullAccess
　　AmazonEC2ContainerRegistryFullAccess
　　AdministratorAccess
　　AmazonECS_FullAccess
　　AmazonEC2ContainerServiceFullAccess
　　AmazonEC2ContainerServiceforEC2Role
　　AmazonEC2ContainerServiceRole

　(9) 「次のステップ:確認」ボタンを押下
　(10) 「ユーザーの作成」ボタンを押下
　(11) 「.csvのダウンロード」ボタンを押下し、ファイルをダウンロード
　　※ .csvには、アクセスに関わる情報が記載されています。
　(12) 「閉じる」ボタンを押下

#3. 認証情報(アクセスキー)の作成と設定
##3-1. 認証情報(AWS)の設定
　(1) ターミナルで、「aws configure」を実行
　(2) 2.で取得した.csvに記載されている「Access key ID」を入力
　(3) 2.で取得した.csvに記載されている「Secret access key」を入力
　(4) 東京リージョンを入力
　　※ ap-northeast-1が東京リージョンを指します。
　(5) JSONを入力

##3-2. 確認
　ターミナルで、「aws configure list」を実行します。
　以下のように出力されていれば、成功です。

```php
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************LLFQ shared-credentials-file    
secret_key     ****************aE5A shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
```

#4. ECSリポジトリの作成と設定
#4-1. リポジトリの設定
　(1) AWS のコンソールにログイン
　(2) コンソール右上のリージョンを「東京」に設定
　(3) Elastic Container Service サービスにアクセス
　(4) サイドメニューから「リポジトリ」を押下
　(5) 「今すぐ始める」ボタンを押下
　　![rep01.png](https://qiita-image-store.s3.amazonaws.com/0/165180/2b942af2-c919-a6b9-4c43-9a1bc08ec44f.png)
　(6) 必須情報の入力
　　・リポジトリ名を入力します。
　　　ここでは、「php-apache-ecs-rep」を入力しました。
　　![rep02.png](https://qiita-image-store.s3.amazonaws.com/0/165180/64dfdd88-039d-e003-fd55-34970ba89f9a.png)

　(7) 「次のステップ」ボタンを押下

#4-2. Dockerイメージの構築、タグ付け、プッシュ
　コマンドが表示されるので、上から順番に実行します。
　(1) Elastic Container Registryに対して、Docker クライアントからログイン
　　表示されているコマンドの 1)、2) を実行します。
　(2) Dockerイメージを構築
　　表示されているコマンドの 3) を実行します。
　　※ あらかじめ作成しておいた「Dockerfile」が配置されているパスを指定して下さい。
　　　ここでは、参考情報（Dockerイメージ、コンテナを構築）で作成した「Dockerfile」のパスを指定します。
　　※ 実行後、Dockerイメージの確認を行います。
　　　以下のように出力されていれば、成功です。

```php
$ docker build -t php-apache-ecs-rep .
Sending build context to Docker daemon  10.75kB
Step 1/1 : FROM php:7.2.7-apache
 ---> c2700d1900ac
Successfully built c2700d1900ac
Successfully tagged php-apache-ecs-rep:latest
$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
php-apache-ecs-rep   latest              c2700d1900ac        7 days ago          377MB
php                  7.2.7-apache        c2700d1900ac        7 days ago          377MB
php_apache_image     ver001              c2700d1900ac        7 days ago          377MB 
```
　(3) Dockerイメージにタグ付け。
　　表示されているコマンドの 4) を実行します。
　(4) AWS リポジトリに作成したDockerイメージをプッシュ
　　表示されているコマンドの 5) を実行します。
　(5) 「完了」ボタンを押下

#5. タスク定義
　(1) Elastic Container Service サービスにアクセス
　(2) サイドメニューから「タスク定義」を押下
　(3) 「新しいタスク定義の作成」ボタンを押下
　　![task01.png](https://qiita-image-store.s3.amazonaws.com/0/165180/0b2676b9-7eaf-224c-f254-b7623ebd25f2.png)
　(4) 起動タイプに「EC2」を選択し、「次のステップ」ボタンを押下
　(5) 必要な情報の入力
　　・ タスク定義名を入力します。
　　　ここでは、「php-apache-ecs-taskdef」を入力しました。
　(6) 「コンテナの追加」ボタンを押下
　　・コンテナ名を入力します。
　　　ここでは、「php-apache-ecs-container」を入力しました。
　　・イメージを入力します。
　　　※ 4-2.(3)でタグ付けした名前を指定します。
　　・メモリ制限（MB）に「128」を入力します。
　　・ポートマッピングのホストポート、コンテナポートにそれぞれ「80」を入力します。
　　・CPU ユニット数に「1」を入力します。
　(7) 「追加」ボタンを押下
　(8) 「作成」ボタンを押下

#6. クラスター
　(1) Elastic Container Service サービスにアクセス
　(2) サイドメニューから「クラスター」を押下
　(3) 「クラスターの作成」ボタンを押下
　　![cluster01.png](https://qiita-image-store.s3.amazonaws.com/0/165180/9e4a8a62-7e56-973e-ef80-5060d4713fdc.png)

　(4) 「EC2 Linux + ネットワーキング」を選択し、「次のステップ」を押下
　(5) クラスター名を入力し、「作成」ボタンを押下（その他項目はデフォルトのまま）
　　ここでは、「php-apache-ecs-cluster」を入力しました。

#7. サービス
　(1) Elastic Container Service サービスにアクセス
　(2) サイドメニューから「クラスター」を押下
　(3) 作成したクラスター名を押下
　　![cluster02.png](https://qiita-image-store.s3.amazonaws.com/0/165180/1ec09fdd-19d7-fd48-e800-0573025cf32f.png)

 (4) 「サービス」タブから「作成」ボタンを押下
　　![cluster03.png](https://qiita-image-store.s3.amazonaws.com/0/165180/dde8cd7f-0e98-2103-5862-e1246605286c.png)

　(5) 必要な情報の入力
　　・ 起動タイプに「EC2」を選択します。
　　・ サービス名を入力します。
　　　ここでは、「php-apache-ecs-service」を入力しました。
　　・ タスクの数に「1」を入力しました。
　(6) 「次のステップ」ボタンを押下
　(7) 必要な情報の入力
　　・ サブネットにをプルダウンから選択します。
　　・ ELB タイプに「なし」を選択します。
　(8) 「次のステップ」ボタンを押下
　(9) 「次のステップ」ボタンを押下
　(10) 「サービスの作成」ボタンを押下

#8. 動作確認
　パブリックDNSまたはパブリックIPをブラウザで開き、
　“Hello Docker”と表示される事を確認して下さい。
　※ クラスター → 「ECS インスタンス」タブ → コンテナインスタンスを開くと、確認できます。

#参考情報（Dockerイメージ、コンテナを構築）
　(1) 作業ディレクトリとファイルの準備
　　(1)-1　ディレクトリとファイルは以下のような構成となります。

```php
$ tree php_apache
php_apache
├── Dockerfile
└── html
    └── index.php

1 directory, 2 files
```
　　(1)-2 各ファイルの中身を以下に示します。

```php:Dockerfile
FROM php:7.2.7-apache
COPY ./html/index.php /var/www/html/
```

```php:index.php
<?php echo 'Hello Docker'; ?>
```


　(2) Dockerイメージのビルド
　　ターミナルで、以下のコマンドを実行します。
　　※ 「Dockerfile」ファイルが配置されているパスで実行して下さい。

```php
$ docker build ./ -t php_apache_image:ver001
Sending build context to Docker daemon  10.75kB
Step 1/2 : FROM php:7.2.7-apache
7.2.7-apache: Pulling from library/php
683abbb4ea60: Pull complete 
5ba6c1ec1bb7: Pull complete 
30c400495d2e: Pull complete 
47082fd94ae9: Pull complete 
db1399ce8b37: Pull complete 
d9055cd97604: Pull complete 
3dc42f043a06: Pull complete 
718b9cd7325a: Pull complete 
a7b97ac10aed: Pull complete 
24e62ac9193c: Pull complete 
ab519c71ddf5: Pull complete 
4bb2eea5ed3b: Pull complete 
839db073d17d: Pull complete 
694b4d33596a: Pull complete 
91d76bc9d54f: Pull complete 
Digest: sha256:868995dfcc485ee259b5102ccb7e56c9ead60677450fe755d5ad3d338395f632
Status: Downloaded newer image for php:7.2.7-apache
 ---> c2700d1900ac
Step 2/2 : COPY ./html/index.php /var/www/html/
 ---> 16c09dac14b5
Successfully built 16c09dac14b5
Successfully tagged php_apache_image:ver001
```

　(3) Dockerコンテナの起動
　　ターミナルで、以下のコマンドを実行します。

```php
$ docker run -d -p 80:80 --name php_apache_container php_apache_image:ver001
1b7c81ffb9ec55a3525803a03bd49faff62ae28cf92784f02c42d7af4fbda98f
```