amareloのブログ(仮)

IT系勉強会で感じた想いや知見をメインに書いていきます。

JAWS-UG CLI専門支部 #152R SQS入門 ハンズオン復習

もう1か月前になりますが、5/7(木)JAWS-UG CLI専門支部 #152R SQS入門 に参加しました。 ブログの執筆をしておらず、ハンズオンもついていくのがやっとでした。 今日改めて復習しながらブログを書きます。

目次

イベントページ

jawsug-cli.connpass.com

ハンズオンでやったこと

以下の通りです。事前準備として、Cloud9上にハンズオン環境を構築しました。 ハンズオンでは、Cloud9のターミナルでコマンド実行します。

  • SQSキューの構築
  • VisibilityTimeoutの更新
  • SQSキューへのメッセージ送信
  • SQSキューからのメッセージ受信

Amazon Simple Queue Service (SQS)とは

  • 完全マネージド型のメッセージキューイングサービスである。
  • AWS SDK でサポートされている任意のプログラミング言語からアクセスできる。

■ 標準キューとFIFOキューについて

  • 標準キュー
    • 配信順序が保証されていないため、取得のタイミングによっては同一メッセージが2回配信されることもある。
  • FIFOキュー
    • 配信順序が保証されている。そのため、処理速度は標準キューよりは劣る。

■ショートポーリングとロングポーリングがある。

  • ショートポーリング(デフォルト)
    • リクエストを受けたら、メッセージの有無にかかわらず即レスポンスを返す。
  • ロングポーリング
    • リクエストを受けてもメッセージがなければ、設定されたタイムアウト値になるまでレスポンスを返さない。

■ VisibilityTimeout(可視性タイムアウト)とは?

  • あるクライアントがメッセージを受信中に、他のクライアントがメッセージを受信することを防ぐために設定するタイムアウト値。
    • メッセージを受信しただけではSQSから削除されないため、このような仕組みが必要。
    • デフォルト30秒。最大12時間まで設定可能。

ハンズオン手順

1.SQSキューの構築
環境変数に東京リージョンを指定します。
  • 環境変数を設定するときはexportコマンドを使います。
export AWS_DEFAULT_REGION='ap-northeast-1'
②変数[SQS_QUEUE_NAME]にSQSキュー名を指定します。
SQS_QUEUE_NAME="handson-cli-sqs-queue"
③変数に正しいパラメータが格納されているか確認します。
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. SQS_QUEUE_NAME:"handson-cli-sqs-queue"
       SQS_QUEUE_NAME="${SQS_QUEUE_NAME}"

END
④SQSキューを作成します。
  • SQSキューを作る場合は、sqs create-queueコマンドを使います。
  • `--queue-name <キュー名>' でキュー名を指定します。
aws sqs create-queue --queue-name ${SQS_QUEUE_NAME}
⑤SQSキューが存在することを確認します。
  • SQSキューの存在確認には、sqs list-queuesコマンドを使います。
  • --queue-name-prefix <キュー名> でキュー名を指定します。
aws sqs list-queues --queue-name-prefix ${SQS_QUEUE_NAME} \
--query "QueueUrls[?contains(@,\` ${SQS_QUEUE_NAME}\`)]" \
--output text
2.VisibilityTimeoutの更新
環境変数に東京リージョンを指定します。
  • 環境変数を設定するときはexportコマンドを使います。
export AWS_DEFAULT_REGION='ap-northeast-1'
②変数[SQS_QUEUE_NAME]にSQSキュー名を指定します。
SQS_QUEUE_NAME="handson-cli-sqs-queue"
③変数[SQS_QUEUE_ATTRIBUTE_NAME]にSQSキューの属性名を指定します。
SQS_QUEUE_ATTRIBUTE_NAME="VisibilityTimeout"
④変数[SQS_QUEUE_ATTRIBUTE_VALUE]にSQSキュー属性値を指定します。
  • 今回は60秒を指定します。
SQS_QUEUE_ATTRIBUTE_VALUE="60"
⑤正しいパラメータ値が格納されていることを確認します。
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. SQS_QUEUE_NAME:"handson-cli-sqs-queue"
       SQS_QUEUE_NAME="${SQS_QUEUE_NAME}"
  # 2. SQS_QUEUE_ATTRIBUTE_NAME:"VisibilityTimeout"
       SQS_QUEUE_ATTRIBUTE_NAME="${SQS_QUEUE_ATTRIBUTE_NAME}"
  # 3. SQS_QUEUE_ATTRIBUTE_VALUE:"60"
       SQS_QUEUE_ATTRIBUTE_VALUE="${SQS_QUEUE_ATTRIBUTE_VALUE}"

END
⑥SQSキューのURLを取得します。
  • キューのURLを取得するために`sqs get-queue-url'コマンドを使います。
SQS_QUEUE_URL=$( \
 aws sqs get-queue-url --queue-name ${SQS_QUEUE_NAME} \
 --output text \
) \
&& echo ${SQS_QUEUE_URL}
⑦VisibilityTimeout値を60に更新します。
  • キューの設定値を変更するためにはsqs set-queue-attributesコマンドを使います。
aws sqs set-queue-attributes --queue-url ${SQS_QUEUE_URL} \
 --attributes ${SQS_QUEUE_ATTRIBUTE_NAME}=${SQS_QUEUE_ATTRIBUTE_VALUE}
⑧VisibilityTimeout値を60に変更されたことを確認します。
aws sqs get-queue-attributes --queue-url ${SQS_QUEUE_URL} \
 --attribute-names ${SQS_QUEUE_ATTRIBUTE_NAME} \
 --query "Attributes.${SQS_QUEUE_ATTRIBUTE_NAME}" \
 --output text
