☘️

AWS App Runner × Railsでアプリ作ってみた

2021/06/04に公開

今回は最近リリースされたAWS App Runnerを使って、ミニマルなRailsアプリケーションをデプロイしてみました!

App Runnerとは

https://aws.amazon.com/jp/apprunner/

コンテナ化されたウェブアプリケーションやAPIを開発者が簡単かつ迅速にデプロイできるフルマネージド型サービスです

事前のインフラ経験を必要とせずにデプロイすることができます

ソースコードからでも、コンテナイメージからでも始められます

2021/5現在ソースコードからのデプロイはNode.jsとPythonのみ対応しているので、今回はRailsのイメージから作成します

自動化してくれるもの
ロードバランサ・ホスティング・ビルド・オートスケール・CI/CD・メトリクス(ログ) etc…

事前準備

  • AWSアカウントの作成
  • Dockerのインストール
  • AWS CLIのインストール

DockerとAWS CLIに関しては、ECRのパブリックレポジトリにビルド済みのRailsイメージを配置しているので、なくても大丈夫です

流れ

  1. Railsのイメージを作成
  2. ECRのレポジトリを作成し、ビルドしたイメージをpushする
  3. App Runnerにデプロイ

2021/05現在、RubyはApp Runnerのコードレポジトリからのデプロイに対応していないので、ECRにコンテナイメージを置いておく必要がある(他のコンテナプロバイダは利用不可)

手順

Railsのサンプルプロジェクトをcloneする or 新しくレポジトリを作る

git clone git@github.com:mzmt/rails6_docker_template.git

https://github.com/mzmt/rails6_docker_template

テンプレートとして使うことができます

docker-compose upして動くことを確認する

動くことが確認できたらctrl + Cで終了

AWS consoleを開く

https://console.aws.amazon.com/console/home

ECRレポジトリを作成する

Screen Shot 2021-05-28 at 11 12 05

可視性設定をプライベートにして、リポジトリ名に適当な名前を入力し、「レポジトリを作成」ボタンを押す

Screen Shot 2021-05-28 at 11 13 58

ECRにpushする

レポジトリを開き、「プッシュコマンドを表示」ボタンを押すと、画面上にコマンドが表示されるのでコピーして実行する
Screen Shot 2021-05-28 at 11 18 48

これでECRのレポジトリにビルド済みのRailsイメージが配置されたので、そのイメージを使ってApp Runnerにデプロイしていきます

App Runnerでデプロイ

App Runnerを開き、「サービスの作成」をクリック
Screen Shot 2021-05-28 at 11 25 25

レポジトリタイプはコンテナレジストリ、プロバイダはAmazon ECRを選択します。
コンテナイメージのURLの参照ボタンを押して、先ほどプッシュしたimageを選択します。

デプロイトリガーは手動・自動お好みの方を選んでください。自動にすると、ECRにイメージをプッシュするたびに自動でデプロイされます。

App RunnerからECRにアクセスするためのロールが必要なので作成します。既に作成済みの場合は、既存のロールを使用してください

サービス名を入力して、環境変数、ポート、開始コマンドを設定します。画像では2vCPU、メモリ4GBですが、最低限のスペックでも大丈夫です。


その他はデフォルトの設定でokです

作成ボタンを押すと、AWSがリソースを作成します。完了するまで10分ほど待ちます

完了したらデフォルトドメインが設定されているので、クリックしてトップページを開いてみましょう! Hello, World!が表示されたら成功です

AWS CLIやDockerをインストールしていない場合

ECRのパブリックレポジトリの検索で、「mzmt/rails6_docker_template」と入力するとビルド済みのイメージを使用して、App Runnerへお試しデプロイできます
App Runnerのプロバイダーに「Amazon ECR パブリック」を選択し、以下のURIを入力すると利用可能です
public.ecr.aws/d5c5w7d9/mzmt/rails6_docker_template:latest

Screen Shot 2021-05-28 at 11 22 57

もしデプロイが失敗した場合

App Runnerの「ログ」タブ内の、デプロイログとアプリケーションログをチェックすると原因が分かると思います。

その他

  • apprunner.yamlをレポジトリのルートに配置すると、ビルド時の処理をいろいろ指定できる。コンテナベースのデプロイの際には利用できない
    https://docs.aws.amazon.com/apprunner/latest/dg/config-file-examples.html

  • Cloud Runとの違い、Fargate/App Runnerに似ているが、常時起動ではなくてサーバーレス的なイベントドリブン型で、コスト体系に違いがある。App Runnerはコールドスタートを減らすために常時稼働し、トラフィックが少ない時は自動でスケールインする

コスト

Twitterで分かりやすい図を作ってくださった方がいたので共有します。
https://twitter.com/r_karotou/status/1491287747432448003

App Runnerが倍近く高いからバッチ処理向きでもありますす、

  • 2v4GBを年額運用してもECS Fargateとの差額が76,000円ほど
  • 対して抑えられるエンジニアの人件費は20万以上は減る(と思う)
  • App Runnerは構築のハードルが低くジュニア層のエンジニアでも構築可能なので、採用コストも下がる

のでMVP向きなのではと感じました。
App RunnerはHerokuと違って、

  • コンテナベースのサービス
  • ECSと同じでECRにpushして利用する
  • AWSのサービス

なので、サービス成長後に移行を検討されることの多いECS Fargateへのスライドは非常に簡単になる。

まとめ

今回はAWS App RunnerにRailsで作ったアプリをデプロイしてみました。
使ってみた感想としては、Elastic Beanstalkよりはハマりどころが少なく楽で、Herokuに比べるとソースコードからのデプロイに対応していなかったり、デプロイするだけでCloudWatchでログが見れるのはとてもありがたいです。今後のアップデートでより使いやすくなることが期待されます。

2022/2/9 追記
App Runnerから直接VPCのリソースにアクセスできるようになりました!
これでRDSなどの利用も可能に!

Discussion