AWS Copilotを触ってみた

#きっかけ
最近Selenium WebDriverのテスト実行環境をDocker Composeで組んで、ECSに上げてみようかなーと思っていたところにAWS Copilotなるサービスが登場したので触ってみました。
今回はSeleniumを走らせるのではなく、チュートリアル的にシンプルなnginxのwebサーバを立てて動作を確認したいと思います。

#AWS Copilotって何が出来るの？
AWS Copilotを使うことで、対話形式のセットアップで簡単にDockerfileからAmazon ECSでコンテナ起動ができます。
テスト環境や本番環境など環境毎のコンテナデプロイも簡単に行えます。

#インストール
Homebrewか直接バイナリダウンロードでインストールを行います。

```bash
# Homebrew
$ brew install aws/tap/copilot-cli

# 直接ダウンロード
$ 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: v0.1.0
```

#必要なファイルの準備
Dockerfileと今回はnginxを動かすのでWebサーバ用のindex.htmlファイルを用意しておきます。

```bash
# ファイル置き場
.
├── Dockerfile
└── index.html
```

Dockerfileの中身はシンプルに以下の内容です。

```dockerfile
FROM nginx
EXPOSE 80
COPY index.html /usr/share/nginx/html
```

# アプリケーションのセットアップおよびテスト環境へのデプロイ
インストールが終わったら以下のコマンドで対話形式のセットアップを行います。
今回はnginxを立ち上げるので`service type`は`Load Balanced Web Service`を選択します。

```
# 任意のフォルダで
$ copilot init

  What would you like to name your application? [? for help]    # アプリケーション名を指定

  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 nginx-test? [Use arrows to move, type to filter, ? for more help]
  # 自動検出されるDockerfileを選択します。copilot init実行配下のフォルダの中のDockerfileも見つけてくれます。
```
これだけで必要なものは自動的にセットアップされます。（処理が終わるまで少し時間がかかります）
しばらく待ってセットアップが完了すると
`All right, you're all set for local development.`
と表示され、テスト環境にデプロイをするかどうか聞かれます。（テスト環境だけ自動で作成され、他の環境は後述のコマンドで作ります。）
ここではテスト環境にデプロイをします。

```bash
  Would you like to deploy a test environment? [? for help] (y/N)
```

するとデプロイが開始され、またしばらく待ちます。（10分くらい？）

git管理しているフォルダで`$ copilot init`を行った場合、Copilotのセットアップで自動作成されたAmazonECRのImageタグにはcommit番号？（7桁の英数字）が入ります。
git管理していない場合は以下のメッセージが表示され、Imageタグを入力するように求められます。

```bash
  Input an image tag value:
```

すべてが完了すると最後にデプロイしたテスト環境へのアクセスURLが表示されます。
ブラウザでアクセス出来るか確認してみましょう。
もしアクセス先のURLが分からなくなった場合は、以下のコマンド結果の`Routes`に載っています。

```bash
$ copilot svc show
```

#デプロイ先環境の作成
テスト環境は自動で作られていましたが、それ以外にSTG環境や本番環境など任意の環境を作りたい場合は以下のコマンドで作成します。

```
$ copilot env init

  What is your environment's name? [? for help]    # 作成する環境名

  Which named profile should we use to create 『指定した環境名』? [Use arrows to move, type to filter, ? for more help]    # AWS CLIで複数profileを設定している場合に選択する
```

作成まで少し時間がかかります。

作成した環境一覧は以下のコマンドで確認できます。

```bash
$ copilot env ls
```

#作成したデプロイ先環境にデプロイ
環境を作成したらデプロイを行います。
テスト環境のデプロイと同じように、git管理していない場合はAmazon ECRのイメージタグを入力するように求められます。

```bash
$ copilot svc deploy --env 『作成したデプロイ環境』

  Input an image tag value:
```

デプロイが完了したらURLが表示されます。

複数の環境を作成した場合、`./copilot/『サービス名』/manifest.yml`に以下の記述を追記することで環境毎にスペックを変更することも可能です。
詳しくは[AWS Copilot のご紹介 | Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/introducing-aws-copilot/)を確認してください。

```yml
environments:
  『デプロイ環境名』:
    count: 2      # アプリケーションを複製して動かす数
    cpu: 1024     # CPUの割当量
    memory: 2048  # メモリの割当量
```

#その他のCopilotのコマンド
####アプリケーションの一覧を表示

```bash
$ copilot app ls
```

####アプリケーションに含まれるサービスや環境の一覧を表示

```bash
$ copilot app show
```

####アプリケーションの削除
ここまでで作成したアプリを丸ごと削除します。

```bash
$ copilot app delete
```

####サービスの一覧を表示

```bash
$ copilot svc ls
```

####サービスのログを表示
デプロイした環境が複数ある場合はログ出力する環境を聞かれます。
色々フラグがあるので詳しくは[svc logs command · aws/copilot-cli Wiki](https://github.com/aws/copilot-cli/wiki/svc-logs-command)を確認してください。

```bash
$ copilot svc logs
```

###サービスのステータスの表示
デプロイした環境が複数ある場合はログ出力する環境を聞かれます。

```bash
$ copilot svc status
```
#まとめ
~~`copilot pipeline init`まで手が出せなかった（というかやったけど上手くいかなかった）ので、pipelineも理解したら続きを書いたいと思います。~~
出来たので[Copilot Pipeline記事](https://qiita.com/takeh/items/d61ce466146f4be94be7)を書きました。

#We're hiring!
AIチャットボットを開発しています。
ご興味ある方は [Wantedlyページ](https://www.wantedly.com/projects/266837) からお気軽にご連絡ください！

# 参考
[ECSのオペレーションを劇的に簡略化するAWS Copilotが発表されました！ | Developers.IO](https://dev.classmethod.jp/articles/aws-copilot/)
[AWS Copilot のご紹介 | Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/introducing-aws-copilot/)
[Home · aws/copilot-cli Wiki](https://github.com/aws/copilot-cli/wiki)