Amazon SQS(Simple Queue Service)の設定及び使用手順について解説します。
Amazon SQS(Simple Queue Service)とは
Amazon SQS は高い可用性と信頼性のある分散システムです。
AWS 管理画面にログインすると分かりますが、サービスのカテゴリ的には「アプリケーション結合」に配置されています。
疎結合(そけつごう)とは
- 疎(そ) ← あらい。まばら。間が空いている。親しくない。という意味です。
- 疎結合(そけつごう) ← Loosely Coupled。複数のシステムがゆるく結びついた構成のことを言います。全く結びつきがないわけもなく、密接に結びついているわけでもない、緩い結合です。
Amazon SQS(Simple Queue Service)のキューの作成
Amazon SQS(Simple Queue Service)のキューの作成をしますが、その前に簡単に設計をします。
Amazon SQS(Simple Queue Service)のキューの設計
- キューのタイプ : FIFO
- 各パラメーター : 基本的にデフォルトのまま
Amazon SQS(Simple Queue Service)のキュー(FIFO)の作成手順
AWS 管理コンソールにログインし、上のメニューより「サービス」-「アプリケーション結合」-「Simple Queue Service」をクリックします。
「今すぐ始める」ボタンをクリックします。
「キュー名」に新規作成するキューの名前を入れます。
この時に、拡張子に「.fifo」のサフィックスを付けないと下図のように警告(FIFO キューの名前は .fifo のサフィックスで終わる必要があります。)が表示されます。
※サフィックス(suffix)とは、”接尾辞”という意味です。簡単に言うと、何らかの文字列の最後に位置する文字列を指します。たとえば、Uploadtest.exe ファイルとか、DownloadFile.exe の exe の部分です。特に IT では、拡張子のことを言うことが多いです。
「fifo」を選択した場合は、以下のように「.fifo」のサフィックスを付ける必要があります。
キュー名:Test_Queue_001.fifo
以下のように設定したらさらに細かく設定するために「キューの設定」ボタンをクリックします。
- キュー名 : Test_Queue_001.fifo
- キューのタイプ : FIFO キュー
「キューの設定」ボタンをクリックすると下図のように詳細な設定画面が表示されます。
下図はデフォルトの値で、必要なら各項目に値を入力します。
■キューの属性
- デフォルトの可視性タイムアウト(Default Visibility Timeout) ← キューから受信したメッセージが他の受信コンポーネントから見えない時間の長さ(秒)です。デフォルト 30 秒。値は 0 秒~12 時間の間である必要があります。
- メッセージ保持期間(Message Retention Period) ← メッセージが削除されない場合に Amazon SQS で保持される時間です。デフォルト 4 日。値は 1 分~14 日の間である必要があります。
- 最大メッセージサイズ(Maximum Message Size) ← Amazon SQS が受け付ける最大メッセージサイズ(バイト)です。デフォルト 256 KB。値は 1~256 KB の間である必要があります。
- 配信遅延(Delivery Delay) ← このキューに追加されたすべてのメッセージの初回配信の遅延時間です。デフォルト 0 秒。値は 0 秒~15 分の間である必要があります。
- メッセージ受信待機時間(Receive Message Wait Time) ← ロングポーリング受信呼び出しが空の応答を返すまでに、メッセージが利用可能になるまで待機する最大時間です。デフォルト 0 秒。値は 0 秒~20 秒の間である必要があります。
- コンテンツに基づく重複排除(Content-Based Deduplication) ← チェックありの場合、メッセージの本文 (メッセージの属性ではない) のSHA-256 ハッシュを使用してコンテンツベースのメッセージ重複排除 ID を生成します。デフォルトはチェックなしです。
■デッドレターキュー設定
- 再処理ポリシーの使用(Use Redrive Policy) ← 最大受信数を超えた後、メッセージはデッドレターキューに送信されます。
- デッドレターキュー(Dead Letter Queue) ← デッドレターキューとして機能する、既存のキューの名前です。値は既存のキュー名である必要があります。
- 最大受信数(Maximum Receives) ← デッドレターキューに送信されるまでにメッセージを受信できる最大回数です。値は 1~1000 の間である必要があります。
■サーバー側の暗号化 (SSE) の設定
- SSE の使用(Use SSE) ← このオプションを選択すると、Amazon SQS は、指定したカスタマーマスターキー (CMK) から生成されたデータキーを使用して、このキューに送信されるすべてのメッセージを暗号化します。
- AWS KMS カスタマーマスターキー(CMK)(AWS KMS Customer Master Key) ← mazon SQS は KMS CMK を使用して、データキー再利用期間中に複数の Amazon SQS メッセージの暗号化と復号用のデータキーを生成します。AWS KMS は、API アクションを使って初めて AWS KMS にアクセスするか、SSE を有効にしたキューに AWS 管理 CMK を割り当てるときに、自動的に AWS 管理 CMK を作成します。
- データキー再利用期間(Data Key Reuse Period) ← Amazon SQS がデータキーを再利用して、もう一度 KMS を呼び出す前にメッセージを暗号化または復号できる期間。この値は 1 分~24 時間の間である必要があります。
設定が完了したら「キューの作成」ボタンをクリックします。
下図のようにキューが作成されたことを確認します。
SQS 用ポリシーの作成
以下の「AmazonSQSFullAccess」を参考例として、先ほど作成した「Test_Queue_001.fifo」専用のポリシーを作成します。
新規ユーザーを作成して「AmazonSQSFullAccess」をそのまま割り当ててもいいですが、後程他のキューを作成した際にセキュリティ上問題が発生するため、「Test_Queue_001.fifo」専用のポリシーを作成することとします。
- Test_Queue_001.fifo の ARN ← arn:aws:sqs:ap-northeast-1:2xxxxxxxxxxx3:Test_Queue_001.fifo
【参考例】
■AmazonSQSFullAccess
{ |
【新規作成のポリシー】
■AmazonSQSTestQueue001FullAccess
{ |
AWS 管理コンソールより「サービス」-「セキュリティ、ID、およびコンプライアンス」-「IAM」をクリックします。
左側ペインより「ポリシー」をクリックします。
「ポリシーの作成」ボタンをクリックします。
下図のように「ビジュアルエディタ」タグよりぽしりーを作成します。
- サービス ← SQS を選択します。
- アクション ← すべて「*」を選択します。
- リソース ← 「指定」を選択して「ARN の追加」をクリックします。
「ARN の追加」画面が表示されるので下図のように「Region」「Account」「Queue name」を入力します。
入力すると「SQS_queue の ARN の指定」の欄に自動的に入力されるので「追加」ボタンをクリックします。
下図のように「ARN」が追加されるのを確認し「ポリシーの確認」ボタンをクリックします。
「ポリシーの確認」画面が表示されるので、下図のように「名前」と「説明」を入力し「ポリシーの作成」ボタンをクリックします。
下図のようにポリシーが作成されたメッセージが表示されることを確認します。
ユーザーを作成してポリシーをアタッチする
次に「ユーザー」を作成して、先ほど作成したポリシー「AmazonSQSTestQueue001FullAccess」をアタッチします。
IAM ダッシュボードの左側ペインより「ユーザー」をクリックします。
「ユーザーを追加」ボタンをクリックします。
「ユーザーを追加」画面で以下のように設定します。
ユーザー名 ← ユーザー名を設定します。
アクセスの種類 ← 「プログラムによるアクセス」を選択します。
設定したら「次のステップ:アクセス権限」ボタンをクリックします。
「アクセス許可の設定」で「既存のポリシーを直接アタッチ」をクリックします。
下図のように「ポリシーのフィルタ」の検索欄でポリシーを検索し、検索結果より作成したポリシーにチェックを入れます。
設定したら「次のステップ:タグ」ボタンをクリックします。
「タグの追加(オプション)」画面で必要ならタグを追加します。
設定したら「次のステップ:確認」ボタンをクリックします。
「確認」画面で設定内容を確認し「ユーザーの作成」ボタンをクリックします。
下図のように「成功」のメッセージが表示されていることを確認します。
「.csv のダウンロード」ボタンをクリックして「アクセスキー ID」と「シークレットアクセスキー」が記載されている csv ファイルをダウンロードして保存しておきます。
AWS CLI のインストール
デフォルトでは aws コマンドはインストールされていないのでインストールします。
過去の記事です。
【AWS】「EC2 インスタンス」または「パソコン」に AWS CLI(aws コマンド)及び jq コマンドをインストールする手順【Windows&Linux】
RedHat の AMI のデフォルトでは、以下のようにコマンドが見つからないというエラーになります。
[test@ip-172-31-32-10 ~]$ aws –version |
pip コマンドもインストールされていません。
[test@ip-172-31-32-10 ~]$ pip |
以下のコマンドで pip コマンドをインストールするスクリプト(get-pip.py)をダウンロードします。
[test@ip-172-31-32-10 ~]$ curl “https://bootstrap.pypa.io/get-pip.py” -o “get-pip.py” |
get-pip.py スクリプトをダウンロードしたら「sudo python get-pip.py」コマンドを実行して pip をインストールします。
[test@ip-172-31-32-10 ~]$ sudo python get-pip.py |
pip コマンドをインストールしたら、「sudo pip install awscli」コマンドを実行して AWS CLI をインストールします。
[test@ip-172-31-32-10 ~]$ sudo pip install awscli |
「aws –version」コマンドを実行して AWS CLI コマンドが正常にインストールされたことを確認します。
[test@ip-172-31-32-10 ~]$ aws –version |
変数の設定
AWS CLI をインストールしたら、変数の設定をします。
EC2 インスタンスから sqs コマンドを実行するために、以下の 4 つの項目を設定します。
- AWS Access Key ID [None]: Axxxxxxxxxxxxxxxx
- AWS Secret Access Key [None]: txxxxxxxxxxxxxxxxxxxxxxxx
- Default region name [None]: ap-northeast-1
- Default output format [None]: json
初めに「aws configure list」コマンドを実行して、設定が入っているかどうか確認します。
何も設定されていない場合は、以下のように「None」が表示されます。
[test@ip-172-31-32-10 ~]$ aws configure list |
「aws configure」コマンドを実行して設定を登録します。
[test@ip-172-31-32-10 ~]$ aws configure |
以下のようなコマンドでも確認できます。
[test@ip-172-31-32-10 ~]$ aws sqs get-queue-url –queue-name Test_Queue_001.fifo –output text |
SQS コマンドの実行確認
aws sqs コマンドを実行して「ユーザー」や「ポリシー」の設定が正しくされていることを確認します。
AWS 管理コンソール上で設定したキューが以下のように表示されれば正しく設定されています。
[test@ip-172-31-32-10 ~]$ aws sqs list-queues |
■キューの属性を取得するコマンド
[test@ip-172-31-32-10 ~]$ aws sqs get-queue-attributes –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxx/Test_Queue_001.fifo \ |
sqs コマンド
sqs コマンドを利用して SQS を AWS CLI から操作できます。
sqs コマンドは、以下の 4 つのコマンドグループで構成されています。
queue 関連 コマンド
- create-queue
- list-queues
- get-queue-url
- purge-queue
- list-dead-letter-source-queues
- delete-queue
queue-attributes 関連 コマンド
- get-queue-attributes
- set-queue-attributes
permission 関連 コマンド
- add-permission
- remove-permission
message 関連 コマンド
- send-message
- send-message-batch
- receive-message
- change-message-visibility
- change-message-visibility-batch
- delete-message delete-message-batch
メッセージの送信手順
FIFOの 場合は、MessageGroupId が必要です。
- –message-group-id ← メッセージグループ ID を指定します。
以下のように「aws sqs send-message」コマンドを実行します。
[test@ip-172-31-32-10 ~]$ aws sqs send-message –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxxx/Test_Queue_001.fifo –message-group-id ‘12345’ –message-body ‘test’ |
メッセージ数の確認手順
現在のメッセージ数を確認します。
[test@ip-172-31-32-10 ~]$ aws sqs get-queue-attributes –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxx/Test_Queue_001.fifo –attribute-names |
メッセージの受信手順
SQS のキューにあるメッセージを受信します。
メッセージの受信は「aws sqs receive-message」コマンドを使用します。
[test@ip-172-31-32-10 ~]$ aws sqs receive-message –queue-url https://ap-northea |
キューにあるメッセージ数の確認手順
最初にキューのメッセージ数を確認した時は「2」でした。
先ほどキューからメッセージを受信したので、現在のキューのメッセージ数を確認すると「1」になっていることが分かります。
[test@ip-172-31-32-10 ~]$ aws sqs get-queue-attributes –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxx/Test_Queue_001.fifo –attribute-names ApproximateNumberOfMessages |
しかし、しばらくするとキューのメッセージ数は「2」戻ります。
これはメッセージを受信すると、SQS の仕様で一旦「VisibilityTimeout」の時間だけキューから見えなくなります。(消えたわけではありません)
しかし「VisibilityTimeout」の時間を経過するとエンキュー(キューの中に入ること)されます。
[test@ip-172-31-32-10 ~]$ aws sqs get-queue-attributes –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxx/Test_Queue_001.fifo –attribute-names ApproximateNumberOfMessages |
「aws sqs get-queue-attributes」コマンドで「VisivilityTimeout」の時間を確認します。
以下、コマンド結果より「VisibilityTimeout」は「30秒」であることが分かります。
[test@ip-172-31-32-10 ~]$ aws sqs get-queue-attributes –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxx/Test_Queue_001.fifo \ |
キューに残っているメッセージの削除手順
「VisibilityTimeout」が経過すると、受信したメッセージは再度エンキューします。
しかし、このままではいつまでたってもキューに残り続けるので、キューに残っているメッセージを削除する必要があります。
まずは属性情報すべてを確認します。
[test@ip-172-31-32-10 ~]$ aws sqs get-queue-attributes –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxx/Test_Queue_001.fifo –attribute-names All |
まず初めにメッセージを受信します。
[test@ip-172-31-32-10 ~]$ aws sqs receive-message –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxx/Test_Queue_001.fifo |
「aws sqs delete-message」コマンドでメッセージを削除します。
コマンドが成功した場合は、返り値はありません。
[test@ip-172-31-32-10 ~]$ aws sqs delete-message –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxx/Test_Queue_001.fifo –receipt-handle “AQEB/5n8uHP7DxHG1yWhSVIQXm2Oul97JyG7ZBqGzTTfR9viJps5HBttUoqJbwSu3HpioHj8xy/XLUGBdBjC4sfv+Ia2UoaNi15NYlRHlDn41JwaRqjLyTu0qimFlb6GVXowaLlfXGyY6t/VpSWtoR/G6bOOAeLY+U1nnHwwd2ci6x9dAWa8tLN7GqnwsuE9xpdemAp2KXZQ1QOUrx01aYod7AIMx9lljuNYq1zkGOAukxPV7JUZvRXd3Hb5FkCFHdL8IDjvXTiq1gkwktgA1j8bp+Wf9bIvfATsAubivtMhKRQ=” |
現在のキューに残っているメッセージを確認します。
[test@ip-172-31-32-10 ~]$ aws sqs get-queue-attributes –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxx/Test_Queue_001.fifo –attribute-names All |
トラブルシューティング
設定や動作検証をしている際に経験したトラブルシューティングを解説します。
The queue should either have ContentBasedDeduplication enabled or MessageDeduplicationId provided explicitly
コマンドを実行した際に、以下のようにエラーが表示される場合です。
[test@ip-172-31-32-10 ~]$ aws sqs send-message –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxxxx/Test_Queue_001.fifo –message-group-id ‘12345’ –message-body ‘test’ |
An error occurred (InvalidParameterValue) when calling the SendMessage operation: The queue should either have ContentBasedDeduplication enabled or MessageDeduplicationId provided explicitly
↓ 日本語に訳すと以下のようになります。
SendMessageオペレーションを呼び出すときにエラーが発生しました(InvalidParameterValue):キューでContentBasedDeduplicationが有効になっているかMessageDeduplicationIdが明示的に指定されている
■対応方法
対象のキューを選択して「キュー操作」-「キューの設定」をクリックします。
「コンテンツに基づく重複排除」にチェックを入れて「設定の保存」ボタンをクリックします。
エラーが出力されることなくコマンドが実行されることを確認します。
[test@ip-172-31-32-10 ~]$ aws sqs send-message –queue-url https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxxxxx/Test_Queue_001.fifo –message-group-id ‘12345’ –message-body ‘test’ |
参考図書
Amazon SQS の解説が少ない中、この本は Amazon SQS の解説及び具体的な仕様手順を丁寧に解説しているので、大変役に立ちました。
Amazon SQS入門: AWS CLI入門シリーズ コマンドラインハンズオンで学習するAWS
コメント