ECS-CLIを使ってDocker ComposeでAWS ECSに簡単デプロイ（ハマり実況）

# 結論

docker-compose.ymlをecs-cli用に書き直すことは必要だけどとりあえず、デプロイまではできた
`build` ディレクティブなどが書けないようなので注意
[チュートリアル: ECS CLI を使用して EC2 タスクのクラスターを作成する(公式)](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_CLI_tutorial_EC2.html)


# 用意するもの
- docker-compose 実行環境（開発環境）
- ecs-cli (Amazon ECSのコマンドラインツール) - aws-cliみたいなもの
- AWS Access key ID
- AWS Secret Access Key
- AWS EC2のキーペア：KEY_NAME（ECSのベースとなるEC2インスタンスを起動するため）

## 開発環境の用意
- docker-compose.ymlをせこせこつくる

Docker HubにあるPHP(Apache)とかMySqlとかのコンテナイメージを
公式を優先して組み合わせ
environmentsでパスワードなどを書ける（←本番のときやばいやつ）

手前味噌ですが、[Dockerで作るWordPressテーマローカル開発環境](https://qiita.com/KoichiSugimoto/items/fc993e2d52dbed39fc79)

## ecs-cli のインストール
```
$ brew install amazon-ecs-cli
```
でインストールできました。とのことです。@takarakeさんコメントありがとうございました。
記事投稿当時は `$ brew install ecs-cl` でインストールしました

## AWS アカウントの確認
IAMとかなんとか

# ECS CLI実行

## Configureで最初の設定

- リージョン
- AWS Access key ID
- AWS Secrete Access Key
- (Configure出力フォーマット)

### AWS CLI のデフォルト環境設定

```
$ aws configure
AWS Access Key ID [None]: AKXXXXXXXDXXXXXGXFXA
AWS Secret Access Key [None]: fxxqxxxxxxL2xxctxxxxxrgn7WxxxxRx34tcEL
Default region name [None]: ap-northeast-1
Default output format [None]: text
```

対話式でAWS Access key ID・AWS Secrete Access Keyを設定
（Default output formatはtextでOK、なにもしなければjsonになる）

`.aws/config` に記載されます

```text:.aws/config
[default]
output = text
region = ap-northeast-1

[test]
output = text
region = ap-northeast-1
```

`.aws/credentials` に記載されます

```text:.aws/credentials
[default]
aws_access_key_id = AKXXXXXXXDXXXXXGXFXA
aws_secret_access_key = fxxqxxxxxxL2xxctxxxxxrgn7WxxxxRx34tcEL

[test]
aws_access_key_id = AKXXXXXXXDXXXXXGXNVQ
aws_secret_access_key = 8xxqxxxxxxL2xxctxxxxxrgn7WxxxxRx34trGZ
```

AWSのアカウントを個人用・会社用など複数持っているときは、profileとして
別のIAMアカウントを登録することができます
[AWS CLI の設定 » 名前付きプロファイル（公式）](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-multiple-profiles.html)

### ECS CLIのデフォルト環境設定

```
$ ecs-cli configure --region ap-northeast-1 --cluster ecs-cli-test
```

リージョンの選択と、クラスタ名は適当に

## ECS 起動

```
$ ecs-cli up --keypair KEY_NAME --capability-iam --size 2 --instance-type t2.micro
```

5分くらいかかる

怒られた

```
reason="The key pair ‘KEY_NAME’ does not exist (Service: AmazonAutoScaling; Status Code: 400; Error Code: ValidationError; Request ID: cfd012c3-8450-11e8-b993-599e5d2091a0)" resourceType="AWS::AutoScaling::LaunchConfiguration"

AWS Auto Scaling is not available in アジアパシフィック (東京). Please select another region.
```

ap-northeast-1aはAutoScalingに対応していないらしい `–azs` オプションでリージョンを限定
再度実行するときはクラスタ名が同じになるので、 `--force` オプションで上書き

```
$ ecs-cli up --keypair KEY_NAME --capability-iam --size 2 --instance-type t2.micro -azs ap-northeast-1b,ap-northeast-1c --force
```

また怒られた

```
reason="Value (ap-northeast-1b) for parameter availabilityZone is invalid. Subnets can currently only be created in the following availability zones: ap-northeast-1d, ap-northeast-1a, ap-northeast-1c. (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterValue; Request ID: e82814f4-6472-46fc-8932-8216da502760)" resourceType="AWS::EC2::Subnet"
```

ap-northeast-1bはVPCあかんみたいなこと言ってる
参考：[20170308 古参AWSユーザーが悩むap-northeast-1bからの脱却](https://www.slideshare.net/makaibito/20170308-awsapnortheast1b)

えい、`ap-northeast-1b` つかわずにいけ

```
$ ecs-cli up --keypair KEY_NAME --capability-iam --size 2 --instance-type t2.micro --force -azs ap-northeast-1c,ap-northeast-1d
```

まただめですね

```
reason="The key pair 'sugimotokey' does not exist (Service: AmazonAutoScaling; Status Code: 400; Error Code: ValidationError; Request ID: 80e0d755-8457-11e8-81ce-ef05996f82c3)" resourceType="AWS::AutoScaling::LaunchConfiguration"
```

コンソールのEC2でAutoScalingの起動設定ってのがあるので、
KEY_NAMEで指定しているキーペアでちょっと作成してみた
なんだかよくわからないけどAutoScalingグループを追加

```
$ ecs-cli up --keypair KEY_NAME --capability-iam --size 2 --instance-type t2.micro --force
```

なぜかAWSコンソールEC2のキーペアで作成した鍵ではだめだったので、
aws-cliで新しい鍵を作成

```
$ aws ec2 describe-key-pairs --key-name KEY_NAME
```

```
$ ecs-cli up --keypair KEY_NAME --capability-iam --size 2 --instance-type t2.micro --force
```

行けた。

ちなみにここまで書いてきた `KEY_NAME` は任意

## ECS上でコンテナ起動

```
$ ecs-cli compose -f docker-compose.yml up
```

```
ERRO[0000] Unable to open ECS Compose Project            error="Volume driver is not supported"
FATA[0000] Unable to create and read ECS Compose Project  error="Volume driver is not supported"
```

トップレベルでのvolumesはサポートされてない・・・。
`docker-compose`を書き直してどうにかこうにか成功。

# 後始末

## コンテナ落とす

```
$ ecs-cli compose -f docker-compose.yml down
```

## サービスとして起動

サービスを定義することにより、オートスケールやコンテナがコケた場合の再起動が可能になります。

```
$ ecs-cli compose -f docker-compose.yml  service up
```

## サービス削除

```
$ ecs-cli compose -f ./docker-compose.yml service rm
```

## コンテナ全消し

```
$ ecs-cli down --force
```


# 参考記事
[ローカルで使用したdocker-compose.ymlを使ってECS上でコンテナを起動する](https://qiita.com/furu8ma/items/6a7bd4d85617ef55f2c6)