ECSをコマンドで自動作成したいですって？

# それ、できます。
**そう、copilotならね。**
## AWS-copilotとは
ECS上でアプリケーションを作成する際の環境作成や連携をコマンドを叩けば自動でやってくれるとのこと。
2020年6月にリリースされてから12月現在に至るまでほぼ毎月アップデートされ、新機能が追加されている。
※旧ECS-CLI
こちらの記事で紹介されてます。
[AWS Copilot のご紹介](https://aws.amazon.com/jp/blogs/news/introducing-aws-copilot/)

## 目標
1. アプリケーションの作成
2. 環境の作成
3. サービスの作成およびデプロイ

# 実際にやってみる
ここからの作業は作業者様の環境等に合わせて適宜読み替えていただければと思います。
## 準備
###インストール

- AWS-copilot

```
$ curl -Lo /usr/local/bin/copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-darwin && chmod +x /usr/local/bin/copilot && copilot --help
```

もしくは

```
$ brew install aws/tap/copilot-cli
```

- AWS-cli

```
$ brew install awscli
$ aws --version
aws-cli/2.0.54 Python/3.8.5 Darwin/19.6.0 source/x86_64
```
aws configureで必要情報の設定。下記参照願います。
[設定の基本 - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html)

- Docker

```
$ brew cask install docker
```


##copilotの実行
自分で作成したDockerfile等がない場合、
サンプルが用意されているのでそちらをクローンしてテストしてみてください。
https://github.com/aws-samples/aws-copilot-sample-service

また、私の環境だとエラーが出て進まなかったため個別に実行していますが、
`$ copilot init`でまとめて実行も可能です。

- アプリケーションの作成

```
#Dockerfileがある作業ディレクトリに移動
$ cd workspace
$ copilot app init

  What would you like to name your application? [? for help] #任意のアプリケーション名
```


- 環境の作成

```
$ copilot env init

  What is your environment's name? [? for help] #任意の環境名
```
上記の場合、VPC等が諸々新規で作成されます。
既存環境を使用する場合は下記のオプションでVPC及びサブネット指定が可能。

```
$ copilot env init --import-vpc-id vpc-****** --import-public-subnets subnet-******,subnet-****** --import-private-subnets subnet-******
```

- サービスの作成/デプロイ

```
$ copilot svc init

  Which service type best represents your service's architecture?  [Use arrows to move, type to filter, ? for more help]
  > Load Balanced Web Service
    Backend Service

  What do you want to name this Load Balanced Web Service? [? for help] #任意のサービス名

  Which Dockerfile would you like to use for [サービス名] ?  [Use arrows to move, type to filter, ? for more help]
  > ./Dockerfile 
    Enter custom path for your Dockerfile
    Use an existing image instead

$ copilot svc deploy --name [サービス名]
```
これで一通りの構築が完了してしまいました。
うまくいけばターミナル上ですべて完結。
AWS-CLIと組み合わせればもっと色々できそうです。(私はよくわかっていない。)

### おまけ
マルチサイト化したかったため、私が追加実施した内容は大まかに以下の通り。
なにかの参考になれば幸いです。

- 追加するサイトの設定をDockerfileに記述
- copilot svc init/deploy
- AWSコンソール上でECS>クラスター>タスク定義にボリューム追加
- コンテナ定義のソースに上記ボリュームを設定、コンテナパス追記
- Route53にホストゾーン作成、copilotで作成したALBを選択
- ALBリスナーにルールを追加。転送先に作成したサービスのターゲットグループを指定
- 追加したいサイトの数だけ繰り返し

# 最後に
便利です。
なにかしらのエラーで上手く進まない場合はCloudFormationのログが助けになりました。

現在はタスク定義の変更を手動でやっているので、
今後JSONファイルを読ませて自動で設定してくれないかなと思っています。
既にその機能があって見逃してるだけだったらすみません。
また、今回書いた内容に不備があればご指摘いただけると幸いです。

ここまで読んでくださりありがとうございました。
少し早いですが良いお年をお過ごしください。

## 参考
- [ECSのオペレーションを劇的に簡略化するAWS Copilotが発表されました！ _ Developers.IO](https://dev.classmethod.jp/articles/aws-copilot/#toc-10)
- [AWS Copilot のご紹介](https://aws.amazon.com/jp/blogs/news/introducing-aws-copilot/)
- [コンテナの環境構築とデプロイをサポートする『AWS Copilot』の概念や用語を理解する - 継続は力なり](https://sadayoshi-tada.hatenablog.com/entry/2020/07/10/120000)
- [『AWS Copilot CLI』のコマンドとパラメーターから『AWS Coplilot』の理解を深める - 継続は力なり](https://sadayoshi-tada.hatenablog.com/entry/2020/07/31/204041#copilot-svc)