DEV Community

jacksonPrimo
jacksonPrimo

Posted on

Configurando AWS SQS no Ruby On Rails

É importante ressaltar que dependendo da ação você quer executar haverá maneiras diferentes de configurar o SQS, por exemplo você pode querer usar ele apenas como producer, ou seja, apenas para enviar mensagens para uma fila que será processada por outra aplicação, usar como fila de processamento dos seus jobs ou configurar workers que irão escutar as mensagens da fila e processá-la por exemplo para disparar um e-mail ou processar arquivos.

Utilizando como producer

Essa é a configuração mais simples pois você só precisa configurar as envs e adicionar a gem do SDK.

Primeiro adicione a gem do SDK do aws para trabalhar com SQS:

# Gemfile
gem 'aws-sdk-sqs'
Enter fullscreen mode Exit fullscreen mode
$ bundler install
Enter fullscreen mode Exit fullscreen mode

Adicione as envs necessárias para o SDK, essas envs são esperadas pela gem para se comunicar com sua conta na aws:

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=4
AWS_REGION=us-east-1
AWS_SQS_QUEUE_NAME=
AWS_QUEUE_URL=
Enter fullscreen mode Exit fullscreen mode

Pode haver variações então sempre é bom dar uma conferida na documentação neste link

Agora basta instanciar o SDK e enviar a mensagem:

result = Aws::SQS::Client.new.send_message(
  queue_url: ENV['AWS_QUEUE_URL'],
  message_body: { order_id: "123" }.to_json
)
Enter fullscreen mode Exit fullscreen mode

Utilizando como worker

Para isso utilizaremos a gem shoryuken que seria o equivalente ao Sidekiq para o Redis.

# Gemfile
gem 'shoryuken'
Enter fullscreen mode Exit fullscreen mode
$ bundler install
Enter fullscreen mode Exit fullscreen mode

Adicionamos um arquivo de configuração:

# config/shoryuken.yml
concurrency: 5
require: ./app/workers
queues:
  - [ <%= ENV.fetch('AWS_SQS_QUEUE_NAME') %>, 1]
Enter fullscreen mode Exit fullscreen mode

O “require” força o Rails a carregar os workers dessa pasta em ambiente de development.

Caso o projeto não reconheça a pasta dos workers, basta adicionar essa configuração:

config.eager_load_paths.delete("#{Rails.root}/app/workers")
config.eager_load_paths.unshift("#{Rails.root}/app")
Enter fullscreen mode Exit fullscreen mode

Dependendo da versão do rails pode variar, mas seria uma configuração de autoload para arquivos de pastas que não são padrão em projetos Rails como por exemplo “jobs”, “controllers”, “services” etc.

Agora basta criar seus workers para escutar as filas

class ExampleWorker
  include Shoryuken::Worker

  shoryuken_options queue: ENV.fetch('AWS_SQS_QUEUE_NAME'), auto_delete: true

  def perform(sqs_msg, body)
    payload = JSON.parse(body)
    ::ExampleService.new(payload).call
  end
end
Enter fullscreen mode Exit fullscreen mode

Para ele ser reconhecido como worker, injetamos o módulo Shoryuken::Worker na classe.

Em shoryuken_options temos a opção queue que seria a fila que esse worker irá escutar e auto_delete que informa ao worker que deve apagar a mensagem do SQS após sua leitura ser feita com sucesso.

Para que os workers comecem a escutar as filas basta usar o comando:

$ bundle exec shoryuken -R -C config/shoryuken.yml
Enter fullscreen mode Exit fullscreen mode

Onde a flag -R serve para carregar o ambiente do rails, carregando assim suas envs e gems.

E a flag -C seria para carregar o arquivo de configuração, sem ela teria que passar cada configuração nesse comando, como por exemplo as filas que devem ser escutadas.

Utilizando como fila de processamento de jobs

Aqui será utilizado novamente o shoryuken mas com uma configuração adicional, temos que mudar o queue_adapter do rails para utilizar essa gem.

# config/application.rb
config.active_job.queue_adapter = :shoryuken
Enter fullscreen mode Exit fullscreen mode

Inicialmente o projeto gerencia o processamento do job tudo em memória, essa configuração serve para usar as configurações do shoryuken para gerenciar usando o SQS.

Agora basta criar um job

$ rails g job SayHello
Enter fullscreen mode Exit fullscreen mode
class SayHelloJob < ActiveJob::Base
  queue_as ENV.fetch('AWS_SQS_QUEUE_NAME', :default)

  def perform(name)
    sleep(2)

    puts "Hello #{name}"
  end
end

Enter fullscreen mode Exit fullscreen mode

Para testar o job utilize o console do rails e a função perform_later.

SayHelloJob.perform_later("jackson")
Enter fullscreen mode Exit fullscreen mode

Um ponto interessante aqui é que se utilizar o perform_now, o job será executado mas não será enviado para o SQS, pois tudo será executado de forma sincrona em memória.

Dentro do SQS, você verá uma mensagem com o seguinte body:

{
    "job_class": "SayHelloJob",
    "job_id": "883d23f0-1997-xxxxx-xxxxxxxx",
    "provider_job_id": null,
    "queue_name": "queue-name-example",
    "priority":null,
    "arguments":[ "jackson" ],
    "executions": 0,
    "exception_executions": {},
    "locale": "en",
    "timezone": "UTC",
    "enqueued_at": "2026-04-03T12:57:41.629214813Z",
    "scheduled_at":null
}
Enter fullscreen mode Exit fullscreen mode

Os argumentos passados no job ficarão dentro da chave “arguments” e os demais campos são configurações do próprio job.

Referências:
https://github.com/ruby-shoryuken/shoryuken/wiki/Getting-Started
https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/SQS/Client.html

Top comments (0)