Github Actions+ECR+ECSでアプリケーションをデプロイ

GithubActionsを初めて使ってみた！
というわけで記事に残します。
## Dockerfileの作成
まずはアプリの元となるDockerfileを作成する。
詳細は割愛。よかったら、[この記事](https://qiita.com/ysda/items/2e1c497f0275a4300302)を参考にしてみてね。

## AWS側でやること
### ECRリポジトリの作成
AWSのコンソールからリポジトリを作成する。
![スクリーンショット 0005-12-02 19.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/6aedec0f-55cc-8b39-61bd-5b6b98e96d62.png)

細かい設定は置いといて、とりあえずリポジトリ名だけ設定すればOK。
![スクリーンショット 0005-12-02 15.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/2370e3cd-1714-faca-9be5-dd235e03cbc2.png)

### ECSクラスタの作成
ECSクラスタを作成。今回はFargateを選択。
![スクリーンショット 0005-12-02 20.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/d8029fd3-a0c0-0576-3861-16e802180180.png)

### ECSタスク定義の作成
ECS>タスク定義>タスク定義作成ボタンをクリック・
![スクリーンショット 0005-12-02 20.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/8ed0bb08-2f19-d114-49db-361076c893c4.png)

タスク定義ファミリー名を任意の値に変更。
![スクリーンショット 0005-12-02 20.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/97edf984-16cc-d442-7a54-3e165bfcfa62.png)

高スペックである必要はないので。タスクサイズは最低限とした。
![スクリーンショット 0005-12-02 20.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/9e021bf9-74fb-266e-3a17-c3adc778d19f.png)

### ECSサービスの定義
クラスター名をクリックすると、サービス定義の画面に遷移する。
ここで作成をクリック。
![スクリーンショット 0005-12-02 20.21.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/17b7e71d-afbd-e6d1-4a70-de13f8a78a53.png)

ファミリーに先ほど作成したタスク定義を指定する。
その他の設定はデフォルトのまま作成。
![スクリーンショット 0005-12-02 21.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/4b1b0919-6582-f838-30d9-eac38d893d68.png)

### デプロイ用のIAMユーザーの作成
強力な権限を持ったユーザーでデプロイを行うのはよろしくないので、最低限の権限を与えたユーザーを作成する。
+ ECSサービスへのアクセス権限
+ タスク定義の登録と更新の権限
+ ECRリポジトリへのプッシュとプルの権限

とりあえず、以下の権限をつけた。
ちょっと冗長かもしれないけど、FullAccessって書いてあるからECRとECSに関することは何でもできるでしょ。
権限周りは要勉強。
`AmazonEC2ContainerRegistryFullAccess`
`AmazonECS_FullAccess`
![スクリーンショット 0005-12-02 22.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/c0b3e9c6-0ca8-8e5a-3a5e-8bb3fb7dde34.png)

最後にアクセスキーを作成する。
IAM>ユーザー>ユーザー名にアクセスキー作成リンクがあるので、そこから作成。
![スクリーンショット 0005-12-02 22.33.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/c5e5253f-5daa-9458-2e0d-003ab4d5c741.png)

アクセスキーは忘れても再発行出来ないので、CSVファイルをダウンロードして保存しておく。
![スクリーンショット 0005-12-02 23.13.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/a3378f01-4255-bb82-7e3a-8f9552778ce1.png)


## Github側でやること

### AWS認証情報の設定
AWS側で作成したアクセスキーをgithubに登録する。
これで、GithubActionsがAWSのリソースにアクセスできるようになる。
settingsタブ>ACtions>New repository secretをクリック。
![スクリーンショット 0005-12-02 23.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/187896f4-afa7-0dca-665b-fca2b06adccc.png)

Nameに環境変数の名前、Secretにアクセスキーの内容を入力して完了。
AWS_SECRET_ACCESS_KEYでも同様の作業を行う。
![スクリーンショット 0005-12-02 23.26.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/01d95276-d99a-918c-6eef-778dc80e7e2b.png)

### ワークフローファイルの作成
Githubのリポジトリにワークフローファイル(デプロイの設定ファイル)を作成。
.github/workflowsディレクトリにファイルがないとダメっぽい。
githubのActionタブから、ワークフローファイルの雛形が作成可能。
![スクリーンショット 0005-12-02 19.09.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/902c6b7c-a796-136a-4e16-48297fae2099.png)
![スクリーンショット 0005-12-02 19.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/43ed626e-905b-af9e-923c-0080af04590c.png)

### ワークフローファイルの修正
#### 環境変数
1. AWS_REGION
ECRリポジトリを作ったリージョンを記載。私の場合は東京リージョンに作ったのでap-northeast-1
1. ECR_REPOSITORY
GithubActionでイメージをプッシュするECRリポジトリを設定。
![スクリーンショット 0005-12-02 19.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/6a486915-e852-0b9b-3014-99dfdb4f7ebd.png)
1. ECS_SERVICE、ECS_CLUSTER
先ほど作成した、ECSサービス、クラスタの名前を設定する。
1. ECS_TASK_DEFINITION
タスク定義はJSONファイルのパスで指定する必要がある。
JSONはタスク定義のJSONタブから取得可能。
JSONファイルはルートディレクトリに保存しておいた。GithubActionsでは、デフォルトでルートディレクトリを参照するらしい。
![スクリーンショット 0005-12-02 22.01.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/e02ddc4b-c17a-a393-dba7-08f19fee6dc8.png)

1. CONTAINER_NAME
タスク定義の中で設定したコンテナ名を指定する。

#### その他
必要に応じて、build時のDockerfileのパスを修正する。
GithubActionsはリポジトリのルートをカレントディレクトリとするようなので、ルートディレクトリにDockerfileがあれば以下の設定でOK。
```yaml
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
```

## いざデプロイ！
デフォルトの設定では、mainブランチにコミットをマージすればデプロイが始まるようになっている。
ということで早速コミット&マージ。
デプロイの進捗状況はActionsタブから確認できる。
私の簡易的なアプリでもデプロイに5分ぐらいかかるので、商用で使うんだったら課金しないと厳しそう。
![スクリーンショット 0005-12-03 20.04.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/69512717-3108-af25-6b46-e6f78dab4a34.png)

ブラウザで稼働確認も無事終了。(東京の気温と天気を表示しているだけ)
![スクリーンショット 0005-12-03 20.35.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/fc501557-a988-735e-ea2f-4ae4fc9aecc7.png)