1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RenderでRails×Sidekiqをデプロイする

Posted at

はじめに

こんにちは!オンラインスクールに通うプログラミング初学者のくりと申します🐣

個人開発で指定した時刻にLINEプッシュ通知を送る機能を実装しました。
このLINEプッシュ通知をバックグラウンド処理を行うために**ActiveJob+ Sidekiq(Redis)**を使用しましたが、その後のRenderへのデプロイでつまずいてしまいました。

そこで、本記事ではRenderへのデプロイの手順と解決策を備忘録としてまとめます。

間違いやより良い方法がありましたら、コメント等で教えていただけますと幸いです🙇‍♀️

概要

指定した時間にLINEプッシュ通知を送信する機能をバックグラウンド処理させるためにSidekiqを導入しました。
RenderでSidekiqを動かすための環境としてBackground WorkerとKey Value Instanceを作成する必要があったため、本記事ではその環境構築部分を紹介させていただきます。

本記事では、RenderのGUIを使って手動でデプロイする方法を紹介します
別の方法として、render.yml を作成してデプロイする方法もあります

参考:Use render.yaml to Deploy

前提

ローカルの開発環境でのActiveJob + Sidekiq(Redis)を使用したLINEプッシュ通知機能の実装は完了している状態で進めます。
LINEプッシュ通知機能の実装方法については、他の方のとてもわかりやすい記事がありますので紹介させていただきます。

環境

  • Docker
  • Ruby 3.2.3
  • Rails 7.2.1
  • PostgreSQL
  • Render

実装手順

  1. RenderでKey Value Instanceを作成
  2. RailsとWeb Serviceに環境変数を設定
  3. RenderでBackground Workerを作成

既にWeb ServiceとPostgreSQLのデプロイが完了している前提で進めます

1.RenderでKey Value Instanceを作成

DashboardからKey Valueを選択し、新しく作成します。
Image from Gyazo

ドキュメントに沿って以下を選択します。

Maxmemory Policy noeviction (recommended for queues/persistence)
Plan Starter($10)

公式によるとnoevictionは Key Value instanceのメモリがいっぱいになった際、タスクを削除しないようにする設定のようです。

Sidekiqで使用するKey Valueの作成に課金が必要です
Free Planで作成した場合は、バックアップされず再起動するたびにそのデータがすべて失われてしまいます

Free Planの制限についてはドキュメントの以下のページに記載がありました。

必須項目を入力し「Create Key Value Instance」を押下すると、KeyValueが作成されます。

その後、redis://red-xxxxxxxxxxxxxxxxxxxx:6379のような形で「Internal Key Value URL」が発行されます。
後ほどWeb Service,Background Workerとの接続で使用します。

2.RailsとWeb Serviceに環境変数を設定

Rails側の設定

Sidekiqの設定ファイルを編集

Sidekiqの公式ドキュメントにあるように、Sidekiqはデフォルトでローカル環境のRedisのredis://localhost:6379に接続しようとするため、本番環境ではRender上で設定する環境変数を参照するように設定します。

config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  config.redis = { url: Rails.env.production? ? ENV.fetch("REDIS_URL", nil) : ENV["REDIS_URL_DEVELOPMENT"] }
end

Sidekiq.configure_client do |config|
  config.redis = { url: Rails.env.production? ? ENV.fetch("REDIS_URL", nil) : ENV["REDIS_URL_DEVELOPMENT"] }
end

Render側の設定

Web Serviceに環境変数を設定

RenderのWeb Serviceの環境変数に、Internal Key Value URLを設定します。

Image from Gyazo

3.RenderでBackground Workerを作成

Background Workerの作成には課金が必要です

Background Workerの作成

DashboardでBackground Workerを選択し、新しく作成します。
Image from Gyazo

ドキュメントに沿って以下を選択・入力します。

Language Ruby
Build Command bundle install
Start Command bundle exec sidekiq

環境変数の設定

必要な環境変数を設定します。

  • DATABASE_URL:接続しているDB(PostgresSQL等)のInternal Database URL
  • RAILS_MASTER_KEY:config/master.keyの値
  • REDIS_URL:先ほど作成したInternal Key Value URL
  • その他必要な環境変数

Image from Gyazo

起動に必要な環境変数が不足している場合、正常に起動しません

私は最初Background Workerが起動しない事象が発生しました。
Background WorkerのLogsに以下のログが出力されており、必要な環境変数が不足していることが原因でした。

Missing required arguments: aws_access_key_id, aws_secret_access_key
なぜAWSのアクセスキーが必要だったのか? 前提として、私のアプリではcarrierwaveというライブラリで画像をアップロードし、外部ストレージにAWS S3を使用していました。

carrierwaveの設定ファイル(config/initializers/carrierwave.rb)にて
本番環境ではAWSの環境変数を参照するように設定しているため、Renderでのデプロイ時にAWSの環境変数が必要になります。

Background WorkerではWeb Serviceと同じリポジトリを別サーバーでデプロイするため、
Web Serviceと同様にAWSの環境変数が必要でした。

Background Workerをデプロイ

デプロイ後に正常に動作している場合、すでに設定したジョブがあればログ上で確認できます。

私の場合はリマインダー設定したタイミングでジョブを作成し、リマインダーで設定した時刻になったらジョブが実行するようにしているため、デプロイした時点では以下のようにSchedule empty!と表示されています。
Image from Gyazo

本番環境でリマインダー設定の操作を行うことで、
ジョブ作成時はWeb ServiceのLogsで、
ジョブ実行時はBackground WorkerのLogsでそれぞれ確認できました。

最後に

RailsでSidekiqを導入し、バックグラウンド処理を実装する際、本番環境ではBackground Workerの設定が必要になります。今回、初めてのデプロイに少し手間取りましたが、その分多くの学びがありました。
Renderについて、まだまだ理解が浅いので、引き続き学習を深めていきます!

最後までご覧いただきありがとうございました🌷

参考・引用資料

引用

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?