aws-sdk-rails というgemを使うと、SQSをキューにしてActiveJobsを動かすことができます。
今回はsidekiqユーザーに向けてその使い方を紹介したいと思います。
とはいえsidekiqを使わないというわけではないです。
受信設定
AWSの認証設定をしているとして、受信の設定をします。
config/aws_sqs_active_job.yml
queues:
my_queue: 'https://sqs.ap-northeast-1.amazonaws.com/1234567890/sqs_queue'
みたいな感じでQueueを設定します。このURLはAWS上で作成したSQSのエンドポイントを指定します。
でもって、Jobは普段通り、
app/jobs/my_job.rb
class MyJob < ApplicationJob
queue_as :sqs_queue
def perform(x, y)
...
end
end
という感じで作ります。
SQSでポストするデータは、こんな感じで作ればよいです。
{"queue_name":"sqs_queue",
"job_class":"MyJob",
"job_id":"<id>",
"arguments":["<custom_id>", ...]}
あとは、Rails.root で以下を実行すれば処理できます。
bundle exec aws_sqs_active_job --queue sqs_queue
ここでのミソは、ActiveJobの設定はしていないってところです。
なので、これまで通りsidekiqを使い続けられます。
応用 SES受信
やっぱり一番の応用は、メール受信ですね。
- SESでメール受信
- S3にメールを保存
- EventBridgeに保存イベントを通知
- EventBridgeで通知されたイベントを上記のメッセージフォーマットに書き換えてSQSへポスト
- SQSをリスンしてS3に保存されたメールを解析し、処理を行う。
こんな感じでメール受信が実装できます。
個人的には Action Mailboxよりコントロールしやすい感じがします。
そのほかにも、動画のエンコードなどlambdaの処理の完了通知とか、そういった応用が考えられます。
AWSでできることはやってもらって終わったら通知してもらうっていうのが楽に安定するシステムを作るコツかなぁなんて思います。