🍿

AWSさん、apprunner.yamlが分かりません

2022/06/07に公開

AWS App Runnerというサービスが分からないのではなく、
その設定ファイルであるapprunner.yamlが分からないということです。
Dockerfileで良くない?と言いたい。

AWS App Runnerとは

要するに、コンテナで作ったウェブアプリを簡単にデプロイできるサービスです。
すごい!
https://aws.amazon.com/jp/apprunner/

AWS App Runner は、コンテナ化されたウェブアプリケーションや API を開発者が簡単かつ迅速にデプロイできるフルマネージド型サービスです。大規模に、しかも事前のインフラ経験を必要とせずにデプロイすることができます。

AWS App Runnerのデプロイ方法

App Runnerのデプロイ方法は大きく3つあります。

AWSコンソールで、ビルドコマンドと起動コマンドを設定

1つ目。これが一番簡単です。ブラウザでAWSのコンソールを開いて、いくつか設定を書くだけでデプロイできます。
複雑なことは出来ないので製品開発で使うことは難しいですが、とにかく簡単にwebアプリを公開できますので、とりあえずのお試しや勉強用、個人で簡単なアプリを公開するときはかなり使える方法です。
AppRunnerリリース直後にこの方法を試しているので、いちおう貼っておきます。
https://zenn.dev/ibaraki/articles/7b781553eb7a74

Amazon ECRからデプロイする

2つ目。ECR(Elastic Container Registry)上のDockerイメージからデプロイ出来ます。
イメージファイルを作ってECRに置く所までやっておけば、後は数クリックで自動Deployを構築できます。この方法ではDockerイメージを自由に作れるので、カスタマイズ性が高く製品利用にも使えると思います。ただし、Dockerイメージを作りRegistryにpushする必要がありますので、最低限のDockerやContainer知識が必要です。本格的に使うならこの方法がおすすめです。

apprunner.yamlにビルド&起動コマンドの設定を書く

3つ目。コレが本題。
活用方法が分かりません。
詳細は次章に書きます。

apprunner.yamlの何が使いにくいか

Dockerfileと書く内容が大差ない

AWSのドキュメントにあるapprunner.yamlのサンプルを見てみます。
https://docs.aws.amazon.com/ja_jp/apprunner/latest/dg/config-file-examples.html

apprunner.yaml
version: 1.0
runtime: python3 
build:
  commands:
    build:
      - pip install pipenv
      - pipenv install 
run: 
  command: python app.py

buildのところに、Dockerイメージを作る時に必要なビルドコマンドを書いて、
runのところに、Dockerイメージを起動した時の実行コマンドを書くようです。

フォーマット自体に問題はないのですが、「それって、Dockerfileでよくない。。。?」と思ってしまいます。
目新しい機能もないのに、新しい仕様をわざわざ覚えるのは、正直面倒くさいです。

使用できる環境が限られる

apprunner.yamlではDockerイメージのOSは指定できなくて、Amazon Linuxのみです。また、言語はPython(3.7,3.8)とNode.js(12)のみです。

利用できる範囲狭くない?

ブラウザのコンソールからポチポチする方式では、設定が簡略化されるので必ずしもマイナスではなかったのですが、設定ファイルにわざわざ書くと場合はそれなりにカスタマイズしたいときなので、この選択肢の少なさは嬉しくないです。

なお、ECRを使ってApp Runnerを構築した場合には、こういった制約はありません。

コンテナなのに汎用性がない

これが、もっとも使いにくい点です。

「コンテナ メリット」で検索してみてください。「環境に左右されず、ローカルの開発環境でもクラウド上の本番環境でも同じように動く」といった趣旨の項目が必ず出てきます。
コンテナは何処でも使えるものなのです。

しかし、apprunner.yamlを使ってコンテナを作った場合はAWS App Runner上でしか動きません。
移植性がなくなるとか開発環境が作りにくいという問題はもちろんありますし、それ以前にapprunner.yaml自体のテストの為に、毎回クラウドにデプロイして確認する必要があります。
しかも、App Runnerには初回のデプロイに失敗した時にやり直すことが出来ず2度とアプリが動かないという謎仕様があります。つまり正しく通るまで何度でもサービスを作り直す必要があります。

死ぬほど面倒くさいです。

他の方の記事も読んでみましたが、、、

自分の使い方がおかしいのでは?とAppRunnerを試した系の記事をいくつか見ました。

自分が見た範囲では、多い順に、

  • ECRを使っている
  • AWSコンソールのみでやっている
  • apprunner.yamlを使って、デバッグにめちゃくちゃ苦戦している

の3択に見えました。やっぱりそうですよね。
「いやいや、こうするとapprunner.yamlをイイ感じに使えるよ!」という方がいれば、コメントください。

ちなみに、別のAWSサービスでは、、、

AWSでWebアプリを簡単に公開できるサービスといえば、Amplifyがあります。
AmplifyはSPAやサーバレスがメインと思われがちですが、API機能はコンテナに対応しています。こちらは独自の設定ファイルではなくDockerfiledocker-compose.ymlを読んでECS上にデプロイしてくれます。
https://docs.amplify.aws/cli/usage/containers/#deploy-a-single-container

なぜ、App Runnerは独自に設定ファイルを作ったのでしょうか。。。

まとめ

現状ではapprunner.yamlを使うのはイマイチ

AWS App Runnerを活用する場合、apprunner.yamlは使わずに自力でビルドしたDockerイメージをECR経由で使うのが良さそうです。

AWSさんに言いたいこと

apprunner.yamlでなくDockerfile (またはdocker-compose.yamlcompose.yaml)を使うようにしたほうが良いのではないでしょうか?

最後に

githubのapprunner-roadmapを見たら、DockerfileやDocker Composeへの対応が要望として上がっていたので、👍 しておきました。
https://github.com/aws/apprunner-roadmap/issues/26
https://github.com/aws/apprunner-roadmap/issues/32

Discussion