🏃‍♀️

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

2021/07/07に公開

こんにちは、Masuyama です。

前回の記事 AWS App Runner Workshop をやってみよう (GitHub 編)では、比較的新しいサービスである App Runner と GitHub を連携し、サクッとアプリをデプロイしてみました。

App Runner はソースとして GitHub ではなく ECR を指定することもできるので、今回はその方法を紹介してみたいと思います。

AWS App Runner Workshop (ECR 編) を試す

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

前述の通り、App Runner におけるソースとしては GitHub か ECR を選択することができますが、今回は ECR を使う手順をやっています。

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

なお、ECR へコンテナイメージをプッシュするにあたり Workshop の手順では Cloud9 に Admin 権限を与えてデプロイをしていく手順となっていますが、今回はローカルで Admin 権限を持つ IAM ユーザのアクセスキーを利用しています。
お好きなやり方でお試しください。

コンテナを用意

ディレクトリ作成

apprunner-example という名前のディレクトリを用意します。

$ mkdir apprunner-example

アプリケーションのコードを用意

その中に index.jspackage.json というファイルを作成し、それぞれコードを次のように記述します。
内容は 前回 と同じです。

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}`);
});

package.json

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

Docker ファイルを用意

同じく apprunner-example 内に Dockerfile を作成し、中身は次のように記述します、

FROM node:14

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
COPY package*.json ./

RUN npm install

# Bundle app source
COPY . .

EXPOSE 3000
CMD [ "node", "index.js" ]

この時点でディレクトリ内は次のような構成になっているはずです。

├── Dockerfile
├── index.js
└── package.json

ECR のセットアップ

さて、Dockerfile に基づいてコンテナを App Runner にデプロイするにあたり、コンテナイメージを ECR にプッシュするための準備をしていきます。

AWS マネジメントコンソールにログインし、ECR のコンソールに移動して [リポジトリを作成] を選択します。

リポジトリ名は simple-express-repository と設定し、リポジトリを作成します。

コンテナイメージを ECR へプッシュ

リポジトリを作成したら、そのリポジトリ画面で [プッシュコマンドの表示] を選択します。

こちらの指示に従い、先ほどの Dockerfile とアプリケーションコードを用いてコンテナイメージを作成し、ECR にプッシュしていきます。

プッシュしている様子は省略しますが、全コマンドを入力すると無事にリポジトリにイメージがプッシュされました。
※失敗した場合は、ECR へのアクセス権限があることを確認してください。

App Runner でデプロイ

では ECR にイメージを用意できましたので、App Runner コンソールからサービスをデプロイしていきます。
リポジトリタイプをコンテナレジストリ、プロバイダーをAmazon ECR に設定します。
また、コンテナイメージの URI は [参照] ボタンから引っ張ってこれます。

今回もイメージを更新した時に自動で再デプロイされるかどうかを試したいので、デプロイ設定は自動を選択します。

ECR アクセスロールについては ECR アクセス権があるロールを特に作成していなければ [新しいサービスロールの作成] を選択します。

後は任意のサービス名を指定しつつ、Dockerfile 内で設定した通りポートは 3000 番を使うのでポート番号を設定します。

デプロイしたサービスを確認

しばらく待つとサービスの画面でステータスが Running となるので、またデフォルトドメインにアクセスしてみましょう。

index.js で書いた通り、Hello World と表示されていれば成功です。

変更イメージをプッシュして検証

先ほど App Runner サービス作成時にデプロイ設定を [自動] と設定しました。
変更したイメージを ECR にプッシュし直した時に、自動で再デプロイされるかどうかを検証します。

分かりやすいよう、index.js のうち文字列表示部分を少しだけ書き換えます。

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

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

書き換えたアプリケーションで再ビルド、タグ付け、ECR へのプッシュを行うと…
想定通り、サービスの再デプロイが始まりました。

ステータスが Running になったことを確認してからデフォルトドメインにアクセスすると、変更がバッチリ反映されていることが分かります。

おわりに

前回に続き、コンテナーイメージについても App Runner で簡単に自動デプロイまでのパイプラインを作成することができました。
詳細まで管理したい時には ECS や k8s もまだまだ選択肢には残るとは思いますが、シンプルなアプリケーションであれば App Runner は非常に有用だと思います。

Discussion