久しぶりにバックエンドの仕事がきました。デプロイ、運用が簡単にできるバックエンド環境をAWSで構築しようと調査・実験を始めました。
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実行環境として期待大ですね。