Biblioteca do cliente em versão ampliada para Python
Tópicos
Pré-requisitos
Veja a seguir os pré-requisitos para usar a Biblioteca do cliente em versão ampliada para Python do Amazon SNS
-
Um AWS SDK.
O exemplo nesta página usa o AWS Python SDK Boto3. Para instalar e configurar o SDK, consulte a documentação do AWSSDK para Python
. -
Uma Conta da AWS com as credenciais apropriadas.
Para criar uma Conta da AWS, acesse a página inicial da AWS
e escolha Criar uma conta da AWS. Siga as instruções. Para obter informações sobre credenciais, consulte Credenciais
no Guia do desenvolvedor do AWS SDK para Python. -
Python 3.x (ou posterior) e pip.
-
A Biblioteca do cliente em versão ampliada para Python (também disponível no PyPI
).
Configurar o armazenamento de mensagens
Os atributos abaixo estão disponíveis nos objetos Client
-
large_payload_support
: o nome do bucket do Amazon S3 para armazenar mensagens grandes. -
message_size_threshold
: o limite para armazenar a mensagem no bucket de mensagens grandes. Deve estar entre 0 e 262144. O padrão é 262144. -
always_through_s3
: seTrue
, então todas as mensagens serão armazenadas no Amazon S3. O padrão éFalse
. -
s3
: o objetoresource
do Amazon S3 do Boto3 usado para armazenar objetos no Amazon S3. Use isso se quiser controlar o recurso do Amazon S3 (por exemplo, uma configuração ou credenciais personalizadas do Amazon S3). Se não tiver sido definido anteriormente na primeira utilização, o padrão seráboto3.resource("s3")
.
Exemplo: publicação de mensagens no Amazon SNS com a carga útil armazenada no Amazon S3
O exemplo de código a seguir mostra como:
-
Crie um exemplo de tópico do Amazon SNS e uma fila do Amazon SQS.
-
Inscrever a fila para receber mensagens do tópico.
-
Publicar uma mensagem de teste.
-
A carga útil da mensagem é armazenada no Amazon S3 e a referência a ela é publicada.
-
Imprima a mensagem publicada da fila junto com a mensagem original recuperada do Amazon S3.
Para publicar uma mensagem grande, use a Biblioteca do cliente em versão ampliada para Python. A mensagem que você envia faz referência a um objeto do Amazon S3 que contém o conteúdo real da mensagem.
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)
Saída
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