GithubActionsとAWS App Runnerで自動デプロイしてみた

## はじめに
最近参加したwebinerにて、AWS App Runnerというものを知ったため触ってみました。

https://aws.amazon.com/jp/apprunner/

簡潔にいうと、
>コンテナ化されたウェブアプリケーションや API を開発者が簡単かつ迅速にデプロイできるフルマネージド型サービスです

とのことです。
GitHubのソースコードをApp Runner上でビルド＆デプロイ、またはECRのビルド済みコンテナイメージがデプロイできます。

webinerではGitHubのソースコードからデプロイを行うデモをしており、同じような手順で試したところ、確かにあっさりとサービスが立ち上がりました。
記事にするほどでもないくらいサクッとできてしまったため、折角なので今回はECRのイメージからのデプロイをやってみました。
また、前々からGithubActionsを触ってみたいと思っており、うまく連携させられるみたいだったため取り入れてみます。

## GitHub Actionsとは
https://docs.github.com/ja/actions/learn-github-actions

CI/CDツールで、「リポジトリに対するプッシュやプルリクエスト」といった操作、もしくは「指定した時刻になる」といったイベントをトリガーとして、あらかじめ定義しておいた処理を実行することができます。

今回は、masterに変更がプッシュされた際にイメージをビルド → ECRにプッシュといった処理を実行させます。

App Runnerは、ECRにイメージがプッシュされた際はそれを検知して自動でデプロイすることも可能です。
そのため、
```
masterに変更をプッシュ
↓
GitHubActionがそれを検知してイメージビルド ＆ ECRにプッシュ
↓
ECRにプッシュされたのをAppRunnerが検知して自動デプロイ
```
といった流れで
最終的にはgithubのmasterブランチにプッシュしただけで自動でデプロイされ、本番環境にプログラムの変更等が反映されるのを目標としていきます。

## ソースコード

検証を行ったソースコードは下記となります。
https://github.com/mitsumitsu3/go-action-test

言語は、今回とりあえず手元に最低限Dcokerで動作させられる環境があったgoソースがあったためそちらを利用しています。

main.goの中身は下記となっており、8080番ポートでサーバーを起動し、アクセスすると'hello'を返すだけのものです。

```main.go
package main

import (
	"net/http"
	"github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "hello")
	})

	e.Logger.Fatal(e.Start(":8080"))
}
```

GithubActionsのワークフローは下記ディレクトリに定義しており、
`.github/workflows/deploy.yml`
中身は下記となっています。

```deploy.yml
name: Build and Push

on:
  push:
    branches:
      - master
jobs:
  build-and-push:

    runs-on: ubuntu-18.04
    timeout-minutes: 300

    steps:
    - uses: actions/checkout@v1

    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-1

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1

    - name: Build, tag, and push image to Amazon ECR
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPO_NAME }}
      run: |
        docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:latest .
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
```

こちらのワークフローの作成の他、
- Amazon ECRのリポジトリの作成
- AWS IAM ユーザーの作成
- GitHubリポジトリにSecretsを設定

を行う必要があります。
この辺は下記の記事等を参考にさせていただきました。

https://dev.classmethod.jp/articles/github-action-ecr-push/
ymlファイルの中身も参考にさせていただいたため大体同じです。
masterプッシュ時に動作する点と、dockerビルド&プッシュ時のタグ付け部分(本記事ではlatestタグ付与)部分だけ違います。

## リポジトリにプッシュ

ここまでできたら、masterブランチにプッシュします
プッシュ後、githubのリポジトリのActionsタブからワークフローの進捗が確認できます。
対象のコミットを開いて、最終的にこんな感じになれば成功です。
![スクリーンショット 2022-04-06 15.29.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/224adbb9-6cea-d385-0ca1-6852a5114fad.png)
失敗した場合は、エラーのログも出力されるためそちらを確認します。
(画像は、GitHubリポジトリにSecrets設定を忘れてプッシュした際に出力されたエラーです…)
![スクリーンショット 2022-04-06 17.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/c643f5f2-9b9e-3b18-7588-3854d6e92596.png)


