

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Penerbitan pesan large dengan Amazon SNS dan Amazon S3
<a name="large-message-payloads"></a>

Untuk mempublikasikan pesan Amazon SNS yang besar, Anda dapat menggunakan Amazon [SNS Extended Client Library for Java, atau [Amazon SNS](https://github.com/awslabs/amazon-sns-python-extended-client-lib) Extended Client Library untuk](https://github.com/awslabs/amazon-sns-java-extended-client-lib/) Python. Pustaka ini berguna untuk pesan yang lebih besar dari maksimum 256 KB saat ini, dengan maksimum 2 GB. Kedua pustaka menyimpan muatan aktual ke bucket Amazon S3, dan mempublikasikan referensi objek Amazon S3 yang disimpan ke topik Amazon SNS. Berlangganan Amazon SQS antrian dapat menggunakan [Amazon SQS Extended Client Library for Java](https://github.com/awslabs/amazon-sqs-java-extended-client-lib) untuk menghilangkan referensi dan mengambil muatan dari Amazon S3. Endpoint lain seperti Lambda dapat menggunakan [Payload Offloading Java Common Library AWS](https://github.com/awslabs/payload-offloading-java-common-lib-for-aws) untuk de-referensi dan mengambil payload.

**catatan**  
Amazon SNS Extended Client Libraries kompatibel dengan topik standar dan FIFO.

# Amazon SNS Extended Client Library untuk Java
<a name="extended-client-library-java"></a>

## Prasyarat
<a name="prereqs-sns-extended-client-library"></a>

Berikut ini adalah prasyarat untuk menggunakan [Amazon SNS Extended Client Library for Java](https://github.com/awslabs/amazon-sns-java-extended-client-lib):
+ Sebuah AWS SDK. Contoh pada halaman ini menggunakan AWS Java SDK. Untuk menginstal dan menyiapkan SDK, lihat [Mengatur AWS SDK for](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-install.html) Java di Panduan *AWS SDK untuk Java Pengembang*.
+ An Akun AWS dengan kredensi yang tepat. Untuk membuat Akun AWS, navigasikan ke [AWS halaman](https://aws.amazon.com/) beranda, lalu pilih **Buat AWS Akun**. Ikuti petunjuk online.

  *Untuk informasi tentang kredensional, lihat [Menyiapkan AWS Kredensial dan Wilayah untuk Pengembangan](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-credentials.html) di Panduan Pengembang.AWS SDK untuk Java *
+ Java 8 atau lebih baik. 
+ Amazon SNS Extended Client Library untuk Java (juga tersedia dari [Maven](https://maven.apache.org/)). 

## Mengkonfigurasi penyimpanan pesan
<a name="large-message-configure-storage"></a>

Library Amazon SNS Extended Client menggunakan Payload Offloading Java Common Library AWS untuk penyimpanan dan pengambilan pesan. Anda dapat mengkonfigurasi Amazon S3 berikut [opsi penyimpanan pesan](https://github.com/awslabs/amazon-sns-java-extended-client-lib/blob/main/src/main/java/software/amazon/sns/SNSExtendedClientConfiguration.java):
+ **Ambang batas ukuran pesan khusus** - Pesan dengan muatan dan atribut yang melebihi ukuran ini disimpan secara otomatis di Amazon S3.
+ **`alwaysThroughS3`flag** - Tetapkan nilai ini `true` untuk memaksa semua muatan pesan disimpan di Amazon S3. Sebagai contoh:

  ```
  SNSExtendedClientConfiguration snsExtendedClientConfiguration = new
  SNSExtendedClientConfiguration() .withPayloadSupportEnabled(s3Client, BUCKET_NAME).withAlwaysThroughS3(true);
  ```
+ Kunci **KMS kustom — Kunci** yang digunakan untuk enkripsi sisi server di bucket Amazon S3 Anda.
+ **Nama bucket** — Nama bucket Amazon S3 untuk menyimpan muatan pesan. 

## Contoh: Penerbitan pesan ke Amazon SNS dengan muatan yang disimpan di Amazon S3
<a name="example-s3-large-payloads"></a>

Contoh kode berikut ini menunjukkan cara untuk melakukan:
+ Buat contoh topik dan antrean.
+ Berlangganan antrean untuk menerima pesan dari topik.
+ Publikasikan pesan percobaan.

Muatan pesan disimpan di Amazon S3 dan referensi untuk diterbitkan. Amazon SQS Extended Client digunakan untuk menerima pesan.

**SDK for Java 1.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di [Repositori Contoh Kode AWS](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/java/example_code/sns#code-examples). 
Untuk mempublikasikan pesan besar, gunakan Amazon SNS Extended Client Library for Java. Pesan yang Anda kirim mereferensikan objek Amazon S3 yang berisi konten pesan yang sebenarnya.  

```
import com.amazon.sqs.javamessaging.AmazonSQSExtendedClient;
import com.amazon.sqs.javamessaging.ExtendedClientConfiguration;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClientBuilder;
import com.amazonaws.services.sns.model.CreateTopicRequest;
import com.amazonaws.services.sns.model.PublishRequest;
import com.amazonaws.services.sns.model.SetSubscriptionAttributesRequest;
import com.amazonaws.services.sns.util.Topics;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.CreateQueueRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageResult;
import software.amazon.sns.AmazonSNSExtendedClient;
import software.amazon.sns.SNSExtendedClientConfiguration;

public class Example {

        public static void main(String[] args) {
                final String BUCKET_NAME = "extended-client-bucket";
                final String TOPIC_NAME = "extended-client-topic";
                final String QUEUE_NAME = "extended-client-queue";
                final Regions region = Regions.DEFAULT_REGION;

                // Message threshold controls the maximum message size that will be allowed to
                // be published
                // through SNS using the extended client. Payload of messages exceeding this
                // value will be stored in
                // S3. The default value of this parameter is 256 KB which is the maximum
                // message size in SNS (and SQS).
                final int EXTENDED_STORAGE_MESSAGE_SIZE_THRESHOLD = 32;

                // Initialize SNS, SQS and S3 clients
                final AmazonSNS snsClient = AmazonSNSClientBuilder.standard().withRegion(region).build();
                final AmazonSQS sqsClient = AmazonSQSClientBuilder.standard().withRegion(region).build();
                final AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(region).build();

                // Create bucket, topic, queue and subscription
                s3Client.createBucket(BUCKET_NAME);
                final String topicArn = snsClient.createTopic(
                                new CreateTopicRequest().withName(TOPIC_NAME)).getTopicArn();
                final String queueUrl = sqsClient.createQueue(
                                new CreateQueueRequest().withQueueName(QUEUE_NAME)).getQueueUrl();
                final String subscriptionArn = Topics.subscribeQueue(
                                snsClient, sqsClient, topicArn, queueUrl);

                // To read message content stored in S3 transparently through SQS extended
                // client,
                // set the RawMessageDelivery subscription attribute to TRUE
                final SetSubscriptionAttributesRequest subscriptionAttributesRequest = new SetSubscriptionAttributesRequest();
                subscriptionAttributesRequest.setSubscriptionArn(subscriptionArn);
                subscriptionAttributesRequest.setAttributeName("RawMessageDelivery");
                subscriptionAttributesRequest.setAttributeValue("TRUE");
                snsClient.setSubscriptionAttributes(subscriptionAttributesRequest);

                // Initialize SNS extended client
                // PayloadSizeThreshold triggers message content storage in S3 when the
                // threshold is exceeded
                // To store all messages content in S3, use AlwaysThroughS3 flag
                final SNSExtendedClientConfiguration snsExtendedClientConfiguration = new SNSExtendedClientConfiguration()
                                .withPayloadSupportEnabled(s3Client, BUCKET_NAME)
                                .withPayloadSizeThreshold(EXTENDED_STORAGE_MESSAGE_SIZE_THRESHOLD);
                final AmazonSNSExtendedClient snsExtendedClient = new AmazonSNSExtendedClient(snsClient,
                                snsExtendedClientConfiguration);

                // Publish message via SNS with storage in S3
                final String message = "This message is stored in S3 as it exceeds the threshold of 32 bytes set above.";
                snsExtendedClient.publish(topicArn, message);

                // Initialize SQS extended client
                final ExtendedClientConfiguration sqsExtendedClientConfiguration = new ExtendedClientConfiguration()
                                .withPayloadSupportEnabled(s3Client, BUCKET_NAME);
                final AmazonSQSExtendedClient sqsExtendedClient = new AmazonSQSExtendedClient(sqsClient,
                                sqsExtendedClientConfiguration);

                // Read the message from the queue
                final ReceiveMessageResult result = sqsExtendedClient.receiveMessage(queueUrl);
                System.out.println("Received message is " + result.getMessages().get(0).getBody());
        }
}
```

## Protokol titik akhir lainnya
<a name="large-payloads-other-protocols"></a>

Kedua perpustakaan Amazon SNS dan Amazon SQS menggunakan [Muatan Pembongkar Java Common Library untuk AWS](https://github.com/awslabs/payload-offloading-java-common-lib-for-aws) untuk menyimpan dan mengambil muatan pesan dengan Amazon S3. Titik akhir Java diaktifkan (misalnya, titik akhir HTTPS yang diterapkan di Java) dapat menggunakan perpustakaan yang sama untuk menghilangkan referensi isi pesan.

Titik akhir yang tidak dapat menggunakan Payload Offloading Java Common Library untuk masih AWS dapat mempublikasikan pesan dengan muatan yang disimpan di Amazon S3. Berikut ini adalah contoh dari referensi Amazon S3 yang diterbitkan oleh contoh kode di atas:

```
[
  "software.amazon.payloadoffloading.PayloadS3Pointer",
  {
    "s3BucketName": "extended-client-bucket",
    "s3Key": "xxxx-xxxxx-xxxxx-xxxxxx"
  }
]
```

# Perpustakaan Klien Diperpanjang Amazon SNS untuk Python
<a name="extended-client-library-python"></a>

## Prasyarat
<a name="prereqs-sns-extended-client-library-python"></a>

Berikut ini adalah prasyarat untuk menggunakan [Amazon SNS Extended](https://github.com/awslabs/amazon-sns-python-extended-client-lib) Client Library untuk Python:
+ Sebuah AWS SDK. Contoh pada halaman ini menggunakan AWS Python SDK Boto3. Untuk menginstal dan mengatur SDK, lihat dokumentasi [https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html).
+ An Akun AWS dengan kredensi yang tepat. Untuk membuat Akun AWS, navigasikan ke [AWS halaman](https://aws.amazon.com/) beranda, lalu pilih **Buat AWS Akun**. Ikuti petunjuk online.

  Untuk informasi tentang kredensional, lihat [Kredensial](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html) di SDK *AWS for* Python Developer Guide.
+ Python 3.x (atau yang lebih baru) dan pip.
+ [Amazon SNS Extended Client Library untuk Python (juga tersedia dari PyPI).](https://pypi.org/project/amazon-sns-extended-client/) 

## Mengkonfigurasi penyimpanan pesan
<a name="large-message-configure-storage-python"></a>

Atribut di bawah ini tersedia di Klien[, Topik, [PlatformEndpoint](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sns/platformendpoint/index.html)](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sns/topic/index.html)dan objek Amazon [SNS](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sns.html#client) Boto3 untuk mengonfigurasi opsi penyimpanan pesan Amazon S3.
+ **`large_payload_support`**- Nama bucket Amazon S3 yang akan menyimpan pesan besar.
+ **`use_legacy_attribute`**— Jika`True`, maka semua pesan yang diterbitkan menggunakan atribut pesan cadangan Legacy (`SQSLargePayloadSize`) alih-alih atribut pesan cadangan saat ini (`ExtendedPayloadSize`).
+ **`message_size_threshold`**— Ambang batas untuk menyimpan pesan di ember pesan besar. Tidak boleh kurang dari`0`, atau lebih besar dari`262144`. Nilai default-nya `262144`.
+ **`always_through_s3`**— Jika`True`, maka semua pesan disimpan di Amazon S3. Nilai default-nya `False`.
+ **`s3_client`**— Objek Boto3 Amazon `client` S3 yang digunakan untuk menyimpan objek ke Amazon S3. Gunakan ini jika Anda ingin mengontrol klien Amazon S3 (misalnya, konfigurasi atau kredenal Amazon S3 kustom). Default `boto3.client("s3")` pada penggunaan pertama jika tidak disetel sebelumnya.

## Contoh: Menerbitkan pesan ke Amazon SNS dengan muatan yang disimpan di Amazon S3
<a name="example-s3-large-payloads-python"></a>

Contoh kode berikut ini menunjukkan cara untuk melakukan:
+ Buat contoh topik Amazon SNS dan antrean Amazon SQS.
+ Lampirkan kebijakan ke antrean Amazon SQS untuk menerima pesan dari topik Amazon SNS.
+ Berlangganan antrean untuk menerima pesan dari topik.
+ Publikasikan pesan pengujian menggunakan klien yang diperluas Amazon SNS, sumber daya Topik, dan PlatformEndpoint sumber daya.
+ Payload pesan disimpan di Amazon S3, dan referensi untuk itu diterbitkan.
+ Cetak pesan yang diterbitkan dari antrian bersama dengan pesan asli yang diambil dari Amazon S3.

Untuk mempublikasikan pesan besar, gunakan Amazon SNS Extended Client Library untuk Python. Pesan yang Anda kirim mereferensikan objek Amazon S3 yang berisi konten pesan yang sebenarnya.

```
import boto3
from sns_extended_client import SNSExtendedClientSession
from json import loads

s3_extended_payload_bucket = "extended-client-bucket-store"  # S3 bucket with the given bucket name is a resource which is created and accessible with the given AWS credentials
TOPIC_NAME = "---TOPIC-NAME---"
QUEUE_NAME = "---QUEUE-NAME---"

def allow_sns_to_write_to_sqs(topicarn, queuearn):
    policy_document = """{{
        "Version": "2012-10-17",		 	 	 
        "Statement":[
            {{
            "Sid":"MyPolicy",
            "Effect":"Allow",
            "Principal" : {{"AWS" : "*"}},
            "Action":"SQS:SendMessage",
            "Resource": "{}",
            "Condition":{{
                "ArnEquals":{{
                "aws:SourceArn": "{}"
                }}
            }}
            }}
        ]
        }}""".format(queuearn, topicarn)

    return policy_document

def get_msg_from_s3(body,sns_extended_client):
    """Handy Helper to fetch message from S3"""
    json_msg = loads(body)
    s3_object = sns_extended_client.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


def fetch_and_print_from_sqs(sqs, queue_url,sns_extended_client):
    sqs_msg = sqs.receive_message(
        QueueUrl=queue_url,
        AttributeNames=['All'],
        MessageAttributeNames=['All'],
        VisibilityTimeout=0,
        WaitTimeSeconds=0,
        MaxNumberOfMessages=1
    ).get("Messages")[0]
    
    message_body = sqs_msg.get("Body")
    print("Published Message: {}".format(message_body))
    print("Message Stored in S3 Bucket is: {}\n".format(get_msg_from_s3(message_body,sns_extended_client)))

    # Delete the Processed Message
    sqs.delete_message(
        QueueUrl=queue_url,
        ReceiptHandle=sqs_msg['ReceiptHandle']
    )


sns_extended_client = boto3.client("sns", region_name="us-east-1")
create_topic_response = sns_extended_client.create_topic(Name=TOPIC_NAME)
sns_topic_arn = create_topic_response.get("TopicArn")

# create and subscribe an sqs queue to the sns client
sqs = boto3.client("sqs",region_name="us-east-1")
demo_queue_url = sqs.create_queue(QueueName=QUEUE_NAME).get("QueueUrl")
sqs_queue_arn = sqs.get_queue_attributes(
    QueueUrl=demo_queue_url, AttributeNames=["QueueArn"]
)["Attributes"].get("QueueArn")

# Adding policy to SQS queue such that SNS topic can send msg to SQS queue
policy_json = allow_sns_to_write_to_sqs(sns_topic_arn, sqs_queue_arn)
response = sqs.set_queue_attributes(
    QueueUrl = demo_queue_url,
    Attributes = {
        'Policy' : policy_json
    }
)

# Set the RawMessageDelivery subscription attribute to TRUE if you want to use
# SQSExtendedClient to help with retrieving msg from S3
sns_extended_client.subscribe(TopicArn=sns_topic_arn, Protocol="sqs", 
Endpoint=sqs_queue_arn
, Attributes={"RawMessageDelivery":"true"}
)

sns_extended_client.large_payload_support = s3_extended_payload_bucket

# Change default s3_client attribute of sns_extended_client to use 'us-east-1' region
sns_extended_client.s3_client = boto3.client("s3", region_name="us-east-1")


# Below is the example that all the messages will be sent to the S3 bucket
sns_extended_client.always_through_s3 = True
sns_extended_client.publish(
    TopicArn=sns_topic_arn, Message="This message should be published to S3"
)
print("\n\nPublished using SNS extended client:")
fetch_and_print_from_sqs(sqs, demo_queue_url,sns_extended_client)  # Prints message stored in s3

# Below is the example that all the messages larger than 32 bytes will be sent to the S3 bucket
print("\nUsing decreased message size threshold:")

sns_extended_client.always_through_s3 = False
sns_extended_client.message_size_threshold = 32
sns_extended_client.publish(
    TopicArn=sns_topic_arn,
    Message="This message should be published to S3 as it exceeds the limit of the 32 bytes",
)

fetch_and_print_from_sqs(sqs, demo_queue_url,sns_extended_client)  # Prints message stored in s3


# Below is the example to publish message using the SNS.Topic resource
sns_extended_client_resource = SNSExtendedClientSession().resource(
    "sns", region_name="us-east-1"
)

topic = sns_extended_client_resource.Topic(sns_topic_arn)
topic.large_payload_support = s3_extended_payload_bucket

# Change default s3_client attribute of topic to use 'us-east-1' region
topic.s3_client = boto3.client("s3", region_name="us-east-1")

topic.always_through_s3 = True
# Can Set custom S3 Keys to be used to store objects in S3
topic.publish(
    Message="This message should be published to S3 using the topic resource",
    MessageAttributes={
        "S3Key": {
            "DataType": "String",
            "StringValue": "347c11c4-a22c-42e4-a6a2-9b5af5b76587",
        }
    },
)
print("\nPublished using Topic Resource:")
fetch_and_print_from_sqs(sqs, demo_queue_url,topic)

# Below is the example to publish message using the SNS.PlatformEndpoint resource
sns_extended_client_resource = SNSExtendedClientSession().resource(
    "sns", region_name="us-east-1"
)

platform_endpoint = sns_extended_client_resource.PlatformEndpoint(sns_topic_arn)
platform_endpoint.large_payload_support = s3_extended_payload_bucket

# Change default s3_client attribute of platform_endpoint to use 'us-east-1' region
platform_endpoint.s3_client = boto3.client("s3", region_name="us-east-1")

platform_endpoint.always_through_s3 = True
# Can Set custom S3 Keys to be used to store objects in S3
platform_endpoint.publish(
    Message="This message should be published to S3 using the PlatformEndpoint resource",
    MessageAttributes={
        "S3Key": {
            "DataType": "String",
            "StringValue": "247c11c4-a22c-42e4-a6a2-9b5af5b76587",
        }
    },
)
print("\nPublished using PlatformEndpoint Resource:")
fetch_and_print_from_sqs(sqs, demo_queue_url,platform_endpoint)
```

**Keluaran**

```
Published using SNS extended client:
Published Message: ["software.amazon.payloadoffloading.PayloadS3Pointer", {"s3BucketName": "extended-client-bucket-store", "s3Key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}]
Message Stored in S3 Bucket is: This message should be published to S3

Using decreased message size threshold:
Published Message: ["software.amazon.payloadoffloading.PayloadS3Pointer", {"s3BucketName": "extended-client-bucket-store", "s3Key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}]
Message Stored in S3 Bucket is: This message should be published to S3 as it exceeds the limit of the 32 bytes

Published using Topic Resource:
Published Message: ["software.amazon.payloadoffloading.PayloadS3Pointer", {"s3BucketName": "extended-client-bucket-store", "s3Key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}]
Message Stored in S3 Bucket is: This message should be published to S3 using the topic resource

Published using PlatformEndpoint Resource:
Published Message: ["software.amazon.payloadoffloading.PayloadS3Pointer", {"s3BucketName": "extended-client-bucket-store", "s3Key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}]
Message Stored in S3 Bucket is: This message should be published to S3 using the PlatformEndpoint resource
```