PhoenixをAWS App Runnerで動かしてみる

Elixir Phoenix Web AWS
更新2021/06/27
PhoenixをAWS App Runneでとりあえずですが動かしてみた記録です。とりあずDB接続とかは用意しない状態で試しています。

AWS App Runner

2021/5/21に始まったAWSのサービスAWS App Runner
詳しい説明は公式にお任せするのですが、LambdaとFargateの中間みたいな感じで、簡単にコンテナを走らせることができる感じでした。

課金体系はこちらが詳しいですが、2つの課金要素があって、メモリの使用時間とvCPUの使用時間で課金されるようです。

アプリケーションがリクエストを処理するときにコンテナインスタンスはアクティブ状態になり、この状態ではメモリとvCPUの両方が課金され、逆にアイドル状態のときはメモリの使用時間のみが課金される模様。あとアプリケーションを構築にかかる時間も課金されるようです。もちろんその他データ転送量も。

東京リージョンの場合は
アジアパシフィック (東京) リージョンの場合、料金は 0.009 USD/GB および 0.081 USD/vCPU 時となります。
みたいな金額感のようでしたが、詳しくは公式をご確認ください。

Phoenixで試してみる

コンテナサイズが小さくなるGolangなどが有利なのかもしれませんが、そういうのはおいておいて、モチベのあるPhoenixを走らせてみることにしました。


やるべきことは、下記の通り。

  1. コンテナを作ってECRにPush
  2. PushしたコンテナからApp Runnerのサービスを起動する
これだけでした。


ECRにコンテナをPush

Dockerfile
FROM elixir:1.8.1

WORKDIR /app

RUN mix local.hex --force && \
  mix archive.install hex phx_new 1.4.3 --force && \
  mix local.rebar --force

RUN apt-get update \
     && apt-get install -y --no-install-recommends inotify-tools

COPY . .

CMD mix phx.server
docker-compose.yml
version: '3.2'
services:
  app:
    build: .
    ports:
      - '4000:4000'
    environment:
      - MIX_ENV=dev
    volumes:
      - .:/app
この状態でphoenixアプリケーションを作成します。
※これらの設定は Docker ComposeでElixir/Phoenixの開発環境を構築する を参考にさせていただきました。
 
# webpackもectoも無効にしてphoenixアプリケーションを作成
docker-compose run web mix phx.new . --app test-runner --no-ecto --no-webpack
これでPhoenixの必要なファイル群がローカルのディレクトリに展開されます。
この時点ではまだコンテナの中にPhoenixで使うファイル群は入っていません。このあとにdocker buildをするタイミングでコンテナイメージの中に入ります。

次にAWSコンソールのECRの画面「リポジトリの作成」から適当な名前でリポジトリを作ります。
ここにpushをするためのコマンドは「プッシュコマンドの表示」からコピペして実行すればいいので楽です。というか、AWSさんこの瞬間だけめっちゃ親切....!
1.認証トークンを取得し、レジストリに対して Docker クライアントを認証します。
2.以下のコマンドを使用して、Docker イメージを構築します。
3.構築が完了したら、このリポジトリにイメージをプッシュできるように、イメージにタグを付けます。
4. 以下のコマンドを実行して、新しく作成した AWS リポジトリにこのイメージをプッシュします。
2のコマンドのdocker buildでphoenix関係のファイルもコンテナイメージの中に入るので、これで動くはずです。
App Runnnerで動かす前に、以下のコマンドで起動するか確認するといいかもしれません。

$ docker-compose build # 再ビルド
$ docker-compose up 
docker-compose.ymlでは起動コマンドを渡していないので、dockerfile側の最後にあるCMD mix phx.serverの部分が走って Pheonixが実行されるはずです。
上記を実行してlocalhost:4000にアクセスできれば、このコンテナは意図する挙動をしています。

PushしたコンテナからApp Runnerのサービスを起動する

App Runnerから「サービスの作成」を選択して必要事項を入力します。
といっても入力するのはコンテナイメージURLくらいなんですが、「参照」のボタンをクリックするとさきほどpushしたECRのリポジトリが出てくるのでそれを選択すると自動的に補完されます。

サービスロール名は「新しいサービスロールの作成」をクリックすると自動的に名前が入ってそれで終わりでした。

次にいい感じのサービス名を入力したらポート4000に変更します。
基本これでいいと思うのですが、初期状態でAutoScalingが有効になっています。意図しないうちに大量アクセスが発生して料金が跳ね上がるのが怖いので、カスタム設定から最大サイズを1に変更しておきました。気休めですが、これですこしだけ安心。

その後確認画面を通過すると、プロビジョニングが始まります。
私の場合はすべて終わるまで5分かかりました。
稼働開始までのログはこんな感じです。

ステータスがRunningになったらデフォルトドメインからアクセスしてみます。
正常なら、Phoenixの初期画面が出てくるはずです。
なお、途中でデプロイを止めることはできないようで、成功か失敗のあとにサービスの削除などをする必要がありそうです。


きになったこと

お値段
メモリ選択が最低2GBからでした。
t2.smallがvCPU1 メモリ 2GiB で0.0304 USDであることを考えると、アイドル時間が長いアプリケーションであればそれなりに安くなるかも?
インスタンスを停止させることもできるみたいなので、使わないときは一時停止しておくとよさそうです。

デプロイ
途中で止められません。ちなみにアプリケーションを構築している間も0.005 USDの課金があるみたいです。

オーケストレーションはどうやる?
App Runnerの画面はシンプルで、ドメインをカスタムする以上のものは見つけられませんでした。きっと複数コンテナでいい感じになにかをする方法なくはないのでしょうが、現段階ではないのか、あるいはそういうのはECSやEKSでやってねということなのかもしれません。

おわり

コンテナまでpushしたらあとは本当に一瞬で驚きました。
VPCもサブネットも、セキュリティグループも作る必要がなく、ほんとに数クリックだけです。

一方まだDBも繋げてないので本番環境で使うのは程遠いですが、とりあえずサービスの雰囲気と差し当たっての使い方が分かったので、これからも調べていきます。
書いた人/このブログについて

サーバーサイドエンジニア。お仕事ではRubyとPerl。趣味ではC#やHLSLなどを少しと、3DCGでPythonをごまかしながら使う感じ。Unityとインフラ周りも好き。

自分の備忘録もGoogle検索に任せたくてこのブログ書いてる。Phoenix製でEC2上で稼働中。