AWS SQSをRubyで試してみる

RubyからAWSのSQSにメッセージを送受信してみます。前回Pythonで試しましたが、今回はそのRuby版です。

CloudFormationでSQSを作成するところは前回と同じなので省略します。

RubyAWS SDKをインストール。

$ gem install -N aws-sdk

Rubyのサンプルコード samplr.rb

require 'json'
require 'aws-sdk'

profile = "default"

credentials = Aws::SharedCredentials.new(profile_name: profile)
sqs_client = Aws::SQS::Client.new(credentials: credentials)

queue_url = "https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxx/samplesqs-SampleSQS-XXXXXXXXXXXX"

# 送信
idx = 1
while idx <= 10 do # 10個のメッセージを送信
  message = {msg: "Hello, world!", foo: idx}
  sqs_client.send_message({
    queue_url: queue_url,
    message_body: JSON.dump(message),
  })
  idx += 1
end

# 受信
loop do
  res = sqs_client.receive_message({
    queue_url: queue_url,
  })

  # 受信したものをなにか処理 (このサンプルでは表示するだけ)
  delete_entries = [] # 処理済みメッセージ一覧
  id = 1
  for msg in res.messages do
    message = JSON.parse(msg.body)
    p message
    delete_entries.push({id: id.to_s, receipt_handle: msg.receipt_handle})
    id += 1
  end

  # 処理済みメッセージを削除
  if delete_entries.size > 0 then # 0件でdelete_message_batchを呼び出すとエラーになる
    sqs_client.delete_message_batch({
      queue_url: queue_url,
      entries: delete_entries,
    })
  else
    break
  end
end

実行してみます。

$ ruby sample.rb
{"msg"=>"Hello, world!", "foo"=>5}
{"msg"=>"Hello, world!", "foo"=>1}
{"msg"=>"Hello, world!", "foo"=>9}
{"msg"=>"Hello, world!", "foo"=>2}
{"msg"=>"Hello, world!", "foo"=>7}
{"msg"=>"Hello, world!", "foo"=>10}
{"msg"=>"Hello, world!", "foo"=>3}
{"msg"=>"Hello, world!", "foo"=>4}
{"msg"=>"Hello, world!", "foo"=>6}
{"msg"=>"Hello, world!", "foo"=>8}

できました。順序は保証されていないので、受信したメッセージの順番はめちゃめちゃです。