3.SQSキューへのメッセージ送信
環境変数に東京リージョンを指定します。
  • 環境変数を設定するときはexportコマンドを使います。
export AWS_DEFAULT_REGION='ap-northeast-1'
②変数[SQS_QUEUE_NAME]にSQSキュー名を指定します。
SQS_QUEUE_NAME="handson-cli-sqs-queue"
③変数[SQS_MESSAGE_BODY]にSQSメッセージのボディを指定します。
SQS_MESSAGE_BODY='Hello World!'
④変数に正しいパラメータ値が格納されていることを確認します。
CAT << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"
  # 1. SQS_QUEUE_NAME:"handson-cli-sqs-queue"
       SQS_QUEUE_NAME="${SQS_QUEUE_NAME}"
  # 2. SQS_MESSAGE_BODY:"Hello World!"
       SQS_MESSAGE_BODY="${SQS_MESSAGE_BODY}"

END
⑤SQSキューのURLを取得します。
SQS_QUEUE_URL=$( \
  aws sqs get-queue-url \
    --queue-name ${SQS_QUEUE_NAME} \
    --output text \
) \
 && echo ${SQS_QUEUE_URL}
⑥SQSキューにメッセージを送信します。
  • メッセージを送信するためには、sqs send-messageコマンドを使います。
  • --queue-url "<キューURL>" でキューURLを指定します。
  • --message-body "<メッセージ>" でメッセージを指定します。
aws sqs send-message --queue-url "${SQS_QUEUE_URL}" \
  --message-body "${SQS_MESSAGE_BODY}"
⑦メッセージが送信されたこと(利用可能なメッセージが1であること)を確認します。
  • キューの属性を取得するにはsqs get-queue-attributes コマンドを使います。
  • --attribute-names で利用可能なメッセージ[ApproximateNumberOfMessages]を指定します。
aws sqs get-queue-attributes \
  --queue-url ${SQS_QUEUE_URL} \
  --attribute-names ApproximateNumberOfMessages \
  --query 'Attributes.ApproximateNumberOfMessages' \
  --output text
4.SQSキューからのメッセージ受信
環境変数に東京リージョンを指定します。
  • 環境変数を設定するときはexportコマンドを使います。
export AWS_DEFAULT_REGION='ap-northeast-1'
②変数[SQS_QUEUE_NAME]にSQSキュー名を指定します。
SQS_QUEUE_NAME="handson-cli-sqs-queue"
③SQSメッセージ用ディレクトリを指定します。
DIR_SQS_MESSAGE="${HOME}/environment/tmp-handson-cli-sqs"
ディレクトリを作成します。
mkdir -p ${HOME}/environment/tmp-handson-cli-sqs
ディレクトリが存在することを確認します。
ls -d ${HOME}/environment/tmp-handson-cli-sqs
⑥SQSメッセージファイルを指定します。
FILE_SQS_MESSAGE="${DIR_SQS_MESSAGE}/$(date +%Y-%m-%d)-${SQS_QUEUE_NAME}.json" \
  && echo ${FILE_SQS_MESSAGE}
⑦変数が正しく格納されているか、確認します。
cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. SQS_QUEUE_NAME:"handson-cli-sqs-queue"
       SQS_QUEUE_NAME="${SQS_QUEUE_NAME}"
  # 2. DIR_SQS_MESSAGE:"${HOME}/environment/tmp-handson-cli-sqs"
       DIR_SQS_MESSAGE="${DIR_SQS_MESSAGE}"
  # 3. FILE_SQS_MESSAGE:"${HOME}/environment/tmp-handson-cli-sqs/2020-05-20-handson-cli-sqs-queue.json"
       FILE_SQS_MESSAGE="${FILE_SQS_MESSAGE}"

END
⑧SQSキューのURLを取得します。
SQS_QUEUE_URL=$( \
  aws sqs get-queue-url \
    --queue-name ${SQS_QUEUE_NAME} \
    --output text \
) \
 && echo ${SQS_QUEUE_URL}
⑨SQSキューからメッセージを受信します。
  • メッセージを受信するにはsqs receive-message コマンドを使います。
aws sqs receive-message --queue-url "${SQS_QUEUE_URL}" \
  > ${FILE_SQS_MESSAGE} \
    && cat ${FILE_SQS_MESSAGE}
⑩ReceiptHandleを取得します。
SQS_MESSAGE_RECEIPT_HANDLE=$( \
  cat ${FILE_SQS_MESSAGE} \
  | jp.py 'Messages[].ReceiptHandle' \
  | sed 's/[]\"\[]//g' \
) \
  && echo ${SQS_MESSAGE_RECEIPT_HANDLE}
⑪ReceiptHandle値でメッセージを特定して、メッセージを削除します。
  • メッセージを削除するにはsqs delete-message コマンドを使います。
aws sqs delete-message --queue--url "${SQS_QUEUE_URL}" \
 --receipt-handle ${SQS_MESSAGE_RECEIPT_HANDLE}
⑫SQSキューに利用可能なメッセージが残っていないこと(0であること)を確認します。
aws sqs get-queue-attributes \
  --queue-url ${SQS_QUEUE_URL} \
  --attribute-names ApproximateNumberOfMessages \
  --query 'Attributes.ApproximateNumberOfMessages' \
  --output text
5.後片付け

ハンズオン環境が不要な場合は、以下の作業を実施します。

最後に

ハンズオン当日は環境準備がおぼつかなくてついていくのがやっとでした。日を改めてじっくりとハンズオン環境を準備して、一つ一つコマンドの意味や挙動を理解しようとしながら取り組むことができ、理解が深まりました。2回ハンズオンを受けて復習もしたためか、コマンドで何をするかが少しずつ分かってきた気がします。SNS入門の復習もしてまたブログに書きます!

最後まで読んでいただき、ありがとうございました!