AWS App Runner × Railsでアプリ作ってみた
今回は最近リリースされたAWS App Runnerを使って、ミニマルなRailsアプリケーションをデプロイしてみました!
App Runnerとは
コンテナ化されたウェブアプリケーションやAPIを開発者が簡単かつ迅速にデプロイできるフルマネージド型サービスです
事前のインフラ経験を必要とせずにデプロイすることができます
ソースコードからでも、コンテナイメージからでも始められます
2021/5現在ソースコードからのデプロイはNode.jsとPythonのみ対応しているので、今回はRailsのイメージから作成します
自動化してくれるもの
ロードバランサ・ホスティング・ビルド・オートスケール・CI/CD・メトリクス(ログ) etc…
事前準備
- AWSアカウントの作成
- Dockerのインストール
- AWS CLIのインストール
DockerとAWS CLIに関しては、ECRのパブリックレポジトリにビルド済みのRailsイメージを配置しているので、なくても大丈夫です
流れ
- Railsのイメージを作成
- ECRのレポジトリを作成し、ビルドしたイメージをpushする
- App Runnerにデプロイ
2021/05現在、RubyはApp Runnerのコードレポジトリからのデプロイに対応していないので、ECRにコンテナイメージを置いておく必要がある(他のコンテナプロバイダは利用不可)
手順
Railsのサンプルプロジェクトをcloneする or 新しくレポジトリを作る
git clone git@github.com:mzmt/rails6_docker_template.git
テンプレートとして使うことができます
docker-compose up
して動くことを確認する
動くことが確認できたらctrl + Cで終了
AWS consoleを開く
ECRレポジトリを作成する
可視性設定をプライベートにして、リポジトリ名に適当な名前を入力し、「レポジトリを作成」ボタンを押す
ECRにpushする
レポジトリを開き、「プッシュコマンドを表示」ボタンを押すと、画面上にコマンドが表示されるのでコピーして実行する
これでECRのレポジトリにビルド済みのRailsイメージが配置されたので、そのイメージを使ってApp Runnerにデプロイしていきます
App Runnerでデプロイ
App Runnerを開き、「サービスの作成」をクリック
レポジトリタイプはコンテナレジストリ、プロバイダは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
もしデプロイが失敗した場合
App Runnerの「ログ」タブ内の、デプロイログとアプリケーションログをチェックすると原因が分かると思います。
その他
-
apprunner.yamlをレポジトリのルートに配置すると、ビルド時の処理をいろいろ指定できる。コンテナベースのデプロイの際には利用できない
https://docs.aws.amazon.com/apprunner/latest/dg/config-file-examples.html -
Cloud Runとの違い、Fargate/App Runnerに似ているが、常時起動ではなくてサーバーレス的なイベントドリブン型で、コスト体系に違いがある。App Runnerはコールドスタートを減らすために常時稼働し、トラフィックが少ない時は自動でスケールインする
コスト
Twitterで分かりやすい図を作ってくださった方がいたので共有します。
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