【ECS】nginxとphp-fpmが連携したコンテナをECSで動かす

# 概要
ECS及びECRでコンテナを動かす
ころころUIが変わるので文字ベースで必要な作業をメモ

# ゴール
下記で作ったコンテナイメージをECSで動かしphpinfoが見られる
LBは通さずインスタンス直通
https://qiita.com/chanP_yamazaki/items/1397f4899f7768c1ed60

# プッシュ元のEC2インスタンスにECRへのアクセス権限を付与
・「AmazonEC2ContainerRegistryFullAccess」ポリシーがアタッチされたIAMRoleを設定する

# ECRのリポジトリを作る
・Amazon Container Service -> Amazon ECR -> Repositories へ
・リポジトリを作成
　名前は任意

# ECRへコンテナイメージをプッシュする
・先ほど作成したリポジトリをクリック
・プッシュコマンドの表示をクリック
・手順1の「認証トークンを取得し、レジストリに対して Docker クライアントを認証します。」のコマンドをコピーして実行

``` :手順1
$ aws ecr get-login-password --region リージョン | docker login --username AWS --password-stdin アカウントID.dkr.ecr.リージョン.amazonaws.com

※ get-login-passwordはaws-cliのv1.17.10以降でないと実行できません
その場合は下記
$ aws ecr get-login --region リージョン --no-include-email
　↑で出力された物をコピーして実行
$ docker login -u AWS -p XXXXXXX https://アカウントID.dkr.ecr.リージョン.amazonaws.com
```

・手順2は既にイメージをビルド済みであればスキップ

・手順3でビルド済みのコンテナイメージ名を確認してタグを付ける
　これをnginxとphp-fpmそれぞれで実施

``` :手順3
$ docker images
$ docker tag コンテナイメージ名:latest アカウントID.dkr.ecr.リージョン.amazonaws.com/リポジトリ名:プッシュする際のイメージ名
例: docker tag project_nginx:latest アカウントID.dkr.ecr.リージョン.amazonaws.com/test:nginx

$ docker images
プッシュしたいコンテナイメージにecr用のタグがついていればOK
```

・手順4でタグ付したコンテナイメージをECRへプッシュ
※dockerバージョン20系から、タグ無しでのpushはlatest指定になります。オプションで--all-tags指定になります
https://docs.docker.com/engine/reference/commandline/push/

``` :手順4
$ docker push アカウントID.dkr.ecr.リージョン.amazonaws.com/test

一つずつも指定可能
$ docker push アカウントID.dkr.ecr.リージョン.amazonaws.com/test:php-fpm
$ docker push アカウントID.dkr.ecr.リージョン.amazonaws.com/test:nginx
```

・プッシュ後の確認とお掃除
ECRを確認してプッシュしたイメージが一覧に出てくるかを確認
下記コマンドでECRからログアウト
※なにもしなければ12時間でログアウトするけど不要ならログアウトした方が安全

```
$ docker logout アカウントID.dkr.ecr.リージョン.amazonaws.com
```

# ECSで行う作業の全体像を把握
・タスク定義
　docker-compose.ymlに相当する設定
　これをGUIで設定していくイメージ

・ECSクラスター作成
　ECS経由で立ち上げるEC2インスタンスに関する設定

・ECSクラスター -> サービス作成
　クラスターで立ち上げたEC2インスタンスに対して、どのタスクをどのように配置するかを設定する

# ECSのタスクを定義する
※記載がないパラメータは変更しないものとする

・タスク名をつける
　後から変えられないので注意
・コンテナの追加
　これがまさにdocker-compose.ymlに相当している
　▼ nginx

| 名称       | 設定値 |
|:----------|:-------|
| コンテナ名       | nginx |
| イメージ       | ECRにプッシュしたnginxコンテナの「イメージのURI」をコピーして貼り付け |
| メモリ制限       | 必要な分だけ設定。全コンテナの合計値がインスタンスのメモリサイズを超えないように注意 |
| ポートマッピング       | 今回はLBを通さない & httpアクセスなので80:80を設定 |
| スタートアップ依存順序       | depends_on設定。コンテナ名「php-fpm」、状態「START」を設定 |
| ネットワーク設定       | リンクに「php-fpm:php-fpm」を設定 |
| ストレージとログ       | ログ設定の「Auto-configure CloudWatch Logs」をONに (立ち上げに失敗した際にログを追えるようになる |
　他は最小構成では設定不要

　▼ php-fpm

| 名称       | 設定値 |
|:----------|:-------|
| コンテナ名       | php-fpm |
| イメージ       | ECRにプッシュしたphp-fpmコンテナの「イメージのURI」をコピーして貼り付け |
| メモリ制限       | 必要な分だけ設定。全コンテナの合計値がインスタンスのメモリサイズを超えないように注意 |
| ポートマッピング       | php-fpmは外に開ける必要無いので設定不要 |
| ストレージとログ       | ログ設定の「Auto-configure CloudWatch Logs」をONに (立ち上げに失敗した際にログを追えるようになる |
　他は最小構成では設定不要

・他は設定せず作成

# ECSクラスターを作成する
・Amazon Container Service -> Amazon ECS -> クラスター へ
・クラスターの作成

| ステップ      | 名称       | 設定値 |
|:----------|:-------|:----------|
|クラスターテンプレートの選択| クラスターテンプレートの選択       | EC2 Linux + ネットワーキング |
|クラスターの設定| クラスター名       | test-cluster |
||インスタンスの設定各種|インスタンスタイプや数は必要に応じて|
||AmiId|特に理由がなければ今は 「AmazonLinux2」|
||キーペア| コンテナの思想上、インスタンスに入って何かを操作する必要はないので 「なし」　 |
||ネットワーキング| vpc、サブネットは必要に応じた設定を |
||ネットワーキング - セキュリティグループ| ポートは80を開ける。IPは必要なものを |
||Auto assign public IP| Use Subnet setting |


・作成実行
　実行したクラスターの「ECSインスタンス」タブで、指定した個数のインスタンスが立ち上がり、ステータスがACTIVEになったことを確認

# コンテナを立ち上げる
・サービスタブを開いて「作成」

| ステップ      | 名称       | 設定値 |
|:----------|:-------|:----------|
|サービスの設定| 起動タイプ| EC2 |
|| タスク定義 ファミリー | 先ほど「タスク定義」で作ったタスクを指定 |
|| タスク定義 リビジョン | latest(最新バージョン)を指定 |
|| クラスター       | test-cluster |
|| サービス名       | 適当に |
||サービスタイプ|REPLICA (DAEMONだとどう変わるか後で調査|
||タスク数|1|
|ネットワーク構成|| LBを通す場合はここで設定。今回は何も設定せず次へ |
|Auto Scalingオプション|| EC2インスタンスの数をAutoScalingさせたいならここで設定。今回は何も設定せず次へ |

・サービスの作成
・作成したサービスのタスクタブにRUNNINGのタスクが出来あがれば成功
・EC2のpublicIPかDNS名にアクセスしてphpinfoが確認できればOK！