From 550be3a9e9f79df71848df2c7c47b627c976277f Mon Sep 17 00:00:00 2001 From: Pahud Hsieh Date: Wed, 20 Aug 2025 09:11:09 -0400 Subject: [PATCH 1/3] chore(sqs): increase maximum message size limit to 1 MiB - Update maxMessageSizeBytes limit from 262,144 bytes (256 KiB) to 1,048,576 bytes (1 MiB) - Update validation rules to enforce new maximum limit - Add comprehensive tests for boundary validation and edge cases - Ensure CloudFormation synthesis works correctly with new limit --- packages/aws-cdk-lib/aws-sqs/lib/queue.ts | 4 +- .../aws-sqs/lib/validate-queue-props.ts | 4 +- packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts | 56 +++++++++++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/packages/aws-cdk-lib/aws-sqs/lib/queue.ts b/packages/aws-cdk-lib/aws-sqs/lib/queue.ts index d94de73be18ff..03498d4cc4dac 100644 --- a/packages/aws-cdk-lib/aws-sqs/lib/queue.ts +++ b/packages/aws-cdk-lib/aws-sqs/lib/queue.ts @@ -45,8 +45,8 @@ export interface QueueProps { /** * The limit of how many bytes that a message can contain before Amazon SQS rejects it. * - * You can specify an integer value from 1024 bytes (1 KiB) to 262144 bytes - * (256 KiB). The default value is 262144 (256 KiB). + * You can specify an integer value from 1024 bytes (1 KiB) to 1048576 bytes + * (1 MiB). The default value is 262144 (256 KiB). * * @default 256KiB */ diff --git a/packages/aws-cdk-lib/aws-sqs/lib/validate-queue-props.ts b/packages/aws-cdk-lib/aws-sqs/lib/validate-queue-props.ts index cd17f9d12d9aa..70cb1833e29da 100644 --- a/packages/aws-cdk-lib/aws-sqs/lib/validate-queue-props.ts +++ b/packages/aws-cdk-lib/aws-sqs/lib/validate-queue-props.ts @@ -13,8 +13,8 @@ const queueValidationRules: ValidationRule[] = [ message: (props) => `delivery delay must be between 0 and 900 seconds, but ${props.deliveryDelay?.toSeconds()} was provided`, }, { - condition: (props) => validateRange(props.maxMessageSizeBytes, 1_024, 262_144), - message: (props) => `maximum message size must be between 1,024 and 262,144 bytes, but ${props.maxMessageSizeBytes} was provided`, + condition: (props) => validateRange(props.maxMessageSizeBytes, 1_024, 1_048_576), + message: (props) => `maximum message size must be between 1,024 and 1,048,576 bytes, but ${props.maxMessageSizeBytes} was provided`, }, { condition: (props) => validateRange(props.retentionPeriod?.toSeconds(), 60, 1_209_600), diff --git a/packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts b/packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts index 9b1cb00e87cc1..28a153e31e34a 100644 --- a/packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts +++ b/packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts @@ -124,6 +124,62 @@ test('message retention period can be provided as a parameter', () => { }); }); +test('maxMessageSizeBytes validation enforces correct limits', () => { + const stack = new Stack(); + + // Test minimum boundary - should fail + expect(() => new sqs.Queue(stack, 'TooSmall', { + maxMessageSizeBytes: 1023, + })).toThrow('Queue initialization failed due to the following validation error(s):\n- maximum message size must be between 1,024 and 1,048,576 bytes, but 1023 was provided'); + + // Test maximum boundary - should fail + expect(() => new sqs.Queue(stack, 'TooLarge', { + maxMessageSizeBytes: 1048577, + })).toThrow('Queue initialization failed due to the following validation error(s):\n- maximum message size must be between 1,024 and 1,048,576 bytes, but 1048577 was provided'); + + // Test valid minimum boundary - should succeed + expect(() => new sqs.Queue(stack, 'MinValid', { + maxMessageSizeBytes: 1024, + })).not.toThrow(); + + // Test valid maximum boundary - should succeed + expect(() => new sqs.Queue(stack, 'MaxValid', { + maxMessageSizeBytes: 1048576, + })).not.toThrow(); +}); + +test('maxMessageSizeBytes works with CDK tokens', () => { + const stack = new Stack(); + const parameter = new CfnParameter(stack, 'MessageSize', { type: 'Number' }); + + // Should not throw for tokens (validation skipped) + expect(() => new sqs.Queue(stack, 'TokenQueue', { + maxMessageSizeBytes: parameter.valueAsNumber, + })).not.toThrow(); +}); + +test('multiple validation errors include maxMessageSizeBytes', () => { + const stack = new Stack(); + + expect(() => new sqs.Queue(stack, 'MultiError', { + maxMessageSizeBytes: 2000000, + retentionPeriod: Duration.seconds(30), + })).toThrow(/maximum message size must be between 1,024 and 1,048,576 bytes.*message retention period must be between 60 and 1,209,600 seconds/s); +}); + +test('maxMessageSizeBytes synthesizes correct CloudFormation', () => { + const stack = new Stack(); + + new sqs.Queue(stack, 'LargeMessageQueue', { + maxMessageSizeBytes: 1048576, + }); + + const template = Template.fromStack(stack); + template.hasResourceProperties('AWS::SQS::Queue', { + MaximumMessageSize: 1048576, + }); +}); + test('addToPolicy will automatically create a policy for this queue', () => { const stack = new Stack(); const queue = new sqs.Queue(stack, 'MyQueue'); From e6fc987bb4366a243f68f2463438aeebccd75603 Mon Sep 17 00:00:00 2001 From: Pahud Hsieh Date: Wed, 20 Aug 2025 15:26:29 -0400 Subject: [PATCH 2/3] improve our tests --- packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts b/packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts index 28a153e31e34a..8fa1019b21f7f 100644 --- a/packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts +++ b/packages/aws-cdk-lib/aws-sqs/test/sqs.test.ts @@ -124,28 +124,21 @@ test('message retention period can be provided as a parameter', () => { }); }); -test('maxMessageSizeBytes validation enforces correct limits', () => { +test.each([ + { size: 1023, valid: false, description: 'just below lower bound' }, + { size: 1024, valid: true, description: 'at lower bound' }, + { size: 1048576, valid: true, description: 'at upper bound' }, + { size: 1048577, valid: false, description: 'just above upper bound' }, +])('maxMessageSizeBytes validation for $size bytes ($description)', ({ size, valid }) => { const stack = new Stack(); - - // Test minimum boundary - should fail - expect(() => new sqs.Queue(stack, 'TooSmall', { - maxMessageSizeBytes: 1023, - })).toThrow('Queue initialization failed due to the following validation error(s):\n- maximum message size must be between 1,024 and 1,048,576 bytes, but 1023 was provided'); - - // Test maximum boundary - should fail - expect(() => new sqs.Queue(stack, 'TooLarge', { - maxMessageSizeBytes: 1048577, - })).toThrow('Queue initialization failed due to the following validation error(s):\n- maximum message size must be between 1,024 and 1,048,576 bytes, but 1048577 was provided'); - - // Test valid minimum boundary - should succeed - expect(() => new sqs.Queue(stack, 'MinValid', { - maxMessageSizeBytes: 1024, - })).not.toThrow(); - - // Test valid maximum boundary - should succeed - expect(() => new sqs.Queue(stack, 'MaxValid', { - maxMessageSizeBytes: 1048576, - })).not.toThrow(); + const constructId = `QueueWithSize${size}`; + const action = () => new sqs.Queue(stack, constructId, { maxMessageSizeBytes: size }); + + if (valid) { + expect(action).not.toThrow(); + } else { + expect(action).toThrow(`Queue initialization failed due to the following validation error(s):\n- maximum message size must be between 1,024 and 1,048,576 bytes, but ${size} was provided`); + } }); test('maxMessageSizeBytes works with CDK tokens', () => { From 44dab6c6e85071707b34e5e79c55b75c2e436368 Mon Sep 17 00:00:00 2001 From: Pahud Hsieh Date: Thu, 21 Aug 2025 16:19:56 -0400 Subject: [PATCH 3/3] docs(sqs): update default maxMessageSizeBytes to 1 MiB Update documentation to reflect that AWS SQS default maximum message size has changed from 256 KiB to 1 MiB as per AWS CloudFormation documentation. Addresses review feedback on PR #35283. --- packages/aws-cdk-lib/aws-sqs/lib/queue.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aws-cdk-lib/aws-sqs/lib/queue.ts b/packages/aws-cdk-lib/aws-sqs/lib/queue.ts index 03498d4cc4dac..f248b4fabf51c 100644 --- a/packages/aws-cdk-lib/aws-sqs/lib/queue.ts +++ b/packages/aws-cdk-lib/aws-sqs/lib/queue.ts @@ -46,9 +46,9 @@ export interface QueueProps { * The limit of how many bytes that a message can contain before Amazon SQS rejects it. * * You can specify an integer value from 1024 bytes (1 KiB) to 1048576 bytes - * (1 MiB). The default value is 262144 (256 KiB). + * (1 MiB). The default value is 1048576 (1 MiB). * - * @default 256KiB + * @default 1MiB */ readonly maxMessageSizeBytes?: number;