プログラミング

【AWS復習】Amazon SQSでメッセージを送受信してみた

-プログラミング

JAWS-UG CLI専門支部のSQS勉強会に参加させていただいたので、復習をかねて自分なりに調べながらハンズオンの内容を再現してみます。

一部は本家のやり方を変更してます。

作業環境

  • アカウント:AmazonSQSFullAccessが付与されたアカウント
  • リージョン:東京リージョン

Cloud9に作業用環境を作成

ブラウザでCloud9を開き、作業用のCloud9環境を作成します。パラメータはデフォルトのままでOKです。

作成したらIDEを開きます。

以降のコマンドはCloud9のbashで実行します。

OS、bash、AWS CLIのバージョンを確認

今回は以下の環境を前提としています。

  • OS:Amazon Linux release 2 (Karoo)以降
  • bash:bash "4.2.46(2)-release以降
  • AWS CLI:1.20.56以降
  • OSのバージョン確認

bashでコマンドを実行してOSのバージョンを確認します。

cat /etc/system-release
  • bashのバージョン確認

bashでコマンドを実行してbashのバージョンを確認します。

bash --version | head -1
  • AWS CLIのバージョン確認

bashでコマンドを実行してAWS CLIのバージョンを確認します。

aws --version

SQSキューの作成

リージョンとSQSキュー名を変数に格納

  • 変数:AWS_DEFAULT_REGIONap-northeast-1を格納

bashでコマンドを実行する。

export AWS_DEFAULT_REGION='ap-northeast-1'
  • 変数:SQS_QUEUE_NAMEtest-cli-sqs-novice-queueを格納

bashでコマンドを実行する。

export SQS_QUEUE_NAME="test-cli-sqs-novice-queue"
  • echoで変数に値が格納されていることを確認

bashでコマンドを実行する。

echo ${AWS_DEFAULT_REGION}
echo ${SQS_QUEUE_NAME}

キューの作成

 aws sqs create-queue コマンドでキューを作成します。

キューの名前は、SQS_QUEUE_NAMEに格納したtest-cli-sqs-novice-queueになります。

aws sqs create-queue \
  --queue-name ${SQS_QUEUE_NAME}

aws sqs list-queues コマンドでキューが作成されたことを確認します。

aws sqs list-queues \
  --queue-name-prefix ${SQS_QUEUE_NAME} \
  --query "QueueUrls[?contains(@, \`${SQS_QUEUE_NAME}\`)]" \
  --output text

オプションの解説は以下の通り。

オプション説明
--queue-name-prefixリストの結果をフィルタリングするために使用する文字列。
名前が指定された文字列で始まるキューのみが返されます。
--query出力する項目を指定します。
--output text出力をタブ区切りの文字列値の複数行としてフォーマットします。

オプションを使わない場合はこのように出力されます。

オプションを使うことで出力結果を整形して必要な情報だけを見やすくしています。

SQSのコンソールからもキューが作成されたことを確認出来ます。

表示されない場合は、タブを更新してみてください。

キューの可視性タイムアウトの設定

  • 可視性タイムアウトとは

他のコンシューマーが再度メッセージを処理しないようにするため、Amazon SQS は可視性タイムアウトで、Amazon SQS が他のカスタマーがそのメッセージを受信および処理できなくなる期間です。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html

リージョン、SQSのキュー名、属性名属性値を変数に格納

  • 変数:AWS_DEFAULT_REGIONにリージョン名:ap-northeast-1を格納

bashでコマンドを実行する。

export AWS_DEFAULT_REGION='ap-northeast-1'
  • 変数:SQS_QUEUE_NAMEにキュー名:test-cli-sqs-novice-queueを格納

bashでコマンドを実行する。

export SQS_QUEUE_NAME="test-cli-sqs-novice-queue"
  • 変数:SQS_QUEUE_ATTRIBUTE_NAMEにキュー属性名:VisibilityTimeoutを格納

bashでコマンドを実行する。

export SQS_QUEUE_ATTRIBUTE_NAME="VisibilityTimeout"
  • 変数:SQS_QUEUE_ATTRIBUTE_VALUEにキュー属性値:50を格納

可視性タイムアウトを50秒に設定します。

bashでコマンドを実行する。

export SQS_QUEUE_ATTRIBUTE_VALUE="50"
  • echoで変数に値が格納されていることを確認

bashでコマンドを実行する。

