AWS code-library documentation change
Summary
Added code example demonstrating Amazon SQS Extended Client Library usage for large messages with S3 integration
Security assessment
The change documents secure handling of large messages via S3 integration, including automatic lifecycle management for S3 objects (expiration rules). While this implements security best practices for data lifecycle management, there's no evidence of addressing a specific vulnerability.
Diff
diff --git a/code-library/latest/ug/java_2_sqs_code_examples.md b/code-library/latest/ug/java_2_sqs_code_examples.md index 0960f4dbc..0f204c772 100644 --- a//code-library/latest/ug/java_2_sqs_code_examples.md +++ b//code-library/latest/ug/java_2_sqs_code_examples.md @@ -917,0 +918,159 @@ For complete source code and instructions on how to set up and run, see the full +The following code example shows how to use the Amazon SQS Extended Client Library to work with large Amazon SQS messages. + +**SDK for Java 2.x** + + +###### Note + +There's more on GitHub. Find the complete example and learn how to set up and run in the [AWS Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sqs#code-examples). + + + import com.amazon.sqs.javamessaging.AmazonSQSExtendedClient; + import com.amazon.sqs.javamessaging.ExtendedClientConfiguration; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + import org.joda.time.DateTime; + import org.joda.time.format.DateTimeFormat; + import software.amazon.awssdk.services.s3.S3Client; + import software.amazon.awssdk.services.s3.model.BucketLifecycleConfiguration; + import software.amazon.awssdk.services.s3.model.CreateBucketRequest; + import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; + import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; + import software.amazon.awssdk.services.s3.model.ExpirationStatus; + import software.amazon.awssdk.services.s3.model.LifecycleExpiration; + import software.amazon.awssdk.services.s3.model.LifecycleRule; + import software.amazon.awssdk.services.s3.model.LifecycleRuleFilter; + import software.amazon.awssdk.services.s3.model.ListObjectVersionsRequest; + import software.amazon.awssdk.services.s3.model.ListObjectVersionsResponse; + import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; + import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; + import software.amazon.awssdk.services.s3.model.PutBucketLifecycleConfigurationRequest; + import software.amazon.awssdk.services.sqs.SqsClient; + import software.amazon.awssdk.services.sqs.model.CreateQueueRequest; + import software.amazon.awssdk.services.sqs.model.CreateQueueResponse; + import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest; + import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest; + import software.amazon.awssdk.services.sqs.model.Message; + import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest; + import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse; + import software.amazon.awssdk.services.sqs.model.SendMessageRequest; + + import java.util.Arrays; + import java.util.List; + import java.util.UUID; + + /** + * Example of using Amazon SQS Extended Client Library for Java 2.x. + */ + public class SqsExtendedClientExample { + private static final Logger logger = LoggerFactory.getLogger(SqsExtendedClientExample.class); + + private String s3BucketName; + private String queueUrl; + private final String queueName; + private final S3Client s3Client; + private final SqsClient sqsExtendedClient; + private final int messageSize; + + /** + * Constructor with default clients and message size. + */ + public SqsExtendedClientExample() { + this(S3Client.create(), 300000); + } + + /** + * Constructor with custom S3 client and message size. + * + * @param s3Client The S3 client to use + * @param messageSize The size of the test message to create + */ + public SqsExtendedClientExample(S3Client s3Client, int messageSize) { + this.s3Client = s3Client; + this.messageSize = messageSize; + + // Generate a unique bucket name. + this.s3BucketName = UUID.randomUUID() + "-" + + DateTimeFormat.forPattern("yyMMdd-hhmmss").print(new DateTime()); + + // Generate a unique queue name. + this.queueName = "MyQueue-" + UUID.randomUUID(); + + // Configure the SQS extended client. + final ExtendedClientConfiguration extendedClientConfig = new ExtendedClientConfiguration() + .withPayloadSupportEnabled(s3Client, s3BucketName); + + this.sqsExtendedClient = new AmazonSQSExtendedClient(SqsClient.builder().build(), extendedClientConfig); + } + + public static void main(String[] args) { + SqsExtendedClientExample example = new SqsExtendedClientExample(); + try { + example.setup(); + example.sendAndReceiveMessage(); + } finally { + example.cleanup(); + } + } + + /** + * Send a large message and receive it back. + * + * @return The received message + */ + public Message sendAndReceiveMessage() { + try { + // Create a large message. + char[] chars = new char[messageSize]; + Arrays.fill(chars, 'x'); + String largeMessage = new String(chars); + + // Send the message. + final SendMessageRequest sendMessageRequest = SendMessageRequest.builder() + .queueUrl(queueUrl) + .messageBody(largeMessage) + .build(); + + sqsExtendedClient.sendMessage(sendMessageRequest); + logger.info("Sent message of size: {}", largeMessage.length()); + + // Receive and return the message. + final ReceiveMessageResponse receiveMessageResponse = sqsExtendedClient.receiveMessage( + ReceiveMessageRequest.builder().queueUrl(queueUrl).build()); + + List<Message> messages = receiveMessageResponse.messages(); + if (messages.isEmpty()) { + throw new RuntimeException("No messages received"); + } + + Message message = messages.getFirst(); + logger.info("\nMessage received."); + logger.info(" ID: {}", message.messageId()); + logger.info(" Receipt handle: {}", message.receiptHandle()); + logger.info(" Message body size: {}", message.body().length()); + logger.info(" Message body (first 5 characters): {}", message.body().substring(0, 5)); + + return message; + } catch (RuntimeException e) { + logger.error("Error during message processing: {}", e.getMessage(), e); + throw e; + } + } + + + + * For more information, see [AWS SDK for Java 2.x Developer Guide](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-s3-messages.html). + + * For API details, see the following topics in _AWS SDK for Java 2.x API Reference_. + + * [CreateBucket](https://docs.aws.amazon.com/goto/SdkForJavaV2/s3-2006-03-01/CreateBucket) + + * [PutBucketLifecycleConfiguration](https://docs.aws.amazon.com/goto/SdkForJavaV2/s3-2006-03-01/PutBucketLifecycleConfiguration) + + * [ReceiveMessage](https://docs.aws.amazon.com/goto/SdkForJavaV2/sqs-2012-11-05/ReceiveMessage) + + * [SendMessage](https://docs.aws.amazon.com/goto/SdkForJavaV2/sqs-2012-11-05/SendMessage) + + + +