CopilotでECSを体験してみたい


##はじめに
この記事は[ハンズラボ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/handslab) 9日目の記事となります。

今回のテーマは現在開催中の[AWS re:Invent](https://aws.amazon.com/jp/about-aws/events/2020/reinvent/)からではないですが、
ECSの構築を簡単にしてくれるCopilotが一般公開されたのでこちらを見てみます。

## この記事の対象者
- 右も左もわからないけど、Dockerやってみたい！ECS気になる！な方
- ECSでインフラ構築しなくちゃどうしよう。。な方
- ~~当時闇雲にインフラ構築をして疲弊していた知識不足な自分に向けて~~


## Copilotとは
概要についてはAWSブログより引用。
[ECS CLI](https://github.com/aws/amazon-ecs-cli)の後継にあたるものみたいです。

https://aws.amazon.com/jp/blogs/news/introducing-aws-copilot/

>AWS Copilot は、低レイヤなインフラの手動管理から脱却し、自身のアプリケーションとそのライフサイクルにフォーカスしたい ECS ユーザのためにデザインされました。Copilot は、ECS チームのエンジニアや ECS のお客様が作り上げてきたベストプラクティスに基づき、デフォルトでモダンかつプロダクションレディなインフラを構築します。




AWSだとCloudFormation or CDK(Cloud Development Kit) が良いのかなと考えますが、やっぱり大変ですよね。。


CloudFormationと聞きますと、こちらの記事を思い出します。

[CloudFormationの全てを味わいつくせ！「AWSの全てをコードで管理する方法〜その理想と現実〜」](https://dev.classmethod.jp/articles/aws-all-iac/)

>[![引用](https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/11/slide07-min.png)](https://dev.classmethod.jp/articles/aws-all-iac/)

最初の一歩を踏み出すには、中々が勇気がいりそう。。
そんな感じでスルーしてしまうのは非常に勿体ないので、是非Copilotから自動化の素晴らしさを体験してみましょう！！

## Copilot動かしてみる
### 前提
- macOS
- aws cliインストール＆設定済み
（```aws configure```でデフォルトプロファイルを設定。）

### Copilot インストール

```bash 
$ brew install aws/tap/copilot-cli
```
```copilot --help```を実行すると以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/b690bf18-da12-2e33-8c05-6ea9c8500773.png)

DevlopとReleaseとあって、CI/CDパイプラインもすぐ組めそう。

ドキュメントはこちらから。```copilot docs```でもいけます。↓
https://aws.github.io/copilot-cli/


### アプリを用意
（こちらを拝借）
https://github.com/Daviey/nyan-cat

Dockerfileは以下のようにします。

```dockerfile

FROM nginx:alpine
EXPOSE 80
COPY . /usr/share/nginx/html
```

### さっそく実行

```bash
copilot init
```
いくつかのやりとりを経てデプロイが実行されます。
ひとまずテスト環境として、アプリケーションがデプロイされるイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/7182a8dc-e121-0431-3684-57ce32dd6d05.png)


途中でCloudFormationのコンソールをみてみると、
こんな感じでスタックが作成されていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/4e6d52de-f814-b428-c26c-90c8f1291e46.png)

ECRへimageのpushが終わりました。
デプロイが完了したようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/c7719e54-ac59-8590-4512-918913455964.png)
一応、デプロイ完了後のCloudFormationコンソールも。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/cbef12dc-c6ab-7631-6da4-d82bff16266b.png)

### アクセスしてみる
コンソールをみると、URLあるのでそこからアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/f2adc727-7586-aa5d-45f6-fe74605e210b.png)
うごいたーー
猫が飛んでいます。

ここまで15分くらいあれば速攻でECSデプロイいけます。

### 本番環境へデプロイしたい
本番環境としてデプロイしたい場合には
```copilot env init```を実行すると、環境ごとのインフラを構築してくれます。
（nameはproductionとします）

設定ファイル(manifest.yaml)の値を書き換えて、
以下コマンドを実行するだけでデプロイができます。

```bash
copilot svc deploy --env production
```

以下のようにenviromentsを上書きするだけで、
複数のAZに対してコンテナを配置して、可用性の高いアプリケーションとすることが出来ます。（す、凄い）

```yaml
environments:
  production:
    count: 2
    cpu: 1024
    memory: 2048
```

## Copilotはどれだけ楽にしてくれるか
ECSでアプリケーションを実行するには最低でも以下AWSサービスを利用します。

    - ECS
    - ECR
    - EC2( or Fargate)
    - ELB
    - VPC（サブネットも色々気にしないといけない）
    etc...
多いです。
手で作る or Cfnで構築といった場合は上記すべてを網羅しておく必要があります。

先程の```copilot init```を絵に表すとこんな感じ。。
（これも細かい所は省いています。間違っていたらすみません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/1c730d26-7774-6cff-8569-db6ca8f0afaa.png)

コンテナの恩恵を被るには、結構準備が必要です。


デプロイしたいアプリケーションさえあれば、すぐにリリースできる。
そんなことがCopilotだと可能です。素敵ですね。

## 考察
所属チームでは、システムのマイグレーションは中長期的な課題ではあるので、
コンテナ化する際の選択肢の一つとしてCopilotはアリかなと考えています。


現状、マイグレーションの一環としてECS化は結構進んでいるので。。

弊社のようにのっぴきならない事情がない限りは、
こういったツールをドンドン活用していった方が良いかなと思われます。。

マイグレーションの歩みはこちらから見れます。
[ハンズラボエンジニアブログ](https://www.hands-lab.com/tech/entry/category/unicage)


## 最後に
最後まで読んでいただきありがとうございました。

消し忘れると課金されてしまうので、不要であれば消しましょう。

```
copilot app delete --env-profiles test=default
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927949/99bd8ade-43f0-f432-ade4-a6eedee426ea.png)

以下でCopilotでの自動デプロイが紹介されているみたいなので、今度試してみたいと思います。
https://aws.amazon.com/jp/blogs/news/automatically-deploying-your-container-application-with-aws-copilot/



## 参考情報
- [AWS Copilotのご紹介](https://aws.amazon.com/jp/blogs/news/introducing-aws-copilot/)
- [AWS Copilot によるコンテナアプリケーションの自動デプロイ](https://aws.amazon.com/jp/blogs/news/automatically-deploying-your-container-application-with-aws-copilot/)
- [AWS Copilot CLI](https://aws.github.io/copilot-cli/)