PHPアプリをApp Runnerで動かした話

2023-04-11
PHP
AWS
App Runner

TL;DR

App Runner は良い。一言で表現すると「面倒くさくない ECS Fargate」です。

CD (Continueus Delivery) の構築に自信がない人は積極利用すべし。コンテナでサービス可能な状態まで作り上げれば、あとは ECR に push するだけ。

以下は、細かい記事

発端

PHPerKaigi 2023 で聴講した AWS App Runner の話が発端です。簡単に使えるマネージドなコンテナ実行環境なので、ぜひ試したくなったのです。

実際に試すことで確認したかったのは、以下の観点です。

  1. どれくらい手軽なのか?
  2. いくらくらいかかるのか?
  3. 実運用に耐えるのか?

試してみたアプリケーション

2年ほど前に作成して放置していた Cakephpizer を使うことにしました。このアプリケーションは、URL で指定した画像をいい感じに青くします。

cakephpizer の画面イメージ

こんなものを作った理由は、日本の PHP 界隈には、4/1 に Twitter のアイコンを青くする謎の風習があるためです。

あの日見たTLが青かったことを僕達はまだ知らない。 - Togetter

一言で表現すると、大人の悪ふざけ です。

App Runner で本番リリース

App Runner は、任意のコンテナイメージ or ソースコードリポジトリーを指定して利用します。今回は ECR に コンテナイメージを push して利用しました。

App Runner 設定画面1

Browse をクリックすると、ECR の push 済みイメージが表示されて、選択するだけ。イカス!

App Runner 設定画面2

設定項目は少ないです。サービス名と CPU、メモリーサイズを指定

App Runner 設定画面3

さらに、Auto Scaling の設定があります。なんと、これも設定しておけば自動でやってくれるんですねー。DoS攻撃とかくらって、大量にオートスケールされたらお金がかかるので、今回はカスタム設定を追加して、最大でも2インスタンスまでに設定しました。悪ふざけで、重課金されたらかなわん……

App Runner 設定画面4

他には、 HealthCheck とか 環境変数の設定がありますが、まあそのへんはよしなにやってください。そして作成すると……

もう、アプリが動く!HTTP で動作するアプリケーションコンテナイメージがあれば、実質3分くらいで本番環境ができます。これはイカス。

App Runner 設定画面5

この時点では、SSL 接続の割り当てられたエンドポイントが払い出されます。

URL例
https://xxxxxxxxxxxx.ap-northeast-1.awsapprunner.com

これだと、サービスをするにはちょっと情けないので、カスタムドメインの設定をします。設定内容は App Runner 側が画面で表示してくれるので、あとはDNS で CNAME レコードを3つ作るだけです。

設定後24時間くらいかかる説明書きがありましたが、実際は15分くらいで疎通されていました。ご自身のサービスで使う際は、少し余裕を見ておいたほうがよいかもしれません。

この SSL ですが、AWS なので、内部では ACM が使われています。App Runner のインスタンスを落としたあとに、ACM の設定が残る懸念あったのですが、App Runner 削除後に何も残って無かったので、安心です。

運用面

アクセスログ

標準出力の内容が Cloud Watch Logs に上がっているので、あとは Log Insights で適当なクエリを作れば出せます。

Cloud Watch Logs の画面

もうちょっとマシな見た目にしたいとか、インスタンスまたいだログを取りたい場合は、ログ出力周りの工夫が必要です。

金額

3/31 から 4/1 の利用で、環境構築テストなども含めて、最終的に 0.45 ドルでした。

Cost Explorer の画面1 Cost Explorer の画面1

一日のジョークアプリケーション利用としては、100円以内で使えるのは、魅力的ですね。実質24時間程度の稼働なので、同程度のアクセスとCPU使用であれば、月額でも 2000円程度に収まりそうです。本番環境のインフラとしてはリーズナブルな部類に入ると思います。

デプロイ自動化などのオプションも利用すれば、リリース周りの自動化も簡単にできるようです。これはアツいなぁ。

まとめ

App Runner は、ECS Fargate の面倒くさい部分をラッピングしてくれた実に簡単に使えるサービスで良いです。1日だけアプリを立ち上げたいみたいな要望にはもってこいです。

受託開発、自社サービスなどにおいても、固定のインフラ担当を置くほど利益が出せないサービスであれば、App Runner に全部おまかせするのはアリだなと思いました。ログの量とか調整しないと、思わぬ課金になるので気をつけてね!

Jobはどうするの?とか聞こえてきますが、そんなものはコンテナイメージに crond 同梱しちゃえばいいんですよ?(暴論)もしくは、HTTP のエンドポイント作って、叩けば良いのです!ここまでマネージドされてるんだから、それくらいは自分たちで解決しようぜ!

オートスケーリングに関して、使い物になるかどうかはアプリケーションの種類によるかと思います。スパイクアクセスに対して迅速に応答する必要がある場合は向いてないかもしれません。なにしろバックエンドは Fargate なので、コンテナの立ち上がりは少しもっさりするはずです。

謝辞

@n_1215 さん、@seike460 さん、素晴らしい情報をありがとうございました。

次は、Cloud Run で悪ふざけするぞ!