EY-Office ブログ

AWS App Runnerへの期待(と失望)

久しぶりにバックエンドの仕事がきました。デプロイ、運用が簡単にできるバックエンド環境をAWSで構築しようと調査・実験を始めました。

AWS App Runner

AWSでDockerを運用するには

AWSでDockerベースのアプリケーションを運用するためのサービスは複数あります。

  • Amazon Elastic Container Service(ECS) : AWS独自のインフラを生かしスケーラブルで効率的ななクラウド・アプリケーションの運用ができるサービス
  • Amazon Elastic Kubernetes Service(EKS) : 業界標準のKubernetesを使い、クラウド・アプリケーションの運用ができるサービス
  • Red Hat OpenShift Service on AWS : エンタープライズ向けのOpenShiftを使い、クラウド・アプリケーションの運用ができるサービス

さらにクラウドの構築、デプロイ、運用を楽にしてくれる、

  • AWS Fargate : EC2などのインフラを意識せずスケーラブルなアプリケーションの構築・運用ができるサービス
  • AWS Elastic Beanstalk : 特定の言語向けのWebアプリケーション用のクラウドを簡単に構築・運用ができるサービス

などがあります。

小規模でも使えますが、どちらかと言うと大規模なアプリケーション向けのサービスだと思います。

AWS App Runnerとは

2021年5月に発表されたAWS App Runnerは1つのDockerを簡単にAWS上にデプロイし、しかもスケーラブルな運用ができる新しいサービスです。 詳細は AWS App Runner のご紹介 を参考にしてください。AWS Lambdaのように手軽なDocker環境です。

AWS App Runnerを使ってみた

今回の仕事で使えそうだったので、早速ためしてみました!

以下のようなNode.js + Express + PostgreSQL用にTypeScriptで書かれた簡単なバックエンドアプリをAWS App Runnerで実行してみる事にしまし。

サンプルコード

import express, {Request, Response} from 'express'
import cors from 'cors'
import pg from 'pg'

const app = express()
app.use(cors())
app.use(express.json())

const pool = new pg.Pool({
  host: process.env.DB_HOST,
  database: process.env.DB_DATABASE,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD
})

app.get('/', (req: Request, res: Response) => {
  res.send("OK")
})

app.get('/hello',  async (req: Request, res: Response) => {
  const client =  await pool.connect()
  const results = await client.query("SELECT * FROM objects WHERE id= 1")
  console.log(results.rows)
  res.send("Hello\n" + JSON.stringify(results.rows[0]))
})

app.listen(3000, () => { console.log('Started.') })

コードを簡単に説明すると、

  • Expressを使った簡単なWebアプリです
  • PostgreSQLへの接続はnode-postgresを使っています
  • 接続用の情報は環境変数DB_〜から取得します
  • /へGETリクエストがあると文字列OKを戻します
  • /helloへGETリクエストがあると、PostgreSQLのobjectsテーブルからデータを取得し、Hello文字列と連結して戻します

簡単にデプロイ

App Runner作成時にアプリのデプロイ方法を指定しますが、Dockerイメージ(Amazon Elastic Container Registryから)または、GitHubから選べます。

GitHubを選択した場合は構築方法が設定でき、

  • Runtimeは、Node.js 12を選択(他にPython3が選択できます)
  • Build commandは、npm installを指定
  • Start commandは、npm run build && npm startを指定
  • Portは3000を指定

GitHiubとの連携も簡単にできますしたが、Safariでは認証画面が表示されずに詰まりました、Chromeを使いましょうね😅。

初期作成や再デプロイ、設定変更の実行時間は2〜4分くらいでした。早くはないですが遅くもないですね。

環境変数

サービス設定の画面でCPU/メモリーの設定以外に、環境変数も設定できるので、PostgreSQL(RDS)の接続情報も画面から設定できました。

カスタムドメイン

App Runnerで作ったアプリにはhttps://○○○○○○○○.ap-northeast-1.awsapprunner.comのようなURLがつきますが、自前のドメインを設定できます。DNSはAmazon Route 53でなくても使えます、というかRoute 53を使っていても手動で設定しないといけませんでした。

えぇ〜 RDSに接続出来ない !!

さてアプリを起動し、ブラウザーで/をアクセスするとOKが表示されましたが、/helloをアクセスすると反応がなく最終的にはupstream request timeoutエラーが発生していました。

しらべてみたら、なんとApp Runnerは現在VPCリソース(たとえばRDS)にはアクセスできないそうです😢
ただし、この問題は対応予定で、開発ロードマップに入ったそうです、Allow App Runner services to talk to AWS resources in a private Amazon VPC ・・・・待ちましょう。

まとめ

App Runnerの料金ですが、東京リージョンで24時間動かすと¥3千円くらいになりそうです、Lambdaとは違いアクセスが無くても、メモリーを占有するとの事でこれくらいの料金になります。

現在RDSは使えませんが、DynamoDBやAuroraは使えるそうです。RDSが使えるようになったら手軽なDocker実行環境として期待大ですね。

- about -

EY-Office代表取締役
・プログラマー
吉田裕美の
開発者向けブログ