0
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?

RailsからSQSにメッセージを渡す

Last updated at Posted at 2025-12-29

概要

RailsからSQSにメッセージを渡す処理を調べたので、設定や実装方法をメモとして記載する

前提

AWSへの接続は、アクセスキーとシークレットアクセスキーを使う

準備

SQSでキューを作成

AWSの管理コンソールにて、AWS SQS>キューに遷移し、キューを作成を選択

スクリーンショット 2025-11-02 23.03.44.png

キューを作成画面で情報をセットして作成
※今回はメッセージを渡す確認をしたいだけなので、名前をセットして作成

screencapture-ap-northeast-1-console-aws-amazon-sqs-v3-home-2025-11-02-23_04_18.png

作成後に設定されるURLをコピーしておく
(画像ではtest-queueという名前で作成)
スクリーンショット 2025-11-02 23.07.57.png

環境設定

dockerでRailsを起動している環境にSQSを設定してメッセージを送信してみる

AWSキー情報設定

docker-compose.ymlに以下を指定

docker-comose.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で利用可能なメッセージ列がカウントされるのを確認

スクリーンショット 2025-11-02 23.37.59.png

アプリへの組み込み例

Railsの画面にセットした情報を送信するところまでを記載する
※動作確認目的なので細かいルーティングの制御やCSSの設定は行わない

Routes

config/routes.rb
Rails.application.routes.draw do
:
  resources :sqs_messages
:
end

Model

DBの連携は行わないので、ActiveModelをIncludeさせておく
メッセージ内容はタイトルとコメントのみとしておく

app/models/sqs_message.rb
class SqsMessage
  include ActiveModel::Model

  attr_accessor :title
  attr_accessor :comment

  validates :title, presence: true
  validates :comment, presence: true
end

Controller

app/controllers/sqs_messages_controller.rb
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の画面を用意

app/views/sqs_messages/index.html.erb
<!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>
app/views/sqs_messages/new.html.erb
<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>
app/views/sqs_messages/_form.html.erb
<%= 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 %>

画面確認

スクリーンショット 2025-11-03 0.13.17.png

スクリーンショット 2025-11-03 0.13.38.png

スクリーンショット 2025-11-03 0.14.15.png

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\":\"コメントテスト\"}")  
:

失敗時

スクリーンショット 2025-11-03 0.37.52.png

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

0
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
0
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?