AWS SQS(Amazon Simple Queue Service)の使い方


参考としてAWS SDK for Ruby V2を利用する場合は、こちらを参考にしてください。

最近メタボリック症候群になりました。現実を受け止め、筋肉SEを目指してトレーニング中の、どうも千葉です。

今日はSQSについてのハンズオンです。
SQSとは、メッセージキューを提供するサービスで、バッチ等非同期処理時が実施可能になります。
今日はAmazon SQSを使って、キューの登録・取得・削除等をやってみたいと思います。
言語は、最近rubyを使っているので、「AWS SDK for Ruby」を使用します。
おそらく、Java・PHP・Python等でもAWSのSDKがあるため、同じような感じで実行できるのではないかと思います。

料金

お金取られない範囲でやりたい方も多いはずなので、一応記載しておくと無料のはずです。
ユーザ登録後の無料期間にかかわらず(無料期間以外でも)2014年10月現在、月100万リクエストは無料で受信できるということです。
※Amazonは、結構料金面で改定があるので別途自分で確認してくださいね

バッチ概要

作成するバッチの処理内容です。
※最高の手書き感

「batch1.rb」でキュー登録。
「batch2.rb」でキューを取得して文字列を表示。そして、キューを削除。
という感じでやってみます。

前提

  • AWSアカウント作成済み
  • Rubyが利用できる環境になっている

AWS SDK for Rubyのインストール

まずは、AWSのAPIを使えるようにSDKをインストールします。

gem install aws-sdk

または、バイナリ落としてきて入れてください。
http://aws.amazon.com/jp/sdkforruby/

API用ユーザの作成とキーの取得

IAMにてAPI用ユーザを作成し、アクセス用のキーを取得します。

  1. IAM画面にアクセス
  2. 「Users」をクリック
  3. アクセスキーとシークレットアクセスキーを取得
  4. 「Create New Users」をクリック
  5. 作成するユーザ名を入れて、「Create」を選択。今回私は、api-userを作成。
  6. 「Generate an access key for each user」にチェックを入れたままにする。このチェックは、API用の鍵を作成するかどうか。
  7. 「Download Credentials」で鍵をダウンロードして任意の場所に保存しておく。

作成したユーザをグループに追加

アクセス権限を設定するため、グループを作成し、先ほど作成したユーザを追加します。

  1. IAM画面にアクセス
  2. 「Groups」をクリック
  3. 「Create New Group」をクリック
  4. Group名を入力し、「Next Step」をクリック
  5. 「Administrator Access」をセレクト※ここは適宜権限を選択してください
  6. 「Next Step」をクリック
  7. 内容確認して「Create Group」をクリック
  8. 「Users」をクリックし、先ほど作成したユーザをクリック
  9. 「Add User to Groups」をクリックし、先ほど作成したグループを選択し、「Add to Groups」をクリック 

Queueを作成

SQSに、Queueを作成します。

  1. SQSにアクセス
  2. 「Create New Queue」をクリック。
  3. Queue名を入れて「Create Queue」をクリック。

各パラメータの意味は以下になります。

  • Queue Name : queueの名前
  • Default Visibility Timeout : 受信バッチが複数ある場合に、同じキューを複数のバッチが取得するのを避けるために、使用するパラメータ。メッセージ受信したら、他のバッチからキューが見えないように非表示にする時間。デフォルト30秒
  • Message Retention Period : メッセージを保持期間
  • Maximum Message Size :1メッセージの最大サイズ
  • Delivery Delay : メッセージ登録後、メッセージ取得できるようになるまでの時間。例えば10秒に設定した場合、メッセージ登録、10秒経過後にメッセージが取得できるようになる。
  • Receive Message Wait time : ロングポーリング時間を指定。例としてこの値を20秒にし、* キューが空の場合。キューが空だと20秒間待って、空メッセージを返す。もし、20秒の間にメッセージを受信した場合は、直ちにメッセージ受信できる。 ※Dead Letter Queueとは、実行失敗したキューを、別キューに退避でる設定
  • Receive Message Wait time:Dead Letter Queueを有効にする
  • Dead Letter Queue:退避用のキュー名を指定
  • Maximum Receives::Dead Letterと判定する失敗回数

メッセージ登録バッチ

それでは早速メッセージを登録してみます。
APIの詳細はこちら

batch1.rb
require 'aws-sdk'

sqs = AWS::SQS.new(
  :access_key_id => 'ダウンロードした鍵のAccess Key Id',
  :secret_access_key => 'ダウンロードした鍵のSecret Access Key'
)

# キューのURL(AWS SQSコンソール画面のしたDetailsのURL)
queue_url = "https://sqs.ap-northeast-1.amazonaws.com/XXXXXXX/キュー名"

# メッセージ入力
p "登録するメッセージを入力してください:"
q_msg = gets.chop

# メッセージの登録
sqs.queues[queue_url].send_message(q_msg)

このスクリプトを実行後に、AWSコンソールにてキューのアクションよりViewを選択してみるとメッセージが登録されています。

メッセージの表示&削除

登録したメッセージを表示して、削除します。

batch2.rb
require 'aws-sdk'

sqs = AWS::SQS.new(
  :access_key_id => 'ダウンロードした鍵のAccess Key Id',
  :secret_access_key => 'ダウンロードした鍵のSecret Access Key'
)

# キューのURL(AWS SQSコンソール画面のしたDetailsのURL)
queue_url = "https://sqs.ap-northeast-1.amazonaws.com/XXXXXXX/キュー名"

# メッセージの取得
msg = sqs.queues[queue_url].receive_message

# メッセージの表示
puts msg.body

# メッセージの削除
msg.delete

スクリプト実行時に、先ほど登録したメッセージ「abcdefg」が出力されます。
このスクリプトを実行後に、AWSコンソールにてキューのアクションよりViewを選択してみるとメッセージが削除されています。

以上、これでSQSをrubyよりごにょごにょ終了です。