Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added EventBridge Scheduler to Step Functions Pattern #1489

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions eventbridge-schedule-to-step-function-terraform/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# EventBridge Scheduler to Step Functions

This pattern uses EventBridge Scheduler to start the execution of a Step Functions State Machine every minute.

Learn more about this pattern at Serverless Land Patterns: https://serverlessland.com/patterns/eventbridge-schedule-to-step-function-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 Installed](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
* [Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started) 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
```
1. Change directory to the pattern directory:
```
cd eventbridge-schedule-to-step-function-terraform
```
1. From the command line, initialize terraform to to downloads and installs the providers defined in the configuration:
```
terraform init
```
1. From the command line, apply the configuration in the main.tf file:
```
terraform apply
```
1. During the prompts:
* Enter yes
1. Note the outputs from the deployment process. These contain the resource names and/or ARNs which are used for testing.

## How it works

This Terraform template creates a Step Functions State Machine with a simple "Pass" state that gets executed every minute.

## Testing

After running `terraform apply`, go to the Step Functions console. Find your Step Functions State Machine "my-state-machine", and under the "Executions" section you should find the successful executions.

## Cleanup

1. Change directory to the pattern directory:
```
cd eventbridge-schedule-to-step-function-terraform
```
2. Delete all created resources by terraform
```bash
terraform destroy
```
3. During the prompts:
* Enter yes
4. Confirm all created resources has been deleted
```bash
terraform show
```
----
Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.

SPDX-License-Identifier: MIT-0
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
"title": "EventBridge Scheduler to Step Functions",
"description": "Create an EventBridge Scheduler that executes a Step Functions State Machine",
"language": "Python",
"level": "200",
"framework": "Terraform",
"introBox": {
"headline": "How it works",
"text": [
"This template deploys an EventBridge Scheduler that triggers the execution of a Step Functions State Machine every minute"
]
},
"gitHub": {
"template": {
"repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-schedule-to-step-function-terraform",
"templateURL": "serverless-patterns/eventbridge-schedule-to-step-function-terraform",
"projectFolder": "eventbridge-schedule-to-step-function-terraform",
"templateFile": "eventbridge-schedule-to-step-function-terraform/main.tf"
}
},
"resources": {
"bullets": [{
"text": "Introducing Amazon EventBridge Scheduler",
"link": "https://aws.amazon.com/blogs/compute/introducing-amazon-eventbridge-scheduler/"
},
{
"text": "Use Amazon EventBridge to Build Decoupled, Event-Driven Architectures",
"link": "https://serverlessland.com/learn/eventbridge"
}
]
},
"deploy": {
"text": [
"terraform init",
"terraform apply"
]
},
"testing": {
"text": [
"See the README in the Github repo for detailed instructions."
]
},
"cleanup": {
"text": [
"terraform destroy",
"terraform show"
]
},
"authors": [{
"name": "Francesco Vergona",
"image": "",
"bio": "Solutions Architect, AWS",
"linkedin": "https://www.linkedin.com/in/francesco-vergona/"
}]
}
130 changes: 130 additions & 0 deletions eventbridge-schedule-to-step-function-terraform/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.22"
}
}
required_version = ">= 0.14.9"
}

provider "aws" {
profile = "default"
region = "us-east-1"
}

data "aws_caller_identity" "current" {}

# Create new IAM Policy and Role for EventBridge Scheduler
resource "aws_iam_policy" "eb_access_policy" {
name = "eb-access-policy"
description = "Policy for EventBridge Scheduler to trigger Step Functions"

policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = [
"states:StartExecution"
],
Effect = "Allow"
Resource = "${aws_sfn_state_machine.sfn_state_machine.arn}"
}
]
})
}

resource "aws_iam_role" "eventbridge_scheduler_iam_role" {
name_prefix = "eb-scheduler-role-"
managed_policy_arns = [aws_iam_policy.eb_access_policy.arn]
path = "/"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}

# Create new IAM Policy and Role for Step Function

resource "aws_iam_role" "sfn_iam_role" {
name = "sfn-iam-role"
managed_policy_arns = ["arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess"]
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "states.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}

# resource "aws_iam_role_policy_attachment" "step_function_role_attachment" {
# role = aws_iam_role.sfn_iam_role.name
# policy_arn = "arn:aws:iam::aws:policy/service-role/AWSStepFunctionsFullAccess"
# }

# Create new Step Function State Machine
resource "aws_sfn_state_machine" "sfn_state_machine" {
name = "my-state-machine"
role_arn = aws_iam_role.sfn_iam_role.arn

definition = <<EOF
{
"Comment": "A Hello World example of the Amazon States Language",
"StartAt": "HelloWorld",
"States": {
"HelloWorld": {
"Type": "Pass",
"End": true
}
}
}
EOF
}

# Create new Eventbridge Scheduler
resource "aws_scheduler_schedule" "my_scheduler" {
name = "my-scheduler"

flexible_time_window {
mode = "OFF"
}

schedule_expression = "rate(1 minutes)"

target {
arn = aws_sfn_state_machine.sfn_state_machine.arn
role_arn = aws_iam_role.eventbridge_scheduler_iam_role.arn

input = jsonencode({
Payload = "Hello, ServerlessLand!"
})
}
}

output "EventBridgeSchedulerArn" {
value = aws_scheduler_schedule.my_scheduler.arn
description = "EventBridge my-scheduler ARN"
}

output "StateMachineArn" {
value = aws_sfn_state_machine.sfn_state_machine.arn
description = "Step Function my-state-machine ARN"
}