echo ${AWS_DEFAULT_REGION}
echo ${SQS_QUEUE_NAME}
echo ${SQS_QUEUE_ATTRIBUTE_NAME}
echo ${SQS_QUEUE_ATTRIBUTE_VALUE}
  • aws sqs get-queue-urlコマンドでSQSキューのURLを取得

aws sqs get-queue-urlコマンドでSQSキューのURLを取得して変数:SQS_QUEUE_URLへ格納します。

bashでコマンドを実行する。

SQS_QUEUE_URL=$( \
  aws sqs get-queue-url \
    --queue-name ${SQS_QUEUE_NAME} \
    --output text \
) \
 && echo ${SQS_QUEUE_URL}

オプションの解説は以下の通り。

オプション説明
--queue-nameキューの名前を指定します。
--output text出力をタブ区切りの文字列値の複数行としてフォーマットします。
  • aws sqs set-queue-attributesコマンドでSQSキューの属性を更新

aws sqs get-queue-urlコマンドでSQSキューの属性を更新します。

bashでコマンドを実行する。

aws sqs set-queue-attributes \
  --queue-url ${SQS_QUEUE_URL} \
  --attributes ${SQS_QUEUE_ATTRIBUTE_NAME}=${SQS_QUEUE_ATTRIBUTE_VALUE}

実行結果は出力されないので注意。

オプションの解説は以下の通り。

オプション説明
--queue-urlキューのURLを指定します。
--attributes属性と値を指定します。
  • aws sqs get-queue-attributesコマンドキューの可視性タイムアウトが更新されたことを確認

aws sqs get-queue-attributesコマンドでキューの可視性タイムアウト50に更新されたことを確認します。

bashでコマンドを実行する。

aws sqs get-queue-attributes \
  --queue-url ${SQS_QUEUE_URL} \
  --attribute-names ${SQS_QUEUE_ATTRIBUTE_NAME} \
  --query "Attributes.${SQS_QUEUE_ATTRIBUTE_NAME}" \
  --output text

オプションの解説は以下の通り。

オプション説明
--queue-urlキューのURLを指定します。
--attribute-namesキューの属性名を指定します。
--query出力する項目を指定します。
--output text出力をタブ区切りの文字列値の複数行としてフォーマットします。

SQSのコンソールからもキューが作成されたことを確認できます。

キューの詳細を開き、「更に表示」を開くことで可視性タイムアウトの時間を確認できます。

SQSキューへメッセージ送信

リージョンとSQSキュー名、SQSメッセージボディを変数に格納

  • 変数:AWS_DEFAULT_REGIONap-northeast-1を格納

bashでコマンドを実行する。

export AWS_DEFAULT_REGION='ap-northeast-1'
  • 変数:SQS_QUEUE_NAMEtest-cli-sqs-novice-queueを格納

bashでコマンドを実行する。

export SQS_QUEUE_NAME="test-cli-sqs-novice-queue"
  • 変数:SQS_MESSAGE_BODYHello World!を格納

今回は平文をメッセージボディに格納します。

bashでコマンドを実行する。

export SQS_MESSAGE_BODY='Hello World!'
  • echoで変数に値が格納されていることを確認

bashでコマンドを実行する。

echo ${AWS_DEFAULT_REGION}
echo ${SQS_QUEUE_NAME}
echo ${SQS_MESSAGE_BODY}

SQSメッセージの送信

  • ws sqs get-queue-urlコマンドでSQSキューのURLを取得

aws sqs get-queue-urlコマンドでSQSキューのURLを取得して変数:SQS_QUEUE_URLへ格納します。

bashでコマンドを実行する。

SQS_QUEUE_URL=$( \
  aws sqs get-queue-url \
    --queue-name ${SQS_QUEUE_NAME} \
    --output text \
) \
 && echo ${SQS_QUEUE_URL}

オプションの解説は以下の通り。

オプション説明
--queue-nameキューの名前を指定します。
--output text出力をタブ区切りの文字列値の複数行としてフォーマットします。
  • aws sqs send-messageコマンドでSQSキューへメッセージ送信

aws sqs send-messageコマンドでSQSキューのURLへメッセージを送信します。

bashでコマンドを実行する。

aws sqs send-message \
  --queue-url "${SQS_QUEUE_URL}" \
  --message-body "${SQS_MESSAGE_BODY}"

オプションの解説は以下の通り。

オプション説明
--queue-url送信先のキューのURLを指定します。
--message-body送信するメッセージボディを指定します。
  • aws sqs get-queue-attributesコマンドでSQSキューが送信されたことを確認

aws sqs get-queue-attributesコマンドでメッセージ数を確認することでメッセージが送信された事を確認します。

