🌟

GitHub Actions で ECR + AWS App Runner にデプロイする

2022/08/31に公開

はじめに

こんにちは。
これまで millvi開発部 では Vue.jsNuxt.js をフロントエンドの技術スタックとして採用してきましたが、2022年4月からは React.jsNext.js へとリプレイスを進めています。
移行理由については本記事では詳細に記載しませんが、エコシステムや機能等を比較し、メリットが大きいと判断しました。

Vue.jsNuxt.js の時は、S3 + CloudFront にホスティングしていたのですが、これについても見直し、リプレイスのタイミングで AWS App Runner に乗せ替えることといたしました。本記事では、GitHub Actions を用いた AWS App Runner へのデプロイ方法を手順としてまとめています。ご参考になれば幸いです。

AWS App Runner について

概要

App Runner は、AWS が提供するフルマネージドのサービスで、コンテナ化されたアプリケーションの実行環境を提供してくれます。またそれだけでなく、CI/CDの準備、ロードバランサーによるオートスケール、カスタムドメイン周りなども管理してくれています。GitHub または ECR と連携し、デプロイが出来るようになっており、基本的にGUI操作のみでアプリケーションを立ち上げることができます。

数年前までは自前で EC2ELB などの構成を、スケーラビリティや可用性を損なわないように組むやり方がよくある方法だったかと思いますが、そういう運用の負担を AWS 側が担ってくれるので遥かに簡易な運用ができるようになりました。

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

手順

今回は以下のような構成を目指してやっていきます。

スクリーンショット 2022-08-10 18 08 15

上述したように、App Runner は、GitHub or ECR という2種類のデプロイ方法があり、サービスによって使い分けることが可能です。GitHub の場合、リポジトリと紐づければ簡単に利用開始できるものの、App Runner が提供するランタイムから選択する必要があります。従って、使用しているライブラリによっては使えなかったり、ランタイムのサポートが期限切れしたりとさまざまな注意が必要です。その点、ECR 連携をすればローカルで検証できたコンテナイメージを使うことが出来るので、ハマりにくい選択かと思います。今回の手順も ECR を採用しています。

ECR

まずはじめに、新規リポジトリを作成します。リポジトリ名やタグのイミュータビリティ設定、イメージスキャン設定等をします。イミュータビリティ設定は無効化しないと新しいイメージをプッシュした際、上書きできないのでデフォルト設定(無効)にします。イメージスキャンはプッシュ時にセキュリティスキャンをしてくれる設定ですが、現状非推奨となっているようでした。

プッシュする

リポジトリの詳細ページを開くと、[プッシュコマンドの表示]というボタンがあり、そこでプッシュするコマンドを確認できます。それらのコマンドを実行し、イメージをプッシュしておきます。今回は仮なのでリポジトリ名を、test としています。

ライフサイクルルールの設定

何度もイメージをプッシュすると使われなくなったイメージが残り続けてしまうので、一定のルールを満たしたら削除するというライフサイクルルールを設定しておきます。

今回は以下の2つのルールを作成しました。

  • latest タグがついたイメージを1つ以上残す
  • プッシュしてから、1日以上経過したイメージは削除する

GitHub Actions

ECR のプライベートリポジトリに対して、GitHub Actions を用いて自動プッシュする手順です。
シークレット値に先ほど作成したリポジトリ名を設定します。

# ~前略~

- 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: ${{ secrets.AWS_ECR_REGISTRY_NAME }}
      ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPO_NAME }}
      IMAGE_TAG: latest
  run: |
      docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
      docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG

AWS App Runner

App Runner でサービスを作成し、ECR にプッシュされたのをきっかけに自動デプロイが走るようにしていきます。
[サービスの作成]から、ソースの選択とデプロイ設定をしていきます。

それが完了すると、サービスの設定に移ります。Auto Scalingやセキュリティ周りの設定なんかもここでします。
設定が完了すると初回デプロイが走り、無事デプロイに成功したらデフォルトドメインとして .awsapprunner.com が払い出されています。

Route 53

App Runner 側で払い出されたドメインに対し、独自ドメインを当てることも簡単に実行できます。以下の設定画面に従って、レコードと値を Route53 側で設定したら、あとは少し変更が反映されるのを待って完了となります。

終わりに

App Runner の機能に対する要望や対応状況は、GitHub 上でロードマップが公開されているのでそこで確認できます。
https://github.com/aws/apprunner-roadmap

個人的に気になっているのはこちらの issue です。
https://github.com/aws/apprunner-roadmap/issues/37
今後も引き続き、機能追加をウォッチしていきたいと思います。
この記事がご参考になれば幸いです。

Discussion