

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Python 和 Amazon S3 管理大型 Amazon SQS 訊息 Amazon S3
<a name="extended-client-library-python"></a>

使用 Amazon SQS [Amazon SQS Extended Client Library for Python](https://github.com/awslabs/amazon-sqs-python-extended-client-lib/) 搭配 Amazon S3 來管理大型 Amazon SQS 訊息，特別是 256 KB 和 2 GB 之間的承載。程式庫會將訊息承載存放在 Amazon S3 儲存貯體中，並傳送訊息，其中包含對 Amazon SQS 佇列中存放物件的參考。

透過適用於 Python 的 Amazon SQS 擴充用戶端程式庫，您可以：
+ 指定承載是否一律存放在 Amazon S3 中，或只在承載大小超過 256 KB 時才存放在 Amazon S3 中 
+ 傳送參考存放在 Amazon S3 儲存貯體中的單一訊息物件的訊息 
+ 從 Amazon S3 儲存貯體擷取對應的承載物件 
+ 從 Amazon S3 儲存貯體刪除對應的承載物件

## 先決條件
<a name="extended-client-library-prerequisites"></a>

 以下是使用 Amazon SQS Extended Client Library for Python 的先決條件：
+ 具有必要登入資料的 AWS 帳戶。若要建立 AWS 帳戶，請導覽至[AWS 首頁](https://aws.amazon.com/) ，然後選擇**建立 AWS 帳戶** 。遵循指示。如需登入資料的資訊，請參閱[登入資料](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html)。
+ SDK AWS ：此頁面的範例使用 AWS Python SDK Boto3。若要安裝和設定 SDK，請參閱《適用於 [https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html) *AWS 開發人員指南》中的適用於 Python 的 SDK* 文件 
+ Python 3.x （或更新版本） 和 `pip`。
+  Amazon SQS Extended Client Library for Python，可從 [PyPI](https://pypi.org/project/amazon-sqs-extended-client/) 取得 

**注意**  
 您可以使用適用於 Python 的 Amazon SQS 延伸用戶端程式庫，僅搭配適用於 Python 的 AWS SDK 使用 Amazon S3 來管理 Amazon SQS 訊息。您無法使用 AWS CLI、Amazon SQS 主控台、Amazon SQS HTTP API 或任何其他 AWS SDKs 來執行此操作。

## 設定訊息儲存
<a name="configuring-message-storage-python"></a>

 Amazon SQS 延伸用戶端可讓 使用下列訊息屬性來設定 Amazon S3 訊息儲存選項：
+  `large_payload_support`：存放大型訊息的 Amazon S3 儲存貯體名稱。
+  `always_through_s3`：如果為 `True`，則所有訊息都會存放在 Amazon S3 中。如果 `False`，小於 256 KB 的訊息將不會序列化至 s3 儲存貯體。預設值為 `False`。
+  `use_legacy_attribute`：如果為 `True`，則所有發佈的訊息都會使用舊版預留訊息屬性 (`SQSLargePayloadSize`)，而不是目前的預留訊息屬性 (`ExtendedPayloadSize`)。

## 使用適用於 Python 的擴展用戶端程式庫管理大型 Amazon SQS 訊息
<a name="extended-client-library-python-code-example"></a>

 下列範例會建立具有隨機名稱的 Amazon S3 儲存貯體。然後，它會建立名為 的 Amazon SQS 佇列，`MyQueue`並將存放在 S3 儲存貯體且超過 256 KB 的訊息傳送至佇列。最後，程式碼會擷取該訊息，傳回訊息的相關資訊，接著刪除訊息、佇列和儲存貯體。

```
import boto3
import sqs_extended_client

#Set the Amazon SQS extended client configuration with large payload.
sqs_extended_client = boto3.client("sqs", region_name="us-east-1")
sqs_extended_client.large_payload_support = "amzn-s3-demo-bucket" 
sqs_extended_client.use_legacy_attribute = False


# Create an SQS message queue for this example. Then, extract the queue URL.
queue = sqs_extended_client.create_queue(
    QueueName = "MyQueue"
)
queue_url = sqs_extended_client.get_queue_url(
    QueueName = "MyQueue"
)['QueueUrl']


# Create the S3 bucket and allow message objects to be stored in the bucket. 
sqs_extended_client.s3_client.create_bucket(Bucket=sqs_extended_client.large_payload_support)

# Sending a large message
small_message = "s"
large_message = small_message * 300000 # Shall cross the limit of 256 KB

send_message_response = sqs_extended_client.send_message(
    QueueUrl=queue_url,
    MessageBody=large_message
)
assert send_message_response['ResponseMetadata']['HTTPStatusCode'] == 200

# Receiving the large message
receive_message_response = sqs_extended_client.receive_message(
    QueueUrl=queue_url,
    MessageAttributeNames=['All']
)
assert receive_message_response['Messages'][0]['Body'] == large_message
receipt_handle = receive_message_response['Messages'][0]['ReceiptHandle']

# Deleting the large message
# Set to True for deleting the payload from S3
sqs_extended_client.delete_payload_from_s3 = True 
delete_message_response = sqs_extended_client.delete_message(
    QueueUrl=queue_url,
    ReceiptHandle=receipt_handle
)

assert delete_message_response['ResponseMetadata']['HTTPStatusCode'] == 200

# Deleting the queue
delete_queue_response = sqs_extended_client.delete_queue(
    QueueUrl=queue_url
)

assert delete_queue_response['ResponseMetadata']['HTTPStatusCode'] == 200
```