bashでコマンドを実行する。

aws sqs get-queue-attributes \
  --queue-url ${SQS_QUEUE_URL} \
  --attribute-names ApproximateNumberOfMessages \
  --query 'Attributes.ApproximateNumberOfMessages' \
  --output text

1回送信してるので「1」となります。

SQSのコンソールからもキューが送信されたことを確認できます。

キューの詳細を開き、「更に表示」を開き、「可能なメッセージ数」から確認できます。

SQSキューからメッセージ受信の下準備

リージョンとSQSキュー名を変数に格納

  • 変数:AWS_DEFAULT_REGIONap-northeast-1を格納

bashでコマンドを実行する。

export AWS_DEFAULT_REGION='ap-northeast-1'
  • 変数:SQS_QUEUE_NAMEtest-cli-sqs-novice-queueを格納

bashでコマンドを実行する。

export SQS_QUEUE_NAME="test-cli-sqs-novice-queue"
  • echoで変数に値が格納されていることを確認

bashでコマンドを実行する。

echo ${AWS_DEFAULT_REGION}
echo ${SQS_QUEUE_NAME}

SQSメッセージのディレクトリを作成、変数に格納

  • 変数:DIR_SQS_MESSAGEにディレクトリ名を格納、ディレクトリ作成

ディレクトリの存在チェックを行い、存在しない場合はディレクトリを作成します。

bashでコマンドを実行する。

DIR_SQS_MESSAGE="${HOME}/environment/tmp-handson-cli-sqs"

ls -d ${DIR_SQS_MESSAGE} > /dev/null 2>&1 \
  || mkdir -p ${DIR_SQS_MESSAGE}

変数にディレクトリが格納されていることと、ディレクトリが存在することを確認します

echo ${DIR_SQS_MESSAGE}

ls /home/ec2-user/environment/

SQSメッセージファイルの指定

  • 変数:FILE_SQS_MESSAGEにメッセージを受信するファイル情報を格納します。

bashでコマンドを実行する。

FILE_SQS_MESSAGE="${DIR_SQS_MESSAGE}/$(date +%Y-%m-%d)-${SQS_QUEUE_NAME}.json" \
  && echo ${FILE_SQS_MESSAGE}

このJsonファイルにSQSで送信されたメッセージが書き込まれます。

SQSキューからメッセージ受信

SQSメッセージの受信

  • 変数:aws sqs receive-messageコマンドでSQSメッセージを受信

bashでコマンドを実行する。

aws sqs receive-message \
  --queue-url "${SQS_QUEUE_URL}" \
  > ${FILE_SQS_MESSAGE} \
    && cat ${FILE_SQS_MESSAGE}

オプションの解説は以下の通り。

オプション説明
--queue-urlキューのURLを指定します。

受信したメッセージをリダイレクトでJSONファイルに書き込んでいます。

  • aws sqs delete-messageコマンドで受信したメッセージを削除

メッセージを受信しても自動で削除されないので、aws sqs delete-messageコマンドで削除します。

最初に識別子を変数:SQS_MESSAGE_RECEIPT_HANDLEに格納します。

bashでコマンドを実行する。

SQS_MESSAGE_RECEIPT_HANDLE=$( \
  cat ${FILE_SQS_MESSAGE} \
  | jp.py 'Messages[].ReceiptHandle' \
  | sed 's/[]\"\[]//g' \
) \
  && echo ${SQS_MESSAGE_RECEIPT_HANDLE}

次に識別子が一致するメッセージを削除します。

bashでコマンドを実行する。

aws sqs delete-message \
  --queue-url "${SQS_QUEUE_URL}" \
  --receipt-handle ${SQS_MESSAGE_RECEIPT_HANDLE}

オプションの解説は以下の通り。

オプション説明
--queue-urlキューのURLを指定します。
--receipt-handleメッセージの識別しを指定します。
  • aws sqs get-queue-attributesコマンドでSQSキューが削除されたことを確認

aws sqs get-queue-attributesコマンドでメッセージ数を確認することでメッセージが削除された事を確認します。

bashでコマンドを実行する。

aws sqs get-queue-attributes \
  --queue-url ${SQS_QUEUE_URL} \
  --attribute-names ApproximateNumberOfMessages \
  --query 'Attributes.ApproximateNumberOfMessages' \
  --output text

メッセージを削除しているので「0」となります。

SQSのコンソールからもキューが送信されたことを確認できます。

キューの詳細を開き、「更に表示」を開き、「可能なメッセージ数」から確認できます。

-プログラミング