autoscalingの通知先として選べるので使いそう、ということで触ってみました
やってる事はいたってシンプルです
cliでqueueへメッセージを登録、同じくcliでqueueからメッセージを取得するだけ
事前にコマンドを発行するEC2にIAM Roleを適用させておくかcredentialsの登録をしておく必要があります
credentialsの用意
IAM Roleじゃない場合下記手順でキーを登録します
- credentials-as.txt
AWSAccessKeyId=*** AWSSecretKey=***
export AWS_CREDENTIAL_FILE=filepath
queueリストを表示(登録前)
aws sqs list-queues --region ap-southeast-1
queueの作成
URLはエンドポイント、アカウントID、queue名っぽい(未確認)
aws sqs create-queue --queue-name sample --region ap-southeast-1 { "QueueUrl": "https://ap-southeast-1.queue.amazonaws.com/111111111111/sample" }
queueのリストを表示
aws sqs list-queues --region ap-southeast-1 { "QueueUrls": [ "https://ap-southeast-1.queue.amazonaws.com/111111111111/sample" ] }
メッセージの登録
基本的にはqueueのURL、リージョンを指定してあげる必要があるようです
aws sqs send-message --queue-url https://ap-southeast-1.queue.amazonaws.com/111111111111/sample --message-body "test message" --region ap-southeast-1 { "MD5OfMessageBody": "c72b9698fa1927e1dd12d3cf26ed84b2", "MessageId": "4ad8e8f2-4478-4c5c-a67d-4fe832689878" }
メッセージの受信
aws sqs receive-message --queue-url https://ap-southeast-1.queue.amazonaws.com/111111111111/sample --region ap-southeast-1 { "Messages": [ { "Body": "test message", "ReceiptHandle": "AQEBQTSAy7clxU3MYjZvQlKAKROQHLY7KdAFRTxAwxZD2deqRtp30anXPLW4maSbgKVN9SBw9jDhM48duOi2VfezLkzujAby4wfiYa3zXkA93z5iX9h9ytHGxOA3nblrR79kRTb9T6ppIfGjWlgvubwC4gY3eAOnglgVL4LmaksTOlZ22F3XchcB2ff9MfQIIuVL5yap+P3GjjqA4lyCEGu/+MvCQt9ZjewKwYrxxHDHGlCHyrIQDbh5cZ0y5wnheI0fNPGak/zu9m3WSH/ZBKhMS3sfxylCBleY12NH1gRpFaivhkFhtrZb6rNjfagqU18TIvtpQQcYabrzje+1mNo9dSy4DE3zxGojEnoxoskNMSGs+QzOB77gb9mIJaxuPQ/kho3q93DqyOsdIQYu1NfGRQ==", "MD5OfBody": "c72b9698fa1927e1dd12d3cf26ed84b2", "MessageId": "4ad8e8f2-4478-4c5c-a67d-4fe832689878" } ] }
受け取ったメッセージをもとに処理をさせたりする事が出来ます
autoscalingでのSQS利用も出来るようなので次回やってみます
メッセージの削除
処理が終ったらqueueを削除します
メッセージの受信時に得られるReceiptHandle
の値を使って削除用のコマンドを叩きます
aws sqs delete-message --queue-url https://ap-southeast-1.queue.amazonaws.com/111111111111/sample --region ap-southeast-1 --receipt-handle "AQEBPOHXHziJPwmZW6WIhi6p2xAFikhUvkLyyTeHfbLbt5wukbcFi63eisXhOjdKuYqjA7Y9Q8j2V+UAIIbdEw3rtIhbobYEeugb+dgKEufKaOrcgf6PqLulPh6d9HyvVSbLAlm4/J983PBn0qi8IcSERg3hA8urlVRAC26DGNc2o2ze0tsZP5PWJwBjU3oUqbstWiNW8d/A3nGysbVVpXsnb26BLCpyslYTkiGqrwA5XWQp+YrpK2PCkpftIjg32X5I3vKzfnoVc93pBTQpoIG9cJ6Ha1WcZ5jYdt5cXPoNL9VLLac9ajNvIUhs9KaAXtFjEMHXEtWHqrg5lRNSgtNnQyXqGvtZFgyYLT7Tl1wOy4AMWSQ0GgNHU6Bhb9f52OlDkxRIkWzzo382u6C6/yIErQ=="
SQS自体は分散キューだそうで、色々調べた感じ「 queueの受信は一回以上はある 」らしいので二回以上読み込んでしまうことがあるらしいです
なので二重処理のチェックなどは実装する必要がありそうですね