From 3afef3a973fcfe0d4ddec0c8de021800c7d11fcb Mon Sep 17 00:00:00 2001 From: Chaitanya Gummadi Date: Sun, 20 Oct 2024 16:35:40 -0500 Subject: [PATCH 1/4] merging multiple commits --- .../Architecture.jpg | Bin 0 -> 61292 bytes .../README.md | 90 ++++++++++++++ .../example-pattern.json | 59 ++++++++++ .../main.tf | 110 ++++++++++++++++++ 4 files changed, 259 insertions(+) create mode 100644 eventbridge-pipes-sqs-to-eventbus-terraform/Architecture.jpg create mode 100644 eventbridge-pipes-sqs-to-eventbus-terraform/README.md create mode 100644 eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json create mode 100644 eventbridge-pipes-sqs-to-eventbus-terraform/main.tf diff --git a/eventbridge-pipes-sqs-to-eventbus-terraform/Architecture.jpg b/eventbridge-pipes-sqs-to-eventbus-terraform/Architecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cd05d70527a26f7544306a9382915a7c520588a GIT binary patch literal 61292 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 I^vBV^1H~_{Hvj+t literal 0 HcmV?d00001 diff --git a/eventbridge-pipes-sqs-to-eventbus-terraform/README.md b/eventbridge-pipes-sqs-to-eventbus-terraform/README.md new file mode 100644 index 000000000..f42812b12 --- /dev/null +++ b/eventbridge-pipes-sqs-to-eventbus-terraform/README.md @@ -0,0 +1,90 @@ +# Amazon SQS queue to Amazon EventBridge custom event bus using Amazon EventBridge Pipe + +This pattern sends messages from an SQS queue to an EventBridge event bus using an EventBridge pipe. + +Learn more about this pattern at Serverless Land Patterns: https://serverlessland.com/patterns/eventbridge-pipes-sqs-to-eventbus-terraform + +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](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) installed and configured +* [Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli) 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 serverless-patterns/eventbridge-pipes-sqs-to-eventbus-terraform + ``` +3. Run the follow command to initialize, download, and install the defined providers. If you are unfamiliar with the Terraform CLI, refer Terraform [documentation](https://www.terraform.io/cli/commands) to learn more about the available commands. + ``` + terraform init + ``` +4. Deploy the AWS resources for the pattern as specified in the `main.tf` file. + + Use the below command to review the changes before deploying. + ``` + terraform plan + ``` + Deploy: + ``` + terraform apply --auto-approve + ``` +5. Note the output from the Terraform deployment process. These contain the resource names and/or ARNs which are used for testing. + +## How it works + +Please refer to the architecture diagram below: +![End to End Architecture](Architecture.jpg) + +## Testing + +Once this stack is deployed in your AWS account, copy the SQS_url value from the output. Then, insert two messages to the SQS Queue as follows: + +Message1: +```sh + aws sqs send-message --queue-url --message-body '{"orderId":"125a2e1e-d420-482e-8008-5a606f4b2076", "customerId": "a48516db-66aa-4dbc-bb66-a7f058c5ec24", "type": "NEW"}' + +``` + +Message2: +```sh + aws sqs send-message --queue-url --message-body '{"orderId":"125a2e1e-d420-482e-8008-5a606f4b2076", "customerId": "a48516db-66aa-4dbc-bb66-a7f058c5ec24", "type": "OLD"}' + +``` + +Optional: You could create an EventBridge rule with the below event pattern on the custom bus and add relevant targets. With this setup, Message2 would be filtered out by the Pipe, and only Message1 would invoke the configured EventBridge target. Ensure to delete the EventBridge rule before the clean up process. + +``` +{ + "source": ["myapp.demo"] +} +``` + +## Cleanup + +1. Change to the below directory inside the cloned git repo: + ``` + cd serverless-patterns/eventbridge-pipes-dynamodbstream-to-sqs-terraform + ``` +2. Delete the resources + ```bash + terraform destroy + ``` +3. Enter 'yes' when prompted. + +4. Check if all the resources were deleted successfully. + ```bash + terraform show + ``` +---- +Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: MIT-0 diff --git a/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json b/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json new file mode 100644 index 000000000..c0461b37b --- /dev/null +++ b/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json @@ -0,0 +1,59 @@ +{ + "title": "Amazon SQS to Amazon EventBridge event bus using Amazon EventBridge Pipes", + "description": "This pattern creates an Amazon EventBridge Pipe to deliver messages from an Amazon SQS queue to Amazon EventBridge Event Bus.", + "language": "", + "level": "200", + "framework": "Terraform", + "introBox": { + "headline": "How it works", + "text": [ + "Amazon EventBridge Pipe routes events from an Amazon SQS queue to a custom EventBridge event bus while applying filters.", + "This filtering capability enables you to create precise event processing pipelines, ensuring that only relevant events are propagated to downstream systems.", + "Then, other AWS services that are supported as EventBridge targets can consume these events from the EventBus by adding an EventBridge rule with relevant targets." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-pipes-sqs-to-eventbus-terraform", + "templateURL": "serverless-patterns/eventbridge-pipes-sqs-to-eventbus-terraform", + "projectFolder": "eventbridge-pipes-sqs-to-eventbus-terraform", + "templateFile": "eventbridge-pipes-sqs-to-eventbus-terraform/main.tf" + } + }, + "resources": { + "bullets": [ + { + "text": "EventBridge Pipes with SQS queue as a source", + "link": "https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes-sqs.html" + }, + { + "text": "Amazon EventBridge Pipes architectural patterns blog post", + "link": "https://aws.amazon.com/blogs/compute/implementing-architectural-patterns-with-amazon-eventbridge-pipes/" + } + ] + }, + "deploy": { + "text": [ + "terraform init", + "terraform apply" + ] + }, + "testing": { + "text": [ + "See the README in the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "terraform destroy" + ] + }, + "authors": [ + { + "name": "Chaitanya Gummadi", + "image": "https://gravatar.com/avatar/a9b30c6e727f613f3f44a44016e36998719404ea7451c750f402a21f2dd72937.jpg?size=256", + "bio": "Chaitanya is a Senior Cloud Support Engineer with Amazon Web Services (AWS) based in Texas.", + "linkedin": "cgummadi" + } + ] +} diff --git a/eventbridge-pipes-sqs-to-eventbus-terraform/main.tf b/eventbridge-pipes-sqs-to-eventbus-terraform/main.tf new file mode 100644 index 000000000..ba0bde1ef --- /dev/null +++ b/eventbridge-pipes-sqs-to-eventbus-terraform/main.tf @@ -0,0 +1,110 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.0" + } + } +} +provider "aws" {} + +# Create EventBus Target +resource "aws_cloudwatch_event_bus" "target" { + name = "demo_bus" +} + +# Create SQS Source +resource "aws_sqs_queue" "source" { + name = "demo_queue" +} + +# Create EventBridge Pipe +resource "aws_pipes_pipe" "demo_pipe" { + name = "demo_pipe" + role_arn = aws_iam_role.demo_role.arn + source = aws_sqs_queue.source.arn + target = aws_cloudwatch_event_bus.target.arn + source_parameters { + sqs_queue_parameters { + batch_size = 1 + maximum_batching_window_in_seconds = 2 + } + filter_criteria { + filter { + pattern = jsonencode({ + "body":{"type":["NEW"]} + }) + } + } + } + target_parameters { + eventbridge_event_bus_parameters { + source = "myapp.demo" + } + } +} + +# Create IAM role for EventBridge Pipe +resource "aws_iam_role" "demo_role" { + name = "demo_role" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Action = "sts:AssumeRole" + Effect = "Allow" + Sid = "" + Principal = { + Service = "pipes.amazonaws.com" + } + }, + ] + }) +} + +# Create an IAM policy for EventBridge Pipe +resource "aws_iam_policy" "demo_policy" { + name = "demo_policy" + policy = jsonencode({ + "Version": "2012-10-17", + "Statement": [ + { "Sid": "SourcePermissions", + "Effect": "Allow", + "Action": [ + "sqs:ReceiveMessage", + "sqs:DeleteMessage", + "sqs:GetQueueAttributes" + ], + "Resource": [ + aws_sqs_queue.source.arn + ] + }, + { "Sid": "TargetPermissions" + "Effect": "Allow", + "Action": [ + "events:PutEvents" + ], + "Resource": [ + aws_cloudwatch_event_bus.target.arn + ] + } + ] +}) + +# Attach the IAM policy to the IAM role +} +resource "aws_iam_role_policy_attachment" "demo-attach" { + role = aws_iam_role.demo_role.name + policy_arn = aws_iam_policy.demo_policy.arn +} + +output "SQS_url" { + value = aws_sqs_queue.source.url + description = "The URL of the SQS queue." +} + +output "Pipes_arn" { + value = aws_pipes_pipe.demo_pipe.arn + description = "The ARN of the Pipe." +} + From 79f556ceecca01dae4783ad280c6082f52c84734 Mon Sep 17 00:00:00 2001 From: Chaitanya Gummadi <62628013+chaitanyagummadi@users.noreply.github.com> Date: Thu, 24 Oct 2024 08:12:51 -0500 Subject: [PATCH 2/4] Update eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json Co-authored-by: Ben <9841563+bfreiberg@users.noreply.github.com> --- .../example-pattern.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json b/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json index c0461b37b..874142876 100644 --- a/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json +++ b/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json @@ -17,7 +17,7 @@ "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-pipes-sqs-to-eventbus-terraform", "templateURL": "serverless-patterns/eventbridge-pipes-sqs-to-eventbus-terraform", "projectFolder": "eventbridge-pipes-sqs-to-eventbus-terraform", - "templateFile": "eventbridge-pipes-sqs-to-eventbus-terraform/main.tf" + "templateFile": "main.tf" } }, "resources": { From a61f6202f7f249c9e35c42794516ed8807d7deda Mon Sep 17 00:00:00 2001 From: Chaitanya Gummadi <62628013+chaitanyagummadi@users.noreply.github.com> Date: Thu, 24 Oct 2024 08:13:02 -0500 Subject: [PATCH 3/4] Update eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json Co-authored-by: Ben <9841563+bfreiberg@users.noreply.github.com> --- .../example-pattern.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json b/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json index 874142876..8b7b956ac 100644 --- a/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json +++ b/eventbridge-pipes-sqs-to-eventbus-terraform/example-pattern.json @@ -45,7 +45,7 @@ }, "cleanup": { "text": [ - "terraform destroy" + "terraform destroy" ] }, "authors": [ From 5b0843b7fb66894b61b9383595c7d9432d3d8d99 Mon Sep 17 00:00:00 2001 From: Ben <9841563+bfreiberg@users.noreply.github.com> Date: Wed, 20 Nov 2024 10:20:56 +0100 Subject: [PATCH 4/4] Add final pattern file --- ...ridge-pipes-sqs-to-eventbus-terraform.json | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 eventbridge-pipes-sqs-to-eventbus-terraform/eventbridge-pipes-sqs-to-eventbus-terraform.json diff --git a/eventbridge-pipes-sqs-to-eventbus-terraform/eventbridge-pipes-sqs-to-eventbus-terraform.json b/eventbridge-pipes-sqs-to-eventbus-terraform/eventbridge-pipes-sqs-to-eventbus-terraform.json new file mode 100644 index 000000000..e64867d9e --- /dev/null +++ b/eventbridge-pipes-sqs-to-eventbus-terraform/eventbridge-pipes-sqs-to-eventbus-terraform.json @@ -0,0 +1,89 @@ +{ + "title": "Amazon SQS to Amazon EventBridge event bus using Amazon EventBridge Pipes", + "description": "This pattern creates an Amazon EventBridge Pipe to deliver messages from an Amazon SQS queue to Amazon EventBridge Event Bus.", + "language": "", + "level": "200", + "framework": "Terraform", + "introBox": { + "headline": "How it works", + "text": [ + "Amazon EventBridge Pipe routes events from an Amazon SQS queue to a custom EventBridge event bus while applying filters.", + "This filtering capability enables you to create precise event processing pipelines, ensuring that only relevant events are propagated to downstream systems.", + "Then, other AWS services that are supported as EventBridge targets can consume these events from the EventBus by adding an EventBridge rule with relevant targets." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-pipes-sqs-to-eventbus-terraform", + "templateURL": "serverless-patterns/eventbridge-pipes-sqs-to-eventbus-terraform", + "projectFolder": "eventbridge-pipes-sqs-to-eventbus-terraform", + "templateFile": "main.tf" + } + }, + "resources": { + "bullets": [ + { + "text": "EventBridge Pipes with SQS queue as a source", + "link": "https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes-sqs.html" + }, + { + "text": "Amazon EventBridge Pipes architectural patterns blog post", + "link": "https://aws.amazon.com/blogs/compute/implementing-architectural-patterns-with-amazon-eventbridge-pipes/" + } + ] + }, + "deploy": { + "text": [ + "terraform init", + "terraform apply" + ] + }, + "testing": { + "text": [ + "See the README in the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "terraform destroy" + ] + }, + "authors": [ + { + "name": "Chaitanya Gummadi", + "image": "https://gravatar.com/avatar/a9b30c6e727f613f3f44a44016e36998719404ea7451c750f402a21f2dd72937.jpg?size=256", + "bio": "Chaitanya is a Senior Cloud Support Engineer with Amazon Web Services (AWS) based in Texas.", + "linkedin": "cgummadi" + } + ], + "patternArch": { + "icon1": { + "x": 20, + "y": 50, + "service": "sqs", + "label": "Amazon SQS queue" + }, + "icon2": { + "x": 50, + "y": 50, + "service": "eventbridge-pipes", + "label": "EventBridge pipe" + }, + "icon3": { + "x": 80, + "y": 50, + "service": "eventbridge", + "label": "EventBridge bus" + }, + "line1": { + "from": "icon1", + "to": "icon2", + "label": "" + }, + "line2": { + "from": "icon2", + "to": "icon3", + "label": "" + } + } +}