🏃

AWS App Runner Workshop をやってみよう (GitHub 編)

2021/07/04に公開

こんにちは、Masuyama です。

今年 5 月にリリースされた AWS App Runner というサービスを使うと、かなり楽にアプリケーションをデプロイ、かつ需要に応じた調整などを良い感じに行ってくれると聞いたので試してみました。

AWS App Runner とは?

公式:AWS App Runner とは?を参考にしながら説明させてもらいます。


(公式:AWS App Runner とは?より)

AWS App Runnerは、インフラを管理することなく、アプリケーションを AWS 上にデプロイするためのサービスです。
ソースコードまたはコンテナイメージを用意するだけで自動的にアプリケーションを構築してくれるのはもちろん、需要に応じて自動的にスケールアップまたはスケールダウンしたり、アプリケーションの健全性を監視したり、暗号化まで面倒をみてくれます。

上記イメージ図の右上が示す通り、GitHub リポジトリまたは ECR にソースを置くだけでデプロイ出来ちゃいます。
コンテナでアプリケーションを作ることはできるけどインフラ周りはよく分からない〜というデベロッパーにピッタリなサービスですな。

AWS App Runner Workshop (GitHub 編) を試す

App Runner の Workshop が公開されていたので、こちらを試してみることにします。

前述の通り、App Runner におけるソースとしては GitHub か ECR を選択することができます。
Workshop ではどちらの手順も紹介されていますが、まずは GitHub を使用する手順を試してみます。

全体の流れとしてはこのようになっています。

  1. GitHub リポジトリとコードを用意
  2. App Runner でデプロイ

GitHub でデプロイする場合はこの 2 工程だけです。
どれだけ簡単かというのがこれだけでも想像できるかと思います。

1. GitHub リポジトリとコードを用意

1-1. GitHub リポジトリを作成

最初の例では、シンプルなWebページを提供するシンプルなNode.jsのWebサーバーを作成します。Webサーバーを実行するランタイムとして、Node.js 12を選択します。Webサーバーには、以下のコンポーネントが含まれます。

  • index.js
    • a Node.js web server
  • package.json
    • describes the library dependencies, will be used in the build step

ここでは、Webサーバが必要とするライブラリの依存関係(ここではExpressライブラリ)をインストールするために、アプリケーションをビルドします。
後ほど、アプリケーションをビルドするため、AWS App Runner に「npm build」を実行するように指示することになります。
これにより、package.json ファイルで指定された express ライブラリがインストールされるようになります (設定方法は後述)。

1-2. GitHub リポジトリ作成

自分の GitHub アカウントでプライベートリポジトリを作成します。
リポジトリ名は Workshop の指示に従って simple-express-app としています。

1-3. リポジトリにファイルを用意

リモートリポジトリを作成しても OK なんですが、サクッと試すだけなので GitHub に直接ファイルを用意しちゃいます。

リポジトリ作成後に creating a new file を選択します。

ここから、まずは index.js というファイルを作成し、コードを次のように記述します。

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

コードを記述したら画面下部の Commit new file というボタンをクリックして commit します。

もう一つ、ライブラリの依存関係を指定する package.json ファイルもリポジトリ上に同様に用意します。
コードは以下の通りです。

{
  "name": "apprunner_example",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {},
  "author": "",
  "license": "ISC"
}

2. App Runner でデプロイ

アプリケーション (コード) の準備が済んだので、App Runner を用いて実際にデプロイしていきます。

2-1. サービス作成

[App Runner サービスを作成] を選択し、指示に従って設定していきます。

2-2. ソースおよびデプロイ

[ソースコードリポジトリ] を選択します。

次に、AWS App Runnerが新しいサービスをデプロイするために、GitHub との接続を追加する必要があります。

[GitHub に接続] の [新規追加] を選択し、App Runner と GitHub を接続するにあたり [別のアプリケーションをインストール] を選択し、作成したリポジトリにアクセスできる GitHub アプリをインストールしていきます。
(接続名は任意)

画面の指示に従い、先ほど作成したリポジトリを選択します。

これで GitHub リポジトリ上のアプリケーションが App Runner にインストールされたことになります。

次に App Runner の画面に戻り、リポジトリやブランチ等を指定していきます。
develop ブランチ等を切っておけば、検証用のアプリも気軽にデプロイして実験することができそうですね。

[デプロイ設定] ですが、後で変更をプッシュしてみたいので [自動] を選択しておきます。
こちらを選んでおくと、Github リポジトリのメインブランチにコードの変更がプッシュされたときに、アプリケーションが自動的に再デプロイされます。

2-3. 構築を設定

[ここですべての設定を構成する] を選択し、[ランタイム] はドロップダウンメニューから「Nodejs 12」を選択します。

各種パラメータは次のように設定します。

  • 構築コマンド
    • npm install
  • 開始コマンド
    • node index.js
  • ポート
    • 3000

2-4. サービスを設定

ここではサービス名を simple-express-app とだけ設定しておきます。

他にも Auto Scaling、ヘルスチェック等のオプションを設定できますが、今回はデフォルト値のまま進めます。

2-5. 確認及び作成

例のごとく確認画面が表示されますので、問題がなければ作成を進めます。

2-6. デプロイを確認

ステータスが Operation in progress となっているのでしばらく待機します。

5 分ほど待つとステータスが Running に変化したので、[デフォルトドメイン] にアクセスしてみると…

index.js で指定していたように Hello World! と表示されましたね!

2-7. コードを変更してみる

先ほどの工程「2-2」の中で、デプロイ設定を 自動 に設定していましたので、メインブランチに新しいコードがプッシュされた時には、App Runner のサービスも新しいバージョンがデプロイされるはずです。
ここでは、本当にリポジトリのコードが変更された時に再デプロイされるのかどうかを検証してみます。

試しに、表示される文言を "Hello World!" から "Good Bye World!" に変更してみます。

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.get('/', (req, res) => {
  res.send('Good Bye World!');
});

GitHub 上で直接この変更を Commit してみたところ、App Runner サービスは GitHub リポジトリの変更を自動で検知し、App Runner 上のステータスが Operation inprogress に自動で変わっていました。

ステータスが Running に変わったので再度デフォルトドメインへアクセスすると、変更がバッチリ反映されていました。

おわりに

AWS ではいくつかのサービスを組み合わせて自動で CI/CD を組めるような構成を作れますが、App Runner は単体で CI/CD を簡単に実現するという点においては群を抜いているように思います。

今回はソースとして GitHub を指定していましたが、次回は ECR (コンテナ) を用いた App Runner でのデプロイを試してみようと思います。

Discussion