【Copilot】Djangoアプリをコマンド一つでデプロイする【Fargate】

#はじめに
**AWS Copilot**を使用してDjangoアプリを**AWS Fargate**上に**爆速デプロイ**する手順を紹介します。

#最終結果
下準備完了後以下のコマンド一つ(と数回の対話形式の質問)でデプロイが完了し、Djangoアプリへブラウザからアクセスできます。

```
copilot init
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/b8dacab7-694c-25e9-9153-38d3cfeeeab1.png)

#Fargate？Copilot？
AWS Fargateとは…と調べると小難しい記事が沢山出てきますが、要は**コンテナイメージを用意してAWSにコンテナを実行・運用してもらうサービス**です。
コンテナを実行するサーバーの管理はAWSが行うので、**OSのアップデート等めんどくさいサーバー管理は必要ありません**。

しかし、従来Fargateを使用するには予め数多くのリソースを作成する必要がありました（ネットワーク、ロードバランサー、コンテナイメージのリポジトリ…）。
Copilotはそれらの**めんどくさい作業をコマンド一つで引き受けてくれます**。

つまり、この二つを使うと**めんどくさい作業が無くなります**。
※ほんとはもっと奥深いサービスなんですが、この記事を読む分にはこれくらいの理解で十分です

#下準備
### AWS CLIインストール
OSによってインストール方法が変わります。
手順の解説記事は検索で簡単に見つかるので割愛します。
公式ドキュメントは[こちら](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)。
以下コマンドで正しいプロフィール情報が確認できればOKです。

```
aws configure list
```

### Dockerインストール
こちらも同様にインストール手順は割愛します。
公式ドキュメントは[こちら](https://docs.docker.com/get-docker/)。
以下コマンドでバージョン情報が確認できればOKです。

```
docker --version
```

### AWS Copilotインストール
OSごとのインストールコマンドが[公式ドキュメント](https://aws.github.io/copilot-cli/docs/getting-started/install/)に載っています。
筆者はWindowsユーザーですが追加で一手順必要だったので内容を記載しておきます。
<details>
<summary>**Windowsインストール方法**</summary>
<div>

* PowerShellから公式ページに記載されているインストールコマンドを実行  
  ※PowerShellは管理者として実行してください

```
Invoke-WebRequest -OutFile 'C:\Program Files\copilot.exe' https://github.com/aws/copilot-cli/releases/latest/download/copilot-windows.exe
```

* 環境変数のPathに`C:\Program Files`を追加
* ターミナルから以下コマンドでバージョン情報が確認できればOK

```
copilot --version
```

</div>
</details>

###サンプルソースをGitHubからダウンロード
Copilotのコマンドは**Gitローカルリポジトリのルートディレクトリから実行されることが前提となっています**。
今回はGitHubに[サンプルアプリ](https://github.com/TakahiroHimi/django-copilot-test)を用意しましたのでお使いください。

```
git clone https://github.com/TakahiroHimi/django-copilot-test
cd django-copilot-test
```


#実践！
**※注意！**
これから実行するコマンドはAWS上にリソースを作成しますが、中には**有料のリソースも存在します**。
最後に作成したリソースを一括削除するコマンドも紹介します。
作成して動作確認後すぐ削除すれば大した料金にはなりませんが、**削除を忘れてしまい意図せず料金がかかることがないようお気を付けください**。

* ターミナルから以下コマンドを実行

```
copilot init
```
以下対話形式で質問が続きます。

* デプロイするアプリケーションの名前を聞かれるので任意の名前（ここでは`copilot-test`）を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/89b17be3-38f7-3de8-05d2-c66ba7ad358d.png)
* サービスのタイプを聞かれるので`Load Balanced Web Service`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/297d88bb-5e36-abc6-1cab-2dcdd48359bf.png)
* Webサービスの名前を聞かれるので任意の名前（ここでは`copilot-test`）を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/43246979-caf9-6f8c-e2a8-5d2a2c6ca60c.png)
* デプロイするコンテナのDockerfileを聞かれるので、カレントディレクトリの`./Dockerfile`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/a1f6c2e2-30b8-f1a9-0fd9-4adf29a5c9f3.png)
* リソースの作成が始まります。しばらくするとテスト環境にアップして良いか聞かれるので、`y`でアップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/5f2e20aa-75cb-0bca-65d7-731c534144c1.png)


* しばらく待つと（10分程度かかります）作成されたロードバランサーのエンドポイントURLが表示されるのでアクセスし、Djangoサンプルページが確認できればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/8ba56505-7517-9e1c-67be-183fb3c1127f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/3e32b1c1-dc56-f279-5bd8-218162592f33.png)



#リソース削除
以下コマンドで作成したリソースの一括削除ができます。
※最後のアプリケーション名(`copilot-test`)はご自身で入力されたものに変更してください。

```
copilot app delete copilot-test
```

#ハマりどころ
copilotはリソース作成先のavailability zoneにAWS CLIデフォルトで設定されているリージョンのaを選択します(`aws configure`で設定しているリージョンが東京(`ap-north-east-1`)ならap-northeast-1a)。
この時aが使用不可であると自動的にbを選択するわけではなく、**デプロイがエラー終了するので注意してください**。
この手のエラーログはCloudFormationのダッシュボードから確認可能です。

#あとがき
本番環境にデプロイする際には今回紹介した手順に加えてシステムの冗長化や実行環境のリソース(CPU,メモリ等)、CI/CD等多くの設定が必要になるかと思います。
しかしプロトタイプや個人開発の簡易なアプリをデプロイする場合、現状**コマンド一つでデプロイできるCopilotが最も簡単なデプロイ方法**なのではないかと思います。

今年Djangoで社内システムを作成・AWS Fargateにデプロイするという仕事があり、システムの設計～デプロイまで一人で行い中々時間がかかりました。特に環境構築。
リリースは6月だったのですが、**その1か月後AWS Copilot**がリリースされ、私が時間をかけて行った環境構築の大部分が`copilot init`だけで終わる様を見て呆然としました。
この記事も本当は私が実務で作成した環境の構築手順を記録する予定だったのですが、copilotの解説の方が需要ありそうだったので急遽変更しました。悔しい。

以上です。お疲れ様でした:cat2: