diff --git a/CHANGELOG.md b/CHANGELOG.md index fedfba64584..a00e13aed63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6066,6 +6066,9 @@ included in the future will have a corresponding CHANGELOG entry in future relea - **CUMULUS-1808** - Add additional error messaging in `deleteSnsTrigger` to give users more context about where to look to resolve ResourceNotFound error when disabling or deleting a rule. +- **CUMULUS-5046** + - Support cross account SQS queues by extracting the owner account ID from the URL and using that in validation of queues. + ### Fixed - **CUMULUS-2281** diff --git a/packages/aws-client/src/SQS.ts b/packages/aws-client/src/SQS.ts index 693ce01bcbc..c9b8a4435cb 100644 --- a/packages/aws-client/src/SQS.ts +++ b/packages/aws-client/src/SQS.ts @@ -29,6 +29,7 @@ export interface SQSMessage extends Message { } export const getQueueNameFromUrl = (queueUrl: string) => queueUrl.split('/').pop(); +export const getQueueOwnerAccountFromUrl = (queueUrl: string) => queueUrl.split('/')[queueUrl.split('/').length - 2]; export const getQueueUrl = (sourceArn: string, queueName: string) => { const arnParts = sourceArn.split(':'); @@ -184,12 +185,16 @@ export const deleteSQSMessage = (QueueUrl: string, ReceiptHandle: string) => { */ export const sqsQueueExists = async (queueUrl: string) => { const QueueName = getQueueNameFromUrl(queueUrl); + const QueueAccount = getQueueOwnerAccountFromUrl(queueUrl); if (!QueueName) { throw new Error(`Unable to determine QueueName from ${queueUrl}`); } - const command = new GetQueueUrlCommand({ QueueName }); + const command = new GetQueueUrlCommand({ + QueueName: QueueName, + QueueOwnerAWSAccountId: QueueAccount, + }); try { await sqs().send(command); diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index 8748b0a5f2f..3c5b12bbccd 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -8,6 +8,7 @@ const { sqs } = require('../services'); const { createQueue, getQueueNameFromUrl, + getQueueOwnerAccountFromUrl, parseSQSMessageBody, sqsQueueExists, sendSQSMessage, @@ -78,6 +79,14 @@ test('getQueueNameFromUrl extracts queue name from a queue URL', (t) => { t.is(extractedName, queueName); }); +test('getQueueNameFromUrl extracts queue owner account ID from a queue URL', (t) => { + const queueOwnerAccount = '123456789012'; + const queueName = 'MyQueue'; + const queueUrl = `https://sqs.us-east-2.amazonaws.com/${queueOwnerAccount}/${queueName}`; + const extractedOwnerAccount = getQueueOwnerAccountFromUrl(queueUrl); + t.is(extractedOwnerAccount, queueOwnerAccount); +}); + test('sendSQSMessage logs errors', async (t) => { const testConsole = new TestConsole(); const log = new Logger({ console: testConsole });