From dfdc23d0e6f08984ea412fe22ead8eec8a509a43 Mon Sep 17 00:00:00 2001 From: Biswanath Mukherjee Date: Fri, 19 Jan 2024 18:09:53 +0530 Subject: [PATCH 01/10] Initial check-in --- .../README.md | 136 ++++++++++++++++++ .../example-pattern.json | 55 +++++++ .../image/architecture.png | Bin 0 -> 19660 bytes .../receive-messages-from-target-queue.sh | 21 +++ .../send-messages-to-source-queue.sh | 23 +++ .../template.yaml | 73 ++++++++++ 6 files changed, 308 insertions(+) create mode 100644 eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md create mode 100644 eventbridge-pipes-sqs-to-sqs-with-data-filter/example-pattern.json create mode 100644 eventbridge-pipes-sqs-to-sqs-with-data-filter/image/architecture.png create mode 100644 eventbridge-pipes-sqs-to-sqs-with-data-filter/receive-messages-from-target-queue.sh create mode 100644 eventbridge-pipes-sqs-to-sqs-with-data-filter/send-messages-to-source-queue.sh create mode 100644 eventbridge-pipes-sqs-to-sqs-with-data-filter/template.yaml diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md b/eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md new file mode 100644 index 000000000..7519ce8a4 --- /dev/null +++ b/eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md @@ -0,0 +1,136 @@ +# SQS to SQS message copy with filter using EventBridge Pipe + +The patterns shows the filter capability of the Amazon EventBridge Pipe while copying data from one Amazon SQS queue to another. The SAM template deploys two Amazon SQS queues, an Amazon EventBridge Pipe with filter having source as one of the SQS queues and target as another queue. + +Learn more about this pattern at Serverless Land Patterns:https://serverlessland.com/patterns/eventbridge-pipes-sqs-to-sqs-with-data-filter + +Important: this application uses various AWS services and there are costs associated with these services after the Free Tier usage - please see the [AWS Pricing page](https://aws.amazon.com/pricing/) for details. You are responsible for any AWS costs incurred. No warranty is implied in this example. + +## Requirements + +- [Create an AWS account](https://portal.aws.amazon.com/gp/aws/developer/registration/index.html) if you do not already have one and log in. The IAM user that you use must have sufficient permissions to make necessary AWS service calls and manage AWS resources. +- [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) installed and configured +- [Git Installed](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +- [AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) (AWS SAM) installed + +## Deployment Instructions + +1. Create a new directory, navigate to that directory in a terminal and clone the GitHub repository: + ``` + git clone https://github.com/aws-samples/serverless-patterns + ``` +2. Change directory to the pattern directory: + ``` + cd eventbridge-pipes-sqs-to-sqs-with-data-filter + ``` +3. From the command line, use AWS SAM to deploy the AWS resources for the pattern as specified in the template.yml file: + ``` + sam deploy --guided + ``` +4. During the prompts: + * Enter a stack name + * Enter `us-east-1` or any other AWS Region. + * Allow SAM CLI to create IAM roles with the required permissions. Please keep all other options to default. +5. Make a note of the output, which will be used during testing. + +## How it works + +* This template creates two Amazon SQS queues - `source-queue` and `target-queue` along with an Amazon EventBridge Pipe. +* The Amazon EventBridge pipe copies messages from `source-queue` to `target-queue` only if message payload (JSON) contains `color` attribute having values `red` or `blue`. +* Once the stack is deployed, we will use `send-messages-to-source-queue.sh` to send messages to the `source-queue`. This script sends four messages with different values for `color` attribute. +* We will validate received messages on `target-queue` using `receive-messages-from-target-queue.sh`. Only the messages with `red` and `blue` values for `color` attribute will be available in `target-queue`. + + +Please refer to the architecture diagram below: + +![End to End Architecture](image/architecture.png) + +## Testing + +1. Run the script `receive-messages-from-target-queue.sh` to send four messages to the `source-queue` with a payload in `{"id":1, "color":""}` format having `red`, `blue`, `green` and `yellow` as color values. The script will ask for the queue URL and the region. Please provide the `SourceQueueURL` value received from the outout of the deployment step and your deployment region. + ```bash + bash receive-messages-from-target-queue.sh + ``` + + Sample output: + ```bash + Enter the SQS source queue URL: + {SourceQueueURL} + Enter your AWS region: + {your-region} + { + "MD5OfMessageBody": "266d1841ee6d382c85595fa0ca6e16b0", + "MessageId": "b1d51544-e725-451a-ba2f-13ad5f2acd9d" + } + { + "MD5OfMessageBody": "9cd1c133e3bc1406cf92d9ca0b39d7bc", + "MessageId": "8c68b9a1-a09c-4c88-aa8f-60353a5701ee" + } + { + "MD5OfMessageBody": "846a7a77cc95d371d002296f09dd6286", + "MessageId": "c4d87ea3-732f-4ae9-b227-9df4c4c04051" + } + { + "MD5OfMessageBody": "b77316a2ed44a33471ba262079fe8ce3", + "MessageId": "794d654a-95a7-45ee-8cd5-eb197de084b1" + } + ``` +2. Now, run the script `receive-messages-from-target-queue.sh` to receive messages from the `target-queue`. Please use the below aws cli command to read message from the SQS queue. Please replace the {SQSQueueURL} with the URL from the deployent output and also replace the {your-region} with the region that you selected during deployment: + ```bash + bash receive-messages-from-target-queue.sh + ``` + + Sample output: + ```bash + Enter SQS target queue URL: + https://sqs.{your-region}.amazonaws.com/123456789012/target-queue + Enter your AWS region: + {your-region} + { + "Messages": [ + { + "MessageId": "82e7xxx-xx-xx-xx-xxxxxde", + "ReceiptHandle": "AQEBWmPxxxxxx2sMw==", + "MD5OfBody": "64bxxxxx232b", + "Body": "{\"messageId\":\"e517xxxxx513\",\"receiptHandle\":\"AQEBxxxxVusg==\",\"body\":\"{\\\"id\\\":1, \\\"color\\\":\\\"red\\\"}\",\"attributes\":{\"ApproximateReceiveCount\":\"1\",\"SentTimestamp\":\"1705663525194\",\"SenderId\":\"AIxxxxIFR\",\"ApproximateFirstReceiveTimestamp\":\"1705663525205\"},\"messageAttributes\":{},\"md5OfBody\":\"266xxxxx16b0\",\"eventSource\":\"aws:sqs\",\"eventSourceARN\":\"arn:aws:sqs:{your-region}:123456789012:source-queue\",\"awsRegion\":\"{your-region}\"}", + "Attributes": { + "SenderId": "ARxxxxZC:c11xxxx92f", + "ApproximateFirstReceiveTimestamp": "1705663569479", + "ApproximateReceiveCount": "6", + "SentTimestamp": "1705663525269" + } + } + ] + } + { + "Messages": [ + { + "MessageId": "95f7xxx-xx-xx-xx-xxxxxde", + "ReceiptHandle": "AQEBWmPxxxxxx2sMw==", + "MD5OfBody": "64bxxxxx232b", + "Body": "{\"messageId\":\"e517xxxxx513\",\"receiptHandle\":\"AQEBxxxxVusg==\",\"body\":\"{\\\"id\\\":1, \\\"color\\\":\\\"blue\\\"}\",\"attributes\":{\"ApproximateReceiveCount\":\"1\",\"SentTimestamp\":\"1705663525194\",\"SenderId\":\"AIxxxxIFR\",\"ApproximateFirstReceiveTimestamp\":\"1705663525205\"},\"messageAttributes\":{},\"md5OfBody\":\"266xxxxx16b0\",\"eventSource\":\"aws:sqs\",\"eventSourceARN\":\"arn:aws:sqs:{your-region}:123456789012:source-queue\",\"awsRegion\":\"{your-region}\"}", + "Attributes": { + "SenderId": "ARxxxxZC:c11xxxx92f", + "ApproximateFirstReceiveTimestamp": "1705663566929", + "ApproximateReceiveCount": "6", + "SentTimestamp": "1705663525345" + } + } + ] + } + ``` + + As you see from the message, even though we pushed four messages into the `source-queue`, only the two messages that matched the filter of EventBridge pipe was sent to the `target-queue`. + +## Cleanup + + +1. Delete the stack + ```bash + sam delete + ``` + +---- +Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: MIT-0 diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/example-pattern.json b/eventbridge-pipes-sqs-to-sqs-with-data-filter/example-pattern.json new file mode 100644 index 000000000..bc35f236a --- /dev/null +++ b/eventbridge-pipes-sqs-to-sqs-with-data-filter/example-pattern.json @@ -0,0 +1,55 @@ +{ + "title": "SQS to SQS message copy with filter using EventBridge Pipe", + "description": "The patterns shows the filter capability of the Amazon EventBridge Pipe while copying data from one Amazon SQS queue to another queue using SAM.", + "language": "YAML", + "level": "200", + "framework": "SAM", + "introBox": { + "headline": "How it works", + "text": [ + "This template creates two Amazon SQS queues - source-queue and target-queue along with an Amazon EventBridge Pipe.", + "The Amazon EventBridge pipe copies messages from source-queue to target-queue only if message payload (JSON) contains color attribute having values red or blue.", + "Once the stack is deployed, we will use send-messages-to-source-queue.sh to send messages to the source-queue. This scripts send four messages with different values for color attribute.", + "We will validate received messages on `target-queue` using receive-messages-from-target-queue.sh. Only the messages with red and blue values for color attribute will be available in target-queue." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-pipes-sqs-to-sqs-with-data-filter", + "templateURL": "serverless-patterns/eventbridge-pipes-sqs-to-sqs-with-data-filter", + "projectFolder": "eventbridge-pipes-sqs-to-sqs-with-data-filter", + "templateFile": "template.yaml" + } + }, + "resources": { + "bullets": [ + { + "text": "Amazon EventBridge Pipes filtering", + "link": "https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes-event-filtering.html" + } + ] + }, + "deploy": { + "text": [ + "sam deploy --guided" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "Delete the stack: sam delete." + ] + }, + "authors": [ + { + "name": "Biswanath Mukherjee", + "image": "https://d1rwvjey2iif32.cloudfront.net", + "bio": "I am a Sr. Solutions Architect working at AWS India.", + "linkedin": "biswanathmukherjee" + } + ] +} diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/image/architecture.png b/eventbridge-pipes-sqs-to-sqs-with-data-filter/image/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..62c59cae1fe838ba860b6bf732769515b44059db GIT binary patch literal 19660 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 Date: Fri, 26 Jan 2024 17:51:29 +0530 Subject: [PATCH 02/10] Added sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam.json --- ...qs-message-copy-with-eventbridgepipes.json | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 eventbridge-pipes-sqs-to-sqs-with-data-filter/sqs-to-sqs-message-copy-with-eventbridgepipes.json diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/sqs-to-sqs-message-copy-with-eventbridgepipes.json b/eventbridge-pipes-sqs-to-sqs-with-data-filter/sqs-to-sqs-message-copy-with-eventbridgepipes.json new file mode 100644 index 000000000..50cf9b916 --- /dev/null +++ b/eventbridge-pipes-sqs-to-sqs-with-data-filter/sqs-to-sqs-message-copy-with-eventbridgepipes.json @@ -0,0 +1,83 @@ +{ + "title": "SQS to SQS message copy with filter using EventBridge Pipe", + "description": "The patterns shows the filter capability of the Amazon EventBridge Pipe while copying data from one Amazon SQS queue to another queue using SAM.", + "language": "YAML", + "level": "200", + "framework": "SAM", + "introBox": { + "headline": "How it works", + "text": [ + "This template creates two Amazon SQS queues - source-queue and target-queue along with an Amazon EventBridge Pipe.", + "The Amazon EventBridge pipe copies messages from source-queue to target-queue only if message payload (JSON) contains color attribute having values red or blue.", + "Once the stack is deployed, we will use send-messages-to-source-queue.sh to send messages to the source-queue. This scripts send four messages with different values for color attribute.", + "We will validate received messages on `target-queue` using receive-messages-from-target-queue.sh. Only the messages with red and blue values for color attribute will be available in target-queue." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-pipes-sqs-to-sqs-with-data-filter", + "templateURL": "serverless-patterns/eventbridge-pipes-sqs-to-sqs-with-data-filter", + "projectFolder": "eventbridge-pipes-sqs-to-sqs-with-data-filter", + "templateFile": "template.yaml" + } + }, + "resources": { + "bullets": [ + { + "text": "Amazon EventBridge Pipes filtering", + "link": "https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes-event-filtering.html" + } + ] + }, + "deploy": { + "text": [ + "sam deploy --guided" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "Delete the stack: sam delete." + ] + }, + "authors": [ + { + "name": "Biswanath Mukherjee", + "image": "https://d1rwvjey2iif32.cloudfront.net", + "bio": "I am a Sr. Solutions Architect working at AWS India.", + "linkedin": "biswanathmukherjee" + } + ], + "patternArch": { + "icon1": { + "x": 15, + "y": 50, + "service": "sqs", + "label": "SQS (Source)" + }, + "icon2": { + "x": 50, + "y": 50, + "service": "eventbridge-pipes", + "label": "EventBridge Pipes (extract-filter-load)" + }, + "icon3": { + "x": 85, + "y": 50, + "service": "sqs", + "label": "SQS (Target)" + }, + "line1": { + "from": "icon1", + "to": "icon2" + }, + "line2": { + "from": "icon2", + "to": "icon3" + } + } +} From 1cd84b169b3843e7a6e8f49c6df0f23361d93387 Mon Sep 17 00:00:00 2001 From: Biswanath Mukherjee Date: Fri, 26 Jan 2024 20:48:17 +0530 Subject: [PATCH 03/10] Fixed review comment --- eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md b/eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md index 7519ce8a4..68e85d60c 100644 --- a/eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md +++ b/eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md @@ -47,9 +47,9 @@ Please refer to the architecture diagram below: ## Testing -1. Run the script `receive-messages-from-target-queue.sh` to send four messages to the `source-queue` with a payload in `{"id":1, "color":""}` format having `red`, `blue`, `green` and `yellow` as color values. The script will ask for the queue URL and the region. Please provide the `SourceQueueURL` value received from the outout of the deployment step and your deployment region. +1. Run the script `send-messages-to-source-queue.sh` to send four messages to the `source-queue` with a payload in `{"id":1, "color":""}` format having `red`, `blue`, `green` and `yellow` as color values. The script will ask for the queue URL and the region. Please provide the `SourceQueueURL` value received from the outout of the deployment step and your deployment region. ```bash - bash receive-messages-from-target-queue.sh + bash send-messages-to-source-queue.sh ``` Sample output: From 43849e4b51c94ebd44cdfeb92a01a578f5d5afbe Mon Sep 17 00:00:00 2001 From: Biswanath Mukherjee Date: Sat, 27 Jan 2024 07:22:37 +0530 Subject: [PATCH 04/10] renamed folder --- .../README.md | 0 .../example-pattern.json | 0 .../image/architecture.png | Bin .../receive-messages-from-target-queue.sh | 0 .../send-messages-to-source-queue.sh | 0 ...s-to-sqs-message-copy-with-eventbridgepipes.json | 0 .../template.yaml | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename {eventbridge-pipes-sqs-to-sqs-with-data-filter => sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam}/README.md (100%) rename {eventbridge-pipes-sqs-to-sqs-with-data-filter => sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam}/example-pattern.json (100%) rename {eventbridge-pipes-sqs-to-sqs-with-data-filter => sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam}/image/architecture.png (100%) rename {eventbridge-pipes-sqs-to-sqs-with-data-filter => sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam}/receive-messages-from-target-queue.sh (100%) rename {eventbridge-pipes-sqs-to-sqs-with-data-filter => sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam}/send-messages-to-source-queue.sh (100%) rename {eventbridge-pipes-sqs-to-sqs-with-data-filter => sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam}/sqs-to-sqs-message-copy-with-eventbridgepipes.json (100%) rename {eventbridge-pipes-sqs-to-sqs-with-data-filter => sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam}/template.yaml (100%) diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md similarity index 100% rename from eventbridge-pipes-sqs-to-sqs-with-data-filter/README.md rename to sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/example-pattern.json b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json similarity index 100% rename from eventbridge-pipes-sqs-to-sqs-with-data-filter/example-pattern.json rename to sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/image/architecture.png b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/image/architecture.png similarity index 100% rename from eventbridge-pipes-sqs-to-sqs-with-data-filter/image/architecture.png rename to sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/image/architecture.png diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/receive-messages-from-target-queue.sh b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/receive-messages-from-target-queue.sh similarity index 100% rename from eventbridge-pipes-sqs-to-sqs-with-data-filter/receive-messages-from-target-queue.sh rename to sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/receive-messages-from-target-queue.sh diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/send-messages-to-source-queue.sh b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/send-messages-to-source-queue.sh similarity index 100% rename from eventbridge-pipes-sqs-to-sqs-with-data-filter/send-messages-to-source-queue.sh rename to sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/send-messages-to-source-queue.sh diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/sqs-to-sqs-message-copy-with-eventbridgepipes.json b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json similarity index 100% rename from eventbridge-pipes-sqs-to-sqs-with-data-filter/sqs-to-sqs-message-copy-with-eventbridgepipes.json rename to sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json diff --git a/eventbridge-pipes-sqs-to-sqs-with-data-filter/template.yaml b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/template.yaml similarity index 100% rename from eventbridge-pipes-sqs-to-sqs-with-data-filter/template.yaml rename to sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/template.yaml From ca27eeca784047bd14563b3980e400505d4df17a Mon Sep 17 00:00:00 2001 From: Udit Parikh Date: Wed, 31 Jan 2024 16:29:53 +0530 Subject: [PATCH 05/10] Updated README.md --- sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md index 68e85d60c..c7bc61f3c 100644 --- a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md +++ b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md @@ -21,7 +21,7 @@ Important: this application uses various AWS services and there are costs associ ``` 2. Change directory to the pattern directory: ``` - cd eventbridge-pipes-sqs-to-sqs-with-data-filter + cd sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam ``` 3. From the command line, use AWS SAM to deploy the AWS resources for the pattern as specified in the template.yml file: ``` From 18e3537896099506f0b2f397443d99c6a7b288ce Mon Sep 17 00:00:00 2001 From: Julian Wood Date: Thu, 1 Feb 2024 15:28:22 +0000 Subject: [PATCH 06/10] Update sqs-to-sqs-message-copy-with-eventbridgepipes.json --- .../sqs-to-sqs-message-copy-with-eventbridgepipes.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json index 50cf9b916..f62e63f0a 100644 --- a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json +++ b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json @@ -1,6 +1,6 @@ { - "title": "SQS to SQS message copy with filter using EventBridge Pipe", - "description": "The patterns shows the filter capability of the Amazon EventBridge Pipe while copying data from one Amazon SQS queue to another queue using SAM.", + "title": "Copying Amazon SQS messages between queues using an Amazon EventBridge Pipes filter", + "description": "The pattern shows the filter capability of Amazon EventBridge Pipes while copying data from one Amazon SQS queue to another queue.", "language": "YAML", "level": "200", "framework": "SAM", @@ -9,8 +9,8 @@ "text": [ "This template creates two Amazon SQS queues - source-queue and target-queue along with an Amazon EventBridge Pipe.", "The Amazon EventBridge pipe copies messages from source-queue to target-queue only if message payload (JSON) contains color attribute having values red or blue.", - "Once the stack is deployed, we will use send-messages-to-source-queue.sh to send messages to the source-queue. This scripts send four messages with different values for color attribute.", - "We will validate received messages on `target-queue` using receive-messages-from-target-queue.sh. Only the messages with red and blue values for color attribute will be available in target-queue." + "Once the stack is deployed, use `send-messages-to-source-queue.sh` to send messages to the source-queue. This scripts sends four messages with different values for color attribute.", + "Validate received messages on `target-queue` using `receive-messages-from-target-queue.sh`. Only the messages with red and blue values for color attribute are available in `target-queue`." ] }, "gitHub": { From 3511e7ae17ec1da67ad9e7c2473e2a92f6e1bd7d Mon Sep 17 00:00:00 2001 From: Julian Wood Date: Thu, 1 Feb 2024 15:29:56 +0000 Subject: [PATCH 07/10] Update example-pattern.json --- .../example-pattern.json | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json index bc35f236a..f05c7770b 100644 --- a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json +++ b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json @@ -1,18 +1,18 @@ { - "title": "SQS to SQS message copy with filter using EventBridge Pipe", - "description": "The patterns shows the filter capability of the Amazon EventBridge Pipe while copying data from one Amazon SQS queue to another queue using SAM.", - "language": "YAML", - "level": "200", - "framework": "SAM", - "introBox": { - "headline": "How it works", - "text": [ - "This template creates two Amazon SQS queues - source-queue and target-queue along with an Amazon EventBridge Pipe.", - "The Amazon EventBridge pipe copies messages from source-queue to target-queue only if message payload (JSON) contains color attribute having values red or blue.", - "Once the stack is deployed, we will use send-messages-to-source-queue.sh to send messages to the source-queue. This scripts send four messages with different values for color attribute.", - "We will validate received messages on `target-queue` using receive-messages-from-target-queue.sh. Only the messages with red and blue values for color attribute will be available in target-queue." - ] - }, + "title": "Copying Amazon SQS messages between queues using an Amazon EventBridge Pipes filter", + "description": "The pattern shows the filter capability of Amazon EventBridge Pipes while copying data from one Amazon SQS queue to another queue.", + "language": "YAML", + "level": "200", + "framework": "SAM", + "introBox": { + "headline": "How it works", + "text": [ + "This template creates two Amazon SQS queues - source-queue and target-queue along with an Amazon EventBridge Pipe.", + "The Amazon EventBridge pipe copies messages from source-queue to target-queue only if message payload (JSON) contains color attribute having values red or blue.", + "Once the stack is deployed, use `send-messages-to-source-queue.sh` to send messages to the source-queue. This scripts sends four messages with different values for color attribute.", + "Validate received messages on `target-queue` using `receive-messages-from-target-queue.sh`. Only the messages with red and blue values for color attribute are available in `target-queue`." + ] + }, "gitHub": { "template": { "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-pipes-sqs-to-sqs-with-data-filter", From 273ca869b108757cccb1ca36502ce8ad84e7348c Mon Sep 17 00:00:00 2001 From: Julian Wood Date: Thu, 1 Feb 2024 15:30:44 +0000 Subject: [PATCH 08/10] Update README.md --- sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md index c7bc61f3c..9626ffd21 100644 --- a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md +++ b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/README.md @@ -1,6 +1,6 @@ -# SQS to SQS message copy with filter using EventBridge Pipe +# Copying Amazon SQS messages between queues using an Amazon EventBridge Pipes filte -The patterns shows the filter capability of the Amazon EventBridge Pipe while copying data from one Amazon SQS queue to another. The SAM template deploys two Amazon SQS queues, an Amazon EventBridge Pipe with filter having source as one of the SQS queues and target as another queue. +The pattern shows the filter capability of Amazon EventBridge Pipes while copying data from one Amazon SQS queue to another queue. The SAM template deploys two Amazon SQS queues, an Amazon EventBridge Pipe with filter having source as one of the SQS queues and target as another queue. Learn more about this pattern at Serverless Land Patterns:https://serverlessland.com/patterns/eventbridge-pipes-sqs-to-sqs-with-data-filter From cd202e20f3acb8500f48c4727aba6b5e2255a284 Mon Sep 17 00:00:00 2001 From: Julian Wood Date: Thu, 1 Feb 2024 15:33:48 +0000 Subject: [PATCH 09/10] Update sqs-to-sqs-message-copy-with-eventbridgepipes.json --- .../sqs-to-sqs-message-copy-with-eventbridgepipes.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json index f62e63f0a..374d2cc29 100644 --- a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json +++ b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/sqs-to-sqs-message-copy-with-eventbridgepipes.json @@ -1,5 +1,5 @@ { - "title": "Copying Amazon SQS messages between queues using an Amazon EventBridge Pipes filter", + "title": "Copying Amazon SQS messages between queues using Amazon EventBridge Pipes", "description": "The pattern shows the filter capability of Amazon EventBridge Pipes while copying data from one Amazon SQS queue to another queue.", "language": "YAML", "level": "200", From 50c6295bbd16242fabb6f727349ab212c9fb8c60 Mon Sep 17 00:00:00 2001 From: Julian Wood Date: Thu, 1 Feb 2024 15:33:55 +0000 Subject: [PATCH 10/10] Update example-pattern.json --- .../example-pattern.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json index f05c7770b..45298ec63 100644 --- a/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json +++ b/sqs-eventbridgepipes-sqs-msg-copy-data-filter-sam/example-pattern.json @@ -1,5 +1,5 @@ { - "title": "Copying Amazon SQS messages between queues using an Amazon EventBridge Pipes filter", + "title": "Copying Amazon SQS messages between queues using Amazon EventBridge Pipes", "description": "The pattern shows the filter capability of Amazon EventBridge Pipes while copying data from one Amazon SQS queue to another queue.", "language": "YAML", "level": "200",