AWS SQSへのメッセージ送信

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

SQS( Simple Queue Service )は完全マネージドのメッセージキューイングサービス。

各システム間でのメッセージ伝達に利用します。

データベースが情報の記録を目的としたものだとしたら、キューサービスはメッセージの配送を目的とする。

尚、SQSの標準キューはベストエフォートで処理されており、キューの配送の順序保証、重複配信の制御保証は行っていないので、配送先での処理で管理する必要がある。

順序保証、重複配信の制御保証をマネージドサービス側で行う場合は、FIFOキューとしてサービス側でキューを作成する。


作成したQueueの基本要素

  • queue-name: バッファリングするスペースを指す。SQSでキュー作成時に指定する。
  • message-body: プッシュされたキューの名称。タイトルのようなもの。
  • message-attributes: プッシュされたキューの構成要素。bodyがkeyだとしたらattributesはkeyが指すobject

bodyとattributesは

{"message-body":{ "attr1": "value1", "attr2": "valuie2" }}

のような関係。実際はattributesは予約されたキーを指定する必要がある。


AWS CLIからの操作


キューURLの確認
$ aws sqs get-queue-url --queue-name YOUR_QUEUE_NAME
{
    "QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/.../YOUR_QUEUE_NAME"
}


バッファ中のキュー数の確認
$ aws sqs get-queue-attributes --queue-url https://sqs.ap-northeast-1.amazonaws.com/.../YOUR_QUEUE_NAME --attribute-names ApproximateNumberOfMessages
{
    "Attributes": {
        "ApproximateNumberOfMessages": "11"
    }
}


キューのPUSH

message-attributesは以下のようにDataTypeStringValue(属性として持つ値)を使用して設定を行います。

$ aws sqs send-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/.../YOUR_QUEUE_NAME --message-body "Message From AWS CLI" --message-attributes '{"attr1":{"DataType":"String", "StringValue":"value of attr1"}}'

send-message — AWS CLI 1.18.74 Command Reference


Python Lambda関数からのQueue送信

boto3を使ったPython Lambda関数での、SQSメッセージ送信の例。

import boto3

def lambda_handler(event, context):
  sqs = boto3.resource('sqs')
  queue = sqs.get_queue_by_name(QueueName="your_queue_name")
  sqsresponse =queue.send_message(
    MessageBody="specify_message_body",
    MessageAttributes={
        'attr1': {
            'DataType': 'String',
            'StringValue': "value of attr1"
        },
        'attr2': {
            'DataType': 'String',
            'StringValue': "value of attr2"
        },
        'attr3': {
            'DataType': 'String',
            'StringValue': "value of attr3"
        }
    }
)