Amazon SNS Extended Client Library for Python - Amazon Simple Notification Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon SNS Extended Client Library for Python

前提条件

Amazon SNS Extended Client Library for Python を使用するための前提条件を次に示します。

  • AWS SDK。

    このページの例では、 AWS Python SDK Boto3 を使用しています。をインストールしてセットアップするにはSDK、AWS SDKPython のドキュメントの「」を参照してください。

  • 適切な認証情報 AWS アカウント を持つ 。

    を作成するには AWS アカウント、AWS ホームページ に移動し、アカウントの作成 AWS を選択します。手順に従います。

    認証情報の詳細については、 AWS SDK for Python デベロッパーガイド「認証情報」を参照してください。

  • Python 3.x (または以降) および pip。

  • Amazon SNS Extended Client Library for Python (PyPIからも入手可能)。

メッセージストレージの設定

以下の属性は、Amazon Amazon S33 メッセージストレージオプションを設定する Boto3 Amazon SNS Client トピック 、および PlatformEndpoint オブジェクトで使用できます。

  • large_payload_support - サイズの大きいメッセージを保存する Amazon S3 バケットの名前。

  • message_size_threshold - メッセージを大きなメッセージバケットに保存するためのしきい値。0 未満または 262144 を超える値を指定することはできません。デフォルトは 262144 です。

  • always_through_s3 - True の場合、すべてのメッセージは Amazon S3 に保存されます。デフォルト: False

  • s3 - Amazon S3 にオブジェクトを保存するために使用する Boto3 Amazon S3 の resource オブジェクト。Amazon S3 リソース (Amazon S3 カスタム設定や認証情報など) を制御する場合に使用します。初回使用時に設定しない場合、デフォルトは boto3.resource("s3") です。

例: Amazon S3 に保存されているペイロードSNSを使用して Amazon にメッセージを発行する Amazon S3

次のコードサンプルは、以下の操作方法を示しています。

  • Amazon SNSトピックと Amazon SQSキューのサンプルを作成します。

  • トピックからメッセージを受信するためにキューをサブスクライブします。

  • テストメッセージを発行します。

  • メッセージペイロードは Amazon S3 に保存され、その参照が発行されます。

  • キューから発行したメッセージと、Amazon S3 から取得した元のメッセージを印刷します。

大きなメッセージを公開するには、Amazon SNS Extended Client Library for Python を使用します。送信するメッセージは、実際のメッセージコンテンツが含まれている Amazon S3 オブジェクトを参照します。

import boto3 import sns_extended_client from json import loads s3_extended_payload_bucket = "extended-client-bucket-store" TOPIC_NAME = "TOPIC-NAME" QUEUE_NAME = "QUEUE-NAME" # Create an helper to fetch message from S3 def get_msg_from_s3(body): json_msg = loads(body) s3_client = boto3.client("s3") s3_object = s3_client.get_object( Bucket=json_msg[1].get("s3BucketName"), Key=json_msg[1].get("s3Key") ) msg = s3_object.get("Body").read().decode() return msg # Create an helper to fetch and print message SQS queue and S3 def fetch_and_print_from_sqs(sqs, queue_url): """Handy Helper to fetch and print message from SQS queue and S3""" message = sqs.receive_message( QueueUrl=queue_url, MessageAttributeNames=["All"], MaxNumberOfMessages=1 ).get("Messages")[0] message_body = message.get("Body") print("Published Message: {}".format(message_body)) print("Message Stored in S3 Bucket is: {}\n".format(get_msg_from_s3(message_body))) # Initialize the SNS client and create SNS Topic sns_extended_client = boto3.client("sns", region_name="us-east-1") create_topic_response = sns_extended_client.create_topic(Name=TOPIC_NAME) demo_topic_arn = create_topic_response.get("TopicArn") # Create and subscribe an SQS queue to the SNS client sqs = boto3.client("sqs") demo_queue_url = sqs.create_queue(QueueName=QUEUE_NAME).get("QueueUrl") demo_queue_arn = sqs.get_queue_attributes(QueueUrl=demo_queue_url, AttributeNames=["QueueArn"])["Attributes"].get("QueueArn") # Set the RawMessageDelivery subscription attribute to TRUE sns_extended_client.subscribe(TopicArn=demo_topic_arn, Protocol="sqs", Endpoint=demo_queue_arn, Attributes={"RawMessageDelivery":"true"}) sns_extended_client.large_payload_support = s3_extended_payload_bucket # To store all messages content in S3, set always_through_s3 to True # In the example, we set message size threshold as 32 bytes, adjust this threshold as per your usecase # Message will only be uploaded to S3 when its payload size exceeded threshold sns_extended_client.message_size_threshold = 32 sns_extended_client.publish( TopicArn=demo_topic_arn, Message="This message should be published to S3 as it exceeds the message_size_threshold limit", ) # Print message stored in s3 fetch_and_print_from_sqs(sqs, demo_queue_url)

出力

Published Message: [ "software.amazon.payloadoffloading.PayloadS3Pointer", { "s3BucketName": "extended-client-bucket-store", "s3Key": "xxxx-xxxxx-xxxxx-xxxxxx" } ] Message Stored in S3 Bucket is: This message should be published to S3 as it exceeds the message_size_threshold limit