😊

AWS CLIでAmazon SQSのデッドレターキューを設定してみた

2021/06/03に公開2

はじめに

zennでは初記事です。amarelo(アマレロ)と申します。

現在独学でAWSを勉強しているのですが、よくAWS CLI(以下CLI)を使います。
最近、Amazon SQS(以下SQS)について勉強し、CLIでの設定方法も調べたのですが、デッドレターキューの設定でハマりましたので、備忘録として記事を書こうと思います。

AWSの公式サイト等を参考に本記事を書きますが、誤認識もある可能性があります。参考にされる際は自己責任でお願いします。また、誤りがありましたら、そっと指摘していただけると幸いです。

Amazon SQSとは

大まかにまとめると以下の通りです。詳しくは開発者ドキュメントを参照してください。

  • フルマネージド型のメッセージキューイングサービス
  • AWSサービスの中で最古のサービス(2004年サービスイン)
  • システムやアプリケーションの疎結合化を実現する。
  • メッセージの配信順序を保証するFIFO(First-in-First-out)キューと、配信順序の保証がない標準キュー(デフォルト)がある。
  • ポーリング方法は、ショートポーリングとロングポーリングがある。
  • AWS KMS(Key Management Service)と連携して、サーバ側の暗号化をすることが可能
  • メッセージの最大容量は256KB

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html

デッドレターキューとは

概要

簡単に書くと、正しく処理できないメッセージをキュー内に残し続けないよう、他のキューに移動させる機能です。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html

イメージとしては以下のように理解しましたが、違っていたらご指摘ください。

設定構造

デッドレターキュー設定は、キューの属性RedrivePoricyにてJSON形式で保持しています。

{
    "Attributes": {
        "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:ap-northeast-1:xxxxxxxxxxxx:DeadLetterQueue\",\"maxReceiveCount\":5}"
    }
}
  • deadLetterTargetArn:デッドレターキュー用キューのARN
  • maxRecieveCount:最大受信数

CLIで設定するには、この構造と同じJSONを読み取る必要があります。

デッドレターキューの設定手順

ここからはCLIでデッドレターキューを設定する手順となります。

前提条件

通常使うキューとは別に、デッドレターキュー用のキューを作成する必要があります。2つともキュー作成済という前提にします。キューの作成方法はここでは触れませんが、それぞれ以下の名称でキューを作成します。

  • 通常使うキュー:TestQueue
  • デッドレターキュー用のキュー:DeadLetterQueue

コマンド

私はAWS CloudShellからコマンド実行します。

  1. 任意のリージョンをグローバル変数に格納します。ここでは東京リージョンを設定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
  1. キュー名を変数に格納します。
SQS_QUEUE_NAME="TestQueue"
  1. 格納した変数が正しいか再確認します。
cat << END

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

  # 1. SQS_QUEUE_NAME:"TestQueue"
       SQS_QUEUE_NAME="${SQS_QUEUE_NAME}"

END
  1. 通常使うキュー(TestQueue)のURLを取得します。
SQS_QUEUE_URL=$( \
 aws sqs get-queue-url \
 --queue-name ${SQS_QUEUE_NAME} \
 --output text \
) \
&& echo ${SQS_QUEUE_URL}

実行結果

https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/TestQueue
  1. デッドレターキュー名を変数に格納します。
SQS_DEADLETTERQUEUE_NAME=DeadLetterQueue
  1. デッドレターキューのURLを取得します。
SQS_DEADLETTERQUEUE_URL=$( \
 aws sqs get-queue-url \
 --queue-name ${SQS_DEADLETTERQUEUE_NAME} \
 --output text \
) \
&& echo ${SQS_DEADLETTERQUEUE_URL}

実行結果

https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/DeadLetterQueue
  1. デッドレターキューのARNを取得します。
SQS_DEADLETTERQUEUE_ARN=$( \
  aws sqs get-queue-attributes \
  --queue-url ${SQS_DEADLETTERQUEUE_URL} \
  --attribute-names QueueArn \
  --output text \
  | sed -e 's/ATTRIBUTES\s//' \
) \
&& echo ${SQS_DEADLETTERQUEUE_ARN}

sed -e 's/ATTRIBUTES\s//'がないと、実行結果が以下のように表示されてしまいます。

ATTRIBUTES arn:aws:sqs:ap-northeast-1:xxxxxxxxxxxx:DeadLetterQueue

ATTRIBUTES は不要なため、削除してやる必要があります。Sのうしろに半角スペースが一つ入りますので、半角スペースまで取り除く必要があります。

実行結果

arn:aws:sqs:ap-northeast-1:xxxxxxxxxxxx:DeadLetterQueue
  1. JSONファイルを作成します。
cat << EOF >> deadletter.json
{
	"RedrivePolicy": "{\"deadLetterTargetArn\":\"${SQS_DEADLETTERQUEUE_ARN}\",\"maxReceiveCount\":\"5\"}"
}
EOF

maxReceiveCountで最大受信数を指定します。今回は5にしました。

  1. JSONファイルの作成確認をします。
cat deadletter.json

実行結果

{
"RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:ap-northeast-1:xxxxxxxxxxxx:DeadLetterQueue\",\"maxReceiveCount\":\"5\"}"
}
[
  1. ここで変数が正しく入っているか再確認します。
cat << END

  # 0. SQS_QUEUE_URL:"https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/TestQueue"
       SQS_QUEUE_URL="${SQS_QUEUE_URL}"

END
  1. 以下の通りコマンド実行します。
aws sqs set-queue-attributes \
--queue-url ${SQS_QUEUE_URL} \
--attributes file://deadletter.json

エラーが何も返らなければ成功です。

aws sqs set-queue-attributes \
--queue-url ${SQS_QUEUE_URL} \
--attributes '{"RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:ap-northeast-1:xxxxxxxxxxxx:DeadLetterQueue\",\"maxReceiveCount\":\"5\"}"}'

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-parameters-quoting-strings.html

  1. デッドレターキューが設定されたことを確認します。
aws sqs get-queue-attributes \
--queue-url ${SQS_QUEUE_URL} \
--attribute-names RedrivePolicy

以下のように返ってくれば成功です。

{
    "Attributes": {
        "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:ap-northeast-1:xxxxxxxxxxxx:DeadLetterQueue\",\"maxReceiveCount\":5}"
    }
}

マネジメントコンソール(以下マネコン)からデッドレターキューが設定されていることを確認する場合は、対象のキュー設定画面にて、デッドレターキューが「有効」になり、最大受信数がJSONファイルのmaxReceiveCountで指定した数になっていればOKです。

まとめ

今回CLIで設定することでデッドレターキューの設定構造を知ることができました。たぶん、マネコンで設定操作していると意識しづらいところであり、マネコンで設定するより明らかに苦労しますがやってみると理解が深まると改めて実感しました。

自分は普段からLinuxコマンドを扱うことがほとんどないため、ARNの文字成形(7~9)には苦労しました。空白部分を取り除くだけに1日ハマりました。CLIを使いこなすためにはLinuxコマンドの知識をつけることが大切だと改めて実感しました。これを機に本気でLinuxコマンドや正規表現のこと勉強しようかと思いました。

また、AWS CLIユーザガイドをちゃんと読むことも大事ですね。さもないと、誤った設定をしたり、上手く実行できずにハマります…

最後になりますが、この記事が誰かの役に立てば幸いです。

Discussion

michimanimichimani

下記のように実行すると sed で置換せずに ARN のみ取得できます。

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