概要
RailsからSQSにメッセージを渡す処理を調べたので、設定や実装方法をメモとして記載する
前提
AWSへの接続は、アクセスキーとシークレットアクセスキーを使う
準備
SQSでキューを作成
AWSの管理コンソールにて、AWS SQS>キューに遷移し、キューを作成を選択
キューを作成画面で情報をセットして作成
※今回はメッセージを渡す確認をしたいだけなので、名前をセットして作成
作成後に設定されるURLをコピーしておく
(画像ではtest-queueという名前で作成)

環境設定
dockerでRailsを起動している環境にSQSを設定してメッセージを送信してみる
AWSキー情報設定
docker-compose.ymlに以下を指定
web:
:
environment:
AWS_ACCESS_KEY_ID: {アクセスキー}
AWS_SECRET_ACCESS_KEY: {シークレットアクセスキー}
AWS_REGION: {SQSを作成したリージョン / 東京の場合は、ap-northeast-1}
aws-sdk-rails追加
Gemfileにaws-sdk-railsを追加
:
gem 'aws-sdk-rails'
:
build
docker build実施
docker compose down
docker compose build
docker compose up -d
Rails consoleで確認
docker exec -it {コンテナID} /bin/bash
root@{コンテナID}:/app# rails c
queue_url = {AWS管理コンソールのSQSキュー作成で設定されたURL}
message_body = {
"title": 'タイトルメッセージ',
"comment": 'コメントメッセージ'
}.to_json
sqs = Aws::SQS::Client.new
sqs.send_message(
queue_url: queue_url,
message_body: message_body
)
実行結果例
irb(main):004:0> queue_url = "https://sqs.ap-northeast-1.amazonaws.com/xxxx/test-queue"
=> "https://sqs.ap-northeast-1.amazonaws.com/xxxx/test-queue"
irb(main):009:1* message_body = {
irb(main):010:1* "title": 'タイトルメッセージ',
irb(main):011:1* "comment": 'コメントメッセージ'
irb(main):012:0> }.to_json
=> "{\"title\":\"タイトルメッセージ\",\"comment\":\"コメントメッセージ\"}"
:
irb(main):017:0> sqs = Aws::SQS::Client.new
=> #<Aws::SQS::Client>
irb(main):018:1* sqs.send_message(
irb(main):019:1* queue_url: queue_url,
irb(main):020:1* message_body: message_body
irb(main):021:0> )
[Aws::SQS::Client 200 0.12119 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/xxxx/test-queue",message_body:"{\"title\":\"タイトルメッセージ\",\"comment\":\"コメントメッセージ\"}")
=>
#<struct Aws::SQS::Types::SendMessageResult
md5_of_message_body="xxxx",
md5_of_message_attributes=nil,
md5_of_message_system_attributes=nil,
message_id="aaa-bb-ccc",
sequence_number=nil>
実行後、AWS管理コンソールのSQSで利用可能なメッセージ列がカウントされるのを確認
アプリへの組み込み例
Railsの画面にセットした情報を送信するところまでを記載する
※動作確認目的なので細かいルーティングの制御やCSSの設定は行わない
Routes
Rails.application.routes.draw do
:
resources :sqs_messages
:
end
Model
DBの連携は行わないので、ActiveModelをIncludeさせておく
メッセージ内容はタイトルとコメントのみとしておく
class SqsMessage
include ActiveModel::Model
attr_accessor :title
attr_accessor :comment
validates :title, presence: true
validates :comment, presence: true
end
Controller
class SqsMessagesController < ApplicationController
def index
end
def new
@sqs_message = SqsMessage.new
end
def create
sqs_message = SqsMessage.new(message_params)
queue_url = {AWS管理コンソールのSQSキュー作成で設定されたURL}
message_body = {
"title": sqs_message.title,
"comment": sqs_message.comment
}.to_json
begin
sqs = Aws::SQS::Client.new
sqs.send_message(
queue_url: queue_url,
message_body: message_body
)
flash[:notice] = 'SQSメッセージが送信されました。'
redirect_to sqs_messages_path
rescue => e
Rails.logger.error "SQSメッセージの送信に失敗しました: #{e.message}"
flash[:danger] = "SQSメッセージの送信に失敗しました: #{e.message}"
redirect_to new_sqs_message_path
end
end
private
def message_params
params.require(:sqs_message).permit(:title, :comment)
end
end
View
indexとnewの画面を用意
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SQSメッセージ</title>
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track": "reload" %>
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4">SQSメッセージ</h1>
<% if flash[:notice] %>
<div class="alert alert-success"><%= notice %></div>
<% end %>
<%= link_to 'SQSメッセージ作成', new_sqs_message_path, class: 'btn btn-success' %>
</div>
</body>
</html>
<div class="container">
<h1 class="my-4">SQSメッセージ送信</h1>
<%= render 'form', sqs_message: @sqs_message %>
<%= link_to '戻る', sqs_messages_path, class: "btn btn-secondary mt-3" %>
</div>
<%= form_with(model: sqs_message, local: true, html: { class: "needs-validation", novalidate: true }) do |form| %>
<% if flash[:danger] %>
<div class="alert alert-danger"><%= flash[:danger] %></div>
<% end %>
<div class="mb-3">
<%= form.label :title, "タイトル", class: "form-label" %>
<%= form.text_field :title, class: "form-control" %>
</div>
<div class="mb-3">
<%= form.label :comment, "コメント", class: "form-label" %>
<%= form.text_area :comment, class: "form-control" %>
</div>
<div class="actions">
<%= form.submit class: "btn btn-primary" %>
</div>
<% end %>
画面確認
SQSにメッセージを渡した際のLog
:
web-1 | Started POST "/sqs_messages" for xxx.xxx.xxx.xxx at 2025-xx-xx 15:14:06 +0000
web-1 | Processing by SqsMessagesController#create as TURBO_STREAM
web-1 | Parameters: {"authenticity_token"=>"[FILTERED]", "sqs_message"=>{"title"=>"タイトルテスト", "comment"=>"コメントテスト"}, "commit"=>"Create Sqs message"}
web-1 | [Aws::SQS::Client 200 0.145752 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/xxxx/test-queue",message_body:"{\"title\":\"タイトルテスト\",\"comment\":\"コメントテスト\"}")
:
失敗時
web-1 | Started POST "/sqs_messages" for xxx.xxx.xxx.xxx at 2025-xx-xx 15:37:43 +0000
web-1 | Processing by SqsMessagesController#create as TURBO_STREAM
web-1 | Parameters: {"authenticity_token"=>"[FILTERED]", "sqs_message"=>{"title"=>"タイトルテスト", "comment"=>"テスト"}, "commit"=>"Create Sqs message"}
web-1 | SQSメッセージの送信に失敗しました: missing required parameter params[:queue_url]
さいごに
SQSに送られたメッセージの確認については以下に記載
https://qiita.com/me-654393/items/44669c973a52ff0307d1