エラーが出ずに成功した場合は、Amazon ECRにイメージが登録されているかと思います。
![スクリーンショット 2022-04-06 15.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/fe158b2b-42c1-19ec-b707-e62352b3dc54.png)

## AWS App Runnerでサービス作成

続いてApp Runnerの設定をしていきます。

まずApp Runnerコンソールに移動し、「App Runnerサービスを作成」を押下してサービス作成していきます。
![スクリーンショット 2022-04-06 15.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/52957c84-9e8e-74ab-1c17-7597d3d1b596.png)


![スクリーンショット 2022-04-06 15.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/0cb2d705-6dd1-1547-9fae-5b7609ad34b9.png)
リポジトリタイプは「コンテナレジストリ」、プロバイダーは「Amazon ECR」を選択します。
コンテナイメージのURLは、参照ボタンを押下することで作成済のイメージリポジトリ、イメージタグを選択できます。
デプロイ設定のデプロイトリガーは、「自動」を選択することで、GitHubActionsでイメージがプッシュされたのを検知して自動でデプロイをしてくれます。
今回は自動を選択します。
ロールは新しいサービスロールの作成を行いました。
「次へ」を押下します。

![スクリーンショット 2022-04-06 15.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/5479e76e-9418-1d20-420d-d916e8ef4576.png)
サービス名は適当につけます。
ポートは、`main.go`にて8080ポートでサーバー起動しているため、同じ8080ポートを設定します。

そのほかは全てデフォルト設定で進め、「作成とデプロイ」を行います。
その後しばらく待ち、数分後にこんな感じの画面になれば成功です。
![スクリーンショット 2022-04-06 16.42.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/32383382-9f95-56d4-effe-da306ad94dd5.png)
httpsのデフォルトドメインが表示されているため、そちらにアクセスし、「hello(`main.go`にて指定されている文言)」が表示されていればOKです。
![スクリーンショット 2022-04-06 17.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/f23a9ea0-12ea-d526-44c2-d64b72d5f57c.png)

ここまで確認できたら、試しにmasterブランチにプッシュした際、自動デプロイまで行われるかを試してみます。

現在「hello」を表示させていますが、そちらを別の文言（hello test）に変更してmasterブランチにプッシュ。
するとGitHubActionsが動きECRにイメージがプッシュ、その後App Runnerの画面が、「Start deploymentが進行中です」となりました。
![スクリーンショット 2022-04-06 16.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/2a6772c4-a040-1345-122c-9650c74f8a26.png)

完了後、デフォルトドメインにアクセスしたところ、文言の変更が確認できました。プッシュしただけで反映され、非常に簡単です。
![スクリーンショット 2022-04-06 17.38.34のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152886/45ab136d-34c6-6f6a-9d67-00b05655101a.png)

## 感想
AppRunnerを触ってみようと思ったのがきっかけでしたが、ついでに触ったGitHubActionの方がハマりつつも魅力を感じました。
AppRunnerは、実際に触ってみると便利で簡単だと思う反面、ECS、Fargate等の知識が無い状態でやるのは、なんというか「プログラム言語をフレームワークから入る」「SQLろくに勉強しないままORMオンリーでデータ触る」みたいなモヤモヤを感じました。
というか、その辺があまり分かっていない状態で触ったため正直ありがたみを100%感じられず、またチュートリアル通りのことしかできない気がしています。
というわけでまずはコンテナの基礎から勉強していきたいと思います。


今回のリポジトリ（ https://github.com/mitsumitsu3/go-action-test ）をフォークするなりして、
・Amazon ECRのリポジトリの作成
・AWS IAM ユーザーの作成
・GitHubリポジトリにSecretsを設定
・AppRunnerのサービス作成
を行うことで今回の流れは簡単に試すことができると思うので興味ある方はお試しください。