#AWSのSQSキューからメッセージを取得
エラー等でキューイング処理に失敗したメッセージがデッドキューに行ってしまい、メッセージの内容をサルベージする必要が出てきた。Webページ上から作業するにはあまりに量が多かったので、メッセージ内容を取得してファイルに出力するシェルを書いた。
#!/bin/sh
cnt=0
while [ $cnt -lt $1 ];
do
RESULT=`aws sqs receive-message --queue-url "対象キューのURL"`
echo $RESULT >> ./receiveOutput.txt
cnt=$(( cnt + 1 ))
done
aws sqs receive-message
で、キューに溜まったメッセージを1つ取得する。
メッセージが20溜まっていたら、実行時の引数に20と指定して実行すれば、その回数分取得。
./receiveMessage.sh 20
すると、receiveOutput.txtに結果が出力される。
##一度の取得個数を変更する
しかしこれだと、VisibilityTimeoutが30秒など短い時に100件を超えるメッセージが溜まっていると、全てのメッセージを取得する前に、処理したメッセージが可視化されてしまい、同じメッセージを取得してしまうことがあった。
抜本的解決にはならないが、一度に取得するメッセージの数を指定することで、ある程度の対応は可能。
#!/bin/sh
cnt=0
while [ $cnt -lt $1 ];
do
RESULT=`aws sqs receive-message --queue-url "対象キューのURL" --max-number-of-message "10"`
echo $RESULT >> ./receiveOutput.txt
cnt=$(( cnt + 1 ))
done
receive-messageのoptionに--max-number-of-message
と付けることで、一度に取得するメッセージの数を1〜10に変更することが出来る。
ただ、1000を超えるようなメッセージを取得する必要がある時は同じ問題に突き当たってしまう。
どうにか出来ないのだろうか…