blog.waterlow.work

Ruby, Rails, js, etc...

サーバーレス風味のRails

手抜きしつつそこそこいい感じにRailsアプリケーションを構築する方法を整理しています。

今回はAWSRails環境を作る場合の構成をまとめます。

要求としては以下のようなものを考えています。

  • APIサーバーとしてRailsプロセスを立ち上げる
  • スケジュールでjobを実行する
  • APIから非同期処理を積んでjobを実行する

一般的なwebアプリケーションの要求としてはよくあるものです。

AWSでこれを実現する場合に、雑になりすぎず、また頑張りすぎることもなく実現するにはどうしたらいいかを色々と模索していました。最終的には以下のような構成になりました。

リソース

  • App Runner(APIサーバー)
  • Event Bridge→Lambda(スケジュール処理)
  • App Runner→SQS→Lambda(非同期ジョブ)

Lambdaはコンテナイメージを使ってデプロイします。使うコンテナイメージはApp Runnerと同じものを使います。これによりイメージのビルドなどをシンプルに保つ事ができます。

push時にやっていること

  • mainブランチマージでリソースの更新
    • ECRにpush
      • ECR更新をフックにApp Runner更新
    • Lambdaの更新
    • Event Bridge Scheduleの更新

全てGithub Actionsで実施しています。

できないこと

  • 15分以上かかるスケジュール、非同期処理
  • Lambdaが高稼働する場合のRDBコネクションがかさむ問題への対応

一定このあたりを許容できるようなサービス限定となります。許容できない場合はなんらか対応する必要がありますが、一定この構成であれば部品を他のものに置き換えることができるかと思います。

まとめ

AWSRails環境を構築する場合に手をかけずそこそこいい感じに構築する方法をまとめました。いろいろ調べつつアップデートしていければいいなと思います。