🤖

【Active Job】shoryuken + Amazon SQSを動かしてみた

2020/11/25に公開

Railsの非同期処理をActive Job + shoryuken + SQSで実装したのでメモを残します。

※RailsアプリケーションはDocker環境で構築済みの前提です。環境構築はこちら
※Active Jobとバックエンドの比較はこちら

環境

  • Ruby 2.7.2
  • Rails 6.0.3.4
  • MySQL 8.0.20
  • shoryuken 5.0.5
  • Docker version 19.03.13

1. SQSの設定

まずAWSコンソールにログインし、画面上でSQSの設定をしていきます。
Amazon Simple Queue Service (SQS) は、完全マネージド型のメッセージキューイングサービスです。
画面や設定等は2020/11時点のものです。

キューを作成します。

ここでSQSの詳細な設定は割愛しますが、要件に応じて様々な設定はできそうです。
キューの名前だけ指定し、その他はデフォルト値で設定します。

これでSQS側の設定は完了です。
あとはローカル環境からアクセスするためのアクセスキーをIAMで発行しました。

2. shoryukenの設定

まずGemを入れていきます。

Gemfile
gem 'aws-sdk-sqs'
gem 'shoryuken'

bundle installを実行し、shoryukenの設定ファイルも追加します。
AWSへの接続情報として、発行したアクセスキー等を環境変数に設定して利用します。
キーの管理はcredentialsでも良いかなと思いました。(プロダクトの方針次第)

config/shoryuken.yml
aws:
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
  region: <%= ENV["AWS_REGION"] %>
concurrency: 1
logfile: ./log/shoryuken.log
:queues:
  - development_default

3. Active Jobの設定

Active Jobで非同期処理を実装していきます。

config/application.rb
require "active_job/railtie"

module App
  class Application < Rails::Application
    ...
    config.active_job.queue_adapter = :shoryuken
    ...
  end
end

4. ジョブの作成と動作確認

ようやくジョブを作成します。

rails g job shoryuken_sample
app/jobs/shoryuken_sample_job.rb
class ShoryukenSampleJob < ApplicationJob
  queue_as :default

  def perform
    puts '--------------------------------'
    puts '-----------  昇龍拳  ------------'
    puts '--------------------------------'
  end
end

続いて動作確認を行います。

$ bundle exec shoryuken -C config/shoryuken.yml

(↑僕の環境では特にコマンド実行後、特に何も表示されませんでしたが、キューイングしたら動きました。)
別タブのターミナルでRailsコンソールからShoryukenSampleJobをキューイングしてみます。

$ rails c
Loading development environment (Rails 6.0.3.4)
> ShoryukenSampleJob.set(wait: 5.second).perform_later

Enqueued ShoryukenSampleJob (Job ID: ad754d56-8f50-4864-8b24-69479ef5c7f7) to Shoryuken(development_default) at 2020-11-25 11:32:39 UTC
=> #<ShoryukenSampleJob:0x000055821986c0b8
 @arguments=[],
 @exception_executions={},
 @executions=0,
 @job_id="ad754d56-8f50-4864-8b24-69479ef5c7f7",
 @priority=nil,
 @queue_name="development_default",
 @scheduled_at=1606303959.7208154>

キューイングすると先ほど起動したshoryuken側でジョブが実行されたことが確認できました。

--------------------------------
-----------  昇龍拳  ------------
--------------------------------

Discussion