このブログのAPI部分をherokuから AWS AppRunner に移行したかったけど、できなかった。なお以下の情報はすべて記事執筆時(2021/05/23)の私のAWSアカウントでの情報に基づいている。

背景

このブログのバックエンドAPIはheroku上のRuby on Railsで動いているんだけど、色々あってherokuから移行したいと思っていた。移行先の候補はサーバレスでコンテナアプリケーションを簡単に構築できる GCP CloudRun だったけど、Ruby on Railsを動かすにはバックエンドにRDBMSを構える必要があり、その辺GCPにあまり相性のいいサービスが無いのがネックだった。

そこについ先日、AWSにもAppRunnerという、GCP CloudRunによく似たような、コンテナを簡単に動かせるサービスが登場した。AWSにはAurora Serverlessがあるので、これらを使えばRuby on Railsをサーバレスで動かせるかなと思った。

なぜ移行できなかったか

まず以下の理由から、AppRunnerは作り直しを何回もやらされる仕様のようである事が分かった。

  • 構築したサービスはステータスがRunningかPaused(一時停止)でないと編集ができない。
    • HealthCheck失敗すると設定編集ができなくなり、作り直し
  • 環境変数は一度サービスを構築すると修正できず、作り直し(少なくともWebコンソール画面からは変更UIが見当たらない)

そのため操作の再現性が取りづらいWebコンソール画面からの手動構築はおすすめできない。特に私のブログのAPIは色々あって環境変数が20個ほど必要なので、試行錯誤する度これらをいちいち手で入力して作り直さなければいけないのは辛かった。(環境変数が多すぎるのはアプリケーションの負債だけど...)

CLIツールで構築しようとしたものの、そう簡単にはいかなかった。

  • AWS CLI v2はAppRunnerに対応しておらず、v1しか対応していない
    • v1 Changelog
    • AWS CloudShellやAWS CLI 公式Dockerイメージは、v2系しか提供されていない
  • AWS Copilotなら構築できるが、使うと不要なECS Cluster等が作成される

そして、サービスを作り直そうにも削除に30分以上かかってDelete Failedになる時がある。先述の通りRunningかPausedでないと編集もできないのでこのサービスはもう使う事はできないし、Copilotで同じ名前のサービスを構築しようにも失敗する。 この辺で面倒になって心が折れた。私のAWSアカウントには、不要なECS Clusterと削除できないAppRunnerサービスだけが残った。

もし現状AWS AppRunnerを使うなら、AWS CDKやPulumiなどのInfrastructure as a Codeツールを使うのが良いと思う。

画像の出典