AWS Copilotを使ってECS実行環境を高速に構築する

- この記事は[MDCアドベントカレンダー](https://qiita.com/advent-calendar/2020/mdc)6日目の記事です


##AWS Copilotって何？
- ECSを使ってコンテナアプリを動かしたい時、コンソールからECSのクラスターを作成するだけでも項目がたくさんあって面倒
- AWS Copilotを使うとコマンドでAWSが面倒な設定をやってくれます
- 今回は以下の公式ドキュメントを元にCopilotを使ってECSにコンテナをデプロイします
  - https://aws.github.io/copilot-cli/

##前提
- AWSCLIがインストールされていること
  - `aws --version`
  - https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html
- CLIの利用設定が終わっていること
  - https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html
  - IAMでAPIKeyを発行して`aws configure`で設定する

# 1. Copilotインストール

```shell
# Macの場合はHomebrewが楽です
$ brew install aws/tap/copilot-cli

# WindowsだったりHomebrewが使えない時は直接ダウンロードします
$ curl -Lo /usr/local/bin/copilot https://github.com/aws/copilot-cli/releases/download/v0.1.0/copilot-darwin-v0.1.0 && chmod +x /usr/local/bin/copilot && copilot --help

# インストール確認
$ copilot --version
copilot version: v1.0.0
```
# 2. コンテナをECSにデプロイする
- Dockerfileを元にコンテナイメージを作成、ECSにデプロイします
- 今回はAWSが提供しているCopilotのサンプルアプリを使います


```shell
# サンプルアプリをclone
$ git clone https://github.com/aws-samples/aws-copilot-sample-service copilot-sample
$ cd copilot-sample

# コンテナをECSにデプロイ
$ copilot init

# 以下選択肢が出てきます
  # アーキテクチャのタイプ選択
  - Which workload type best represents your architecture?
    > Load Balanced Web Service
      Backend Service
      Scheduled Job

  # アプリ名入力
  - What do you want to name this Load Balanced Web Service?

  # Dockerfileの選択
  - Which Dockerfile would you like to use for machida-app?  
    > ./Dockerfile (Copilotが自動で検出してくれる)
      Enter custom path for your Dockerfile (Dockerfileのフルパスを自分で指定)
      Use an existing image instead (Dockerimageを自分で指定)

  # テスト環境へのデプロイ
    All right, youre all set for local development.
    Would you like to deploy a test environment? (y/N) 

  # Dockerイメージのビルド後、デプロイが走ります
  # CloudFormation経由でECSのクラスターを作成され、コンテナイメージをデプロイします

  # デプロイ成功するとアプリケーションへのURLが展開されます
    ✔ Deployed xxxxxx, you can access it at http://xxxxxxxx
```
- URLにアクセスするとサンプル画面が表示されます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289060/eade8e0b-9c22-45fc-bec6-09655e3c5e28.png" width=400pt>


##Copilotの概念
- 大きく3つの要素で構成されています。Environment > Application > Service という包含関係にあります。Applicationが実質ECSのクラスターになるので注意が必要です
  - Environment -> ECSClusterを稼働させる空間
  - Application -> ECSClusterに該当
  - Service     -> ECSCluster上で稼働するそれぞれのアプリケーション(≒ ECS Service)
- `copilot init`で作られたAWSリソースやファイル群の説明については以下が非常にわかりやすいです
  -  https://dev.classmethod.jp/articles/aws-copilot/
- 従来であれば上記のリソースを作成しないといけないが、Copilotコマンド一つで作成できました



##Copilotコマンド
```shell
# Applicationの情報取得
$ copilot app show

# Application削除
$ copilot app delete

# Serviceの情報取得（アプリケーションへのURLも記載されています）
$ copilot svc show

# Serviceの状態確認
$ copilot svc status

# Environmentの作成（環境をテスト・本番と複数面持ちたい時に利用します）
$ copilot env init
```


## 3. CodePipelineを作成してCICDっぽくする
- GitHubへのソースPushをトリガーにデプロイをするPipelineを作成します
- GitHubで新規リポジトリを作成し、ソースを自分のリポジトリにPushします

```shell
# 初回コミット
$ rm -rf .git
$ git remote add origin https://github.com/methimo/xxxxxx.git
$ git branch -M main
$ git push -u origin main
```
- Pipeline作成にはGitHubアクセストークンが必要なので取得します
 - https://github.com/settings/tokens/
 - `Generate New Token` -> 適当な名前を入力、全部の権限を入れて作成します
 - 表示されるトークンをメモっておくこと


- Pipelineを作成します

```shell
# パイプラインの作成
$ copilot pipeline init

 # 以下選択肢が出てきます
 - Would you like to add an environment to your pipeline? (y/N)

 - Which environment would you like to add to your pipeline?
   > test

 - Which GitHub repository would you like to use for your service?
   > https://github.com/methimo/xxxxxxx
   > アクセストークンを入力

# パイプラインを作成するための設定ファイル(copilot/pipeline.yml)が作成されます
# pipeline.ymlの内容からパイプラインを生成します
$ copilot pipeline update

# パイプラインが作成され、デプロイが始まります
# 以下で実行状況を確認できます(10分程かかります)
$ copilot pipeline status

```
- これでパイプラインの作成は完了です
- 試しにソースを編集してPushしてみましょう

```shell
$ vim index.html
$ git add .
$ git commit -m "message"
$ git push origin main
```
- しばらくするとパイプラインが走ります
- `copilot pipeline status` で進捗状況を確認できます
- 完了したら先ほどアクセスしたURLに再度アクセスします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289060/7d98f0f5-a4ba-6a35-a526-f57d6a4bec68.png" width=400pt>

- 修正したソースでコンテナアプリケーションが起動できました

##まとめ
- ECSの実行環境やアプリケーションデプロイをCopilotコマンドでさっくり作ることができました
- パイプラインをコマンドで作成することもできます
- CopilotでどこまでECSの設定をカスタマイズできるかは不明ですが、少なくともさっくりECSを使ってみたい場合には最適のツールです

##その他(雑談)
- GitHubの仕様変更でデフォルトブランチがmainに名前変更になったけど癖で`git push origin master`してしまう
- 記事書くためにググったら普段プレイしているスマホゲームがECS構成で動いていることを偶然知りました
  - https://pages.awscloud.com/rs/112-TZM-766/images/I3-04.pdf
- 自分が利用しているサービスが裏でどんな動きをしているのか意識すると楽しいですね

##出典
-  https://aws.github.io/copilot-cli/
-  https://dev.classmethod.jp/articles/aws-copilot/

ありがとうございました。