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

【***参考としてAWS SDK for Ruby V2を利用する場合は、[こちら](http://qiita.com/iron-breaker/items/dc4f3f002a951e109948)を参考にしてください。***】

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


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

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

# バッチ概要
作成するバッチの処理内容です。
※最高の手書き感
![DSC_0173.JPG](https://qiita-image-store.s3.amazonaws.com/0/33834/4ffaeca5-c296-fd00-53ea-75ab9d285898.jpeg "DSC_0173.JPG")

「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画面にアクセス](link:https://console.aws.amazon.com/iam/home?#home)
1. 「Users」をクリック
1. アクセスキーとシークレットアクセスキーを取得
1. 「Create New Users」をクリック
1. 作成するユーザ名を入れて、「Create」を選択。今回私は、api-userを作成。
1. 「Generate an access key for each user」にチェックを入れたままにする。このチェックは、API用の鍵を作成するかどうか。
1. 「Download Credentials」で鍵をダウンロードして任意の場所に保存しておく。

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

1. [IAM画面にアクセス](link:https://console.aws.amazon.com/iam/home?#home)
1. 「Groups」をクリック
1. 「Create New Group」をクリック
1. Group名を入力し、「Next Step」をクリック
1. 「Administrator Access」をセレクト※ここは適宜権限を選択してください
1. 「Next Step」をクリック
1. 内容確認して「Create Group」をクリック
1. 「Users」をクリックし、先ほど作成したユーザをクリック
1. 「Add User to Groups」をクリックし、先ほど作成したグループを選択し、「Add to Groups」をクリック　


# Queueを作成
SQSに、Queueを作成します。

1. [SQSにアクセス](https://console.aws.amazon.com/sqs/)
1. 「Create New Queue」をクリック。
1. Queue名を入れて「Create Queue」をクリック。
![スクリーンショット 2014-10-05 18.39.36.png](https://qiita-image-store.s3.amazonaws.com/0/33834/8471dcca-55f5-e5be-b8f9-3b53b312a635.png "スクリーンショット 2014-10-05 18.39.36.png")

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

* 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の詳細はこちら](http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html)

````ruby: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を選択してみるとメッセージが登録されています。

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

```` ruby: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よりごにょごにょ終了です。