Biblioteca de clientes ampliada de Amazon SNS para Python - Amazon Simple Notification Service

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Biblioteca de clientes ampliada de Amazon SNS para Python

Requisitos previos

A continuación, se indican los requisitos previos para utilizar la biblioteca de clientes ampliada de Amazon SNS para Python:

  • Un AWS SDK.

    El ejemplo de esta página usa AWS Python SDK Boto3. Para instalar y configurar el SDK, consulte la documentación del SDK de AWS para Python.

  • Y Cuenta de AWS con las credenciales adecuadas.

    Para crear una Cuenta de AWS, vaya a la página de AWS inicio y, a continuación, seleccione Crear una AWS cuenta. Siga las instrucciones.

    Para obtener información sobre las credenciales, consulte Credenciales en la Guía para desarrolladores del SDK de AWS para Python.

  • Python 3.x (o posterior) y pip.

  • La biblioteca de clientes ampliada de Amazon SNS para Python (también disponible en PyPI).

Configuración del almacenamiento de mensajes

Los siguientes atributos están disponibles en el cliente, tema PlatformEndpointy objetos de Amazon SNS de Boto3 para configurar las opciones de almacenamiento de mensajes de Amazon S3.

  • large_payload_support: el nombre del bucket de Amazon S3 para almacenar los mensajes de gran tamaño.

  • message_size_threshold: el umbral para almacenar el mensaje en el bucket de mensajes de gran tamaño. No puede ser inferior a 0, ni superior a 262 144. El valor predeterminado es 262 144.

  • always_through_s3: si True, todos los mensajes se almacenan en Amazon S3. El valor predeterminado es False.

  • s3: el objeto resource de Amazon S3 de Boto3 que se utiliza para almacenar objetos en Amazon S3. Se usa para controlar el recurso de Amazon S3 (por ejemplo, una configuración o credenciales personalizadas de Amazon S3). Si no se estableció previamente al utilizarlo por primera vez, el valor predeterminado es boto3.resource("s3").

Ejemplo: publicación de mensajes en Amazon SNS con carga almacenada en Amazon S3

En el siguiente ejemplo de código, se muestra cómo:

  • Cree un tema de Amazon SNS y una cola de Amazon SQS de ejemplo.

  • Suscriba la cola para recibir mensajes del tema.

  • Publique un mensaje de prueba.

  • La carga del mensaje se almacena en Amazon S3 y se publica la referencia a ella.

  • Imprima el mensaje publicado de la cola junto con el mensaje original recuperado de Amazon S3.

Para publicar mensajes grandes, utilice la biblioteca de clientes ampliada de Amazon SNS para Python. El mensaje que envía hace referencia a un objeto de Amazon S3 en el que se incluye el contenido real del mensaje.

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)

Salida

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