Dockerでローカル開発環境を作り、AWS-ECSにデプロイする

できるだけ簡易なPHPアプリケーションを題材にDockerでローカル開発環境を作り、AWS ECSにプッシュするところまで行う。

##0.事前準備
・Docker for Mac のインストール
https://store.docker.com/editions/community/docker-ce-desktop-mac
・AWSアカウント
https://aws.amazon.com/jp/register-flow/

#Dockerでローカル開発環境構築

##1.Docker基本コマンドの確認
Dockerを利用したことのない人のために基本コマンドを確認します.
本稿では細かい技術的な内容には触れません.
Dockerの更に詳細な事を知りたい場合は[Dockerドキュメント](http://docs.docker.jp/)を当たりましょう.

・イメージの一覧
`docker images`
・「すべての」イメージを表示（デフォルトは中間コンテナを非表示）
`docker images -a`
・すべてのイメージを強制削除
`sudo docker rmi -f $(sudo docker images -qa)`
・「現在起動している」コンテナ
`docker ps`
・「すべての」コンテナ
`docker ps -a`
・すべてのコンテナを強制削除
`sudo docker rm -f $(sudo docker ps -qa)`

##2.Dockerでローカル開発環境を構築する
2-1.作業スペースを準備する

```terminal:terminal
$ mkdir docker-php
$ cd docker-php
```

2-2.index.phpを作成する

```php:index.php
test
```

2-3.Dockerfileを作成する
 
```dockerfile:Dockerfile
FROM php:7-apache
COPY index.php /var/www/html/
```

```terminal:terminal
.
├── Dockerfile
└── index.php
```

2-4.イメージを生成する

```terminal:terminal
$ docker build -t php .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM php:7-apache
7-apache: Pulling from library/php
・
・
・
Successfully
$
```

2-5.コンテナを起動する

```terminal:terminal
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
php                 latest              a8904acf2112        30 seconds ago      378MB
php                 7-apache            a52ec7bd06d5        23 hours ago        378MB
$
```

以下URLからローカル環境を確認できる
[http://localhost:80](http://localhost:80)

以下のようにdocker-compose.ymlを作成してdocker-composeコマンドで実行することもできる。

```yml:docker-compose.yml
version: '3'
services:
  php:
    build: php/
    ports:
     - "80:80"
```

#AWSにデプロイする
AWSの機能について細かく記載してもキリがないので一つ一つのサービスの詳細や概要はドキュメントを当たりましょう.
[AWSドキュメント](https://aws.amazon.com/jp/documentation/)
##3．AWS CLIをインストールする
以下コマンドを順番に実行する

```terminal:terminal
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
$ sudo pip install awscli
$ aws --version
```

※curl・・・HTTPアクセスをしてコンテンツを取得できる.`-o filename`でファイルとして保存される
※[https://bootstrap.pypa.io/get-pip.py](https://bootstrap.pypa.io/get-pip.py)・・・pipコマンドを取得できる
※Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. という内容で怒られる時は以下のコマンドを試してみましょう
`sudo pip install awscli --upgrade --ignore-installed six`

##4.IAMユーザーを作成する
4-1.ユーザーを作成する
4-2.AWSにログインする
[https://console.aws.amazon.com/console/home](https://console.aws.amazon.com/console/home)
4-3.サービスよりIAMにアクセスする
4-4.サイドバーより「ユーザー」にアクセスする
4-5.「ユーザーを追加」をクリック
4-6.ユーザー名を入力し、「プログラムによるアクセス」にチェックを入れ「次のステップ：アクセス権限」をクリックする 例：test-user
4-7.「既存のポリシーを直接アタッチ」を選択し、フィルターから以下をチェックし「次のステップ：確認」をクリック
「AmazonEC2ContainerServiceFullAccess」
「AmazonEC2ContainerRegistryFullAccess」
4-8.「ユーザーの作成」をクリック
4-9.「.csvのダウンロード」をクリック
※**このファイルはアクセスに関わる情報が入っているので人に渡らないように保管しましょう**

##5.アクセスキーを設定する
5-1.credencials.csvの内容を入力していく

```terminal:terminal
$ aws configure
AWS Access Key ID [****************]: credencialsのAccess key ID
AWS Secret Access Key [****************]: credencialsのSecret access key
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [json]: json
```
5-2.設定した内容を確認する

```terminal:terminal
$ aws configure list
```

##6.ECSリポジトリにローカルのDockerをプッシュする
###6-1.リポジトリの作成
6-1-1.サービスより「Elastic Container Service」にアクセスする
6-1-2.サイドバーより「リポジトリ」にアクセスする
6-1-3.「今すぐ始める」をクリック
6-1-4.リポジトリ名をphpと入力し、「次のステップ」をクリック
6-1-5.「Docker イメージの構築、タグ付け、プッシュ」の手順に従い実行する。終了したら完了をクリック。 ※ここまでの手順を踏んでいれば3)は不要 ※regionが自分の地域になっていることを確認しましょう
6-1-6.成功していればリポジトリにイメージが作成されていることが確認できる
###6-2.タスクの作成
6-2-1.サイドバーより「タスク定義」にアクセスする
6-2-2.「新しいタスク定義の作成」をクリック
6-2-3.タスク定義名をphpと入力する
6-2-4.「コンテナの定義」の「コンテナの追加」をクリック
6-2-5.コンテナ名をphpと入力する
6-2-6.イメージにリポジトリ記載のリポジトリURIとタグを入力する
6-2-7.メモリ制限（MB）**は128M(任意)
6-2-8.ポートマッピングはホストポート80、コンテナポート80とする
6-2-9.CPU ユニット数は1とする
6-2-10.「追加」をクリック
6-2-11.「作成」をクリック
###6-3.クラスターの作成
6-3-1.サイドバーより「クラスター」にアクセスする
6-3-2.「クラスターの作成」をクリックする
6-3-3.「EC2 Linux + ネットワーキング」をクリックする
6-3-4.「次のステップ」をクリック
6-3-5.「クラスター名」をphpと入力する
6-3-6.「EC2インスタンスタイプ」を「t2.micro」にする
6-3-7.「インスタンス数」は1
6-3-8.「キーペア」を指定する.無い場合はEC2コンソールより作成する.
6-3-9.「作成」をクリックするとクラスターの作成が開始される
6-3-10.完了するとクラスターが作成され、EC2インスタンスも作成される
6-3-11.作成されたクラスターのタスクの項目をクリックし「新しいタスクの実行」にアクセスする
6-3-12.タスク定義はphp:1、「タスクの数」は1とし、タスクの実行をクリックする
6-3-13.作成されたタスクをクリックし、「EC2 インスタンス」をクリックするとEC2インスタンスを確認できる
6-3-14.「パブリック DNS (IPv4)」にアクセスするとローカルで作成したindex.phpの内容が確認できる

###6-4.ローカルで編集してデプロイする
6-4-1.ローカルのindex.phpを任意に編集する

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

6-4-2.リポジトリ:phpの「プッシュコマンドの表示」の手順を実行する ※3)はdocker-compose buildでも可
6-4-3.クラスター:phpのタスクより「すべてを停止」を実行し、「新しいタスク」を実行する
6-4-4.「パブリック DNS (IPv4)」にアクセスするとローカルで編集したindex.phpの内容が確認できる

##7.EC2にSSH接続（おまけ）
EC2にSSH接続するとログを見ることができたりインスタンス内のパーミッションや設定ファイルを確認修正できたりする.
###7-1.ECSのセキュリティグループを編集する
7-1-1.作成されたタスクをクリックし、「EC2 インスタンス」をクリックするとEC2インスタンスを確認できる
7-1-2.「説明」の「セキュリティグループ」にアクセスする
7-1-3.「アクション」から「インバウンドのルールの編集」をクリック
7-1-4.「タイプ」をSSH、「ソース」を「マイ IP」とする
※回線が変わると繋がらなくなります
###7-2.EC2にSSH接続
7-2-1.EC2インスタンスの「接続」をクリックすると「インスタンスへの接続」が出てくるので、手順に沿って実行する
※rootと指定されてるところはec2-userに変えてアクセスする

##8.不要なリソースを削除する
インスタンスは放置しておくと起動しっぱなしになってしまい無料利用枠でも課金されてしまうことがあるので、不要な場合は下記手順で不要なリソースを削除しておきましょう。
###8-1.IAMの削除
8-1-1.IAM のコンソールからサイドバー「ユーザー」をクリック 
8-1-2.作成したユーザーを選択し、「ユーザーの削除」をクリック」 
8-1-3.チェックボックスにチェックを入れ「はい、削除します」をクリック
###8-2.ECSの削除
8-2-1.クラスターは「クラスターの削除」→「削除」を実行
8-2-2.タスクは「アクション」→「登録解除」を実行
8-2-3.リポジトリは対象を選択し「リポジトリの削除」を実行
###8-3.EC2インスタンスの削除
8-3-1.作成したインスタンスを選択する
8-3-2.「アクション」→「インスタンスの状態」→「削除」を実行
8-3-3.「セキュリティグループ」も削除


##終わりに
今回は簡易なPHPアプリケーションを題材にDocker環境構築、AWS-ECSへのデプロイまで行った。実際の開発においては上記のような手作業もスクリプトで自動化できるので、そのあたりも今後の記事にしていきたい。