diff --git a/ami-recycle-bin/ami-recycle-bin.json b/ami-recycle-bin/ami-recycle-bin.json deleted file mode 100644 index b69f89174..000000000 --- a/ami-recycle-bin/ami-recycle-bin.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "title": "AMI de-registration with AWS Lambda and retention in Amazon EC2 Recycle Bin", - "description": "This project demonstrates a pattern to deregister and retain expired AMI and its snapshot with AWS Lambda and Amazon EC2 Recycle Bin", - "language": "", - "level": "200", - "framework": "Terraform", - "introBox": { - "headline": "How it works", - "text": [ - "In this pattern an Amazon EventBridge rule triggers an AWS Lambda function which deregisters an Amazon Machine Image (AMI), deletes the associated snapshot and moves them to the Recycle Bin for retention.", - "The AWS Lambda function automates the expiration of Amazon Machine Images (AMIs) by moving the AMIs and their associated snapshots to Recycle Bin. Recycle Bin is a feature of Amazon Elastic Compute Cloud (EC2) that allows you to retain AMIs that you have de-registered for a specified retention period, providing an opportunity to recover them if needed. To recover the deleted AMI, its associated snapshot should be recovered first. The Lambda function also adds corresponding tags to both, the AMI and the EBS snapshot, before moving them to Recycle Bin." - ] - }, - "gitHub": { - "template": { - "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/ami-recycle-bin", - "templateURL": "serverless-patterns/ami-recycle-bin", - "projectFolder": "ami-recycle-bin", - "templateFile": "main.tf" - } - }, - "resources": { - "bullets": [ - { - "text": "Recover deleted Amazon EBS snapshots and EBS-backed AMIs with Recycle Bin", - "link": "https://docs.aws.amazon.com/ebs/latest/userguide/recycle-bin.html" - } - ] - }, - "deploy": { - "text": [ - "terraform init", - "terraform plan", - "terraform apply" - ] - }, - "testing": { - "text": [ - "See the Github repo for detailed testing instructions." - ] - }, - "cleanup": { - "text": [ - "terraform destroy" - ] - }, - "authors": [ - { - "name": "Divya Vijendra Girase", - "image": "https://avatars.githubusercontent.com/u/172667506?v=4", - "bio": "I am a Cloud Infrastructure Architect at AWS and I work with our strategic customers to build, run and maintain their infrastructure on AWS.", - "linkedin": "divya-girase" - } - ], - "patternArch": { - "icon1": { - "x": 20, - "y": 50, - "service": "eventbridge", - "label": "Amazon EventBridge rule" - }, - "icon2": { - "x": 50, - "y": 50, - "service": "lambda", - "label": "AWS Lambda" - }, - "icon3": { - "x": 80, - "y": 50, - "service": "ec2", - "label": "Amazon EC2" - }, - "line1": { - "from": "icon1", - "to": "icon2", - "label": "" - }, - "line2": { - "from": "icon2", - "to": "icon3", - "label": "" - } - } -} diff --git a/apigw-lambda-s3-terraform-java/apigw-lambda-s3-terraform-java.json b/apigw-lambda-s3-terraform-java/apigw-lambda-s3-terraform-java.json deleted file mode 100644 index a7309a9a6..000000000 --- a/apigw-lambda-s3-terraform-java/apigw-lambda-s3-terraform-java.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "title": "Upload file to Amazon S3 bucket using presigned URL", - "description": "Amazon API Gateway with AWS Lambda integration to showcase how to upload a file up to 5GB to Amazon S3 bucket using a presigned S3 URL.", - "language": "Java", - "level": "200", - "framework": "Terraform", - "introBox": { - "headline": "How it works", - "text": [ - "Amazon API Gateway receives the HTTP POST request containing the file name to be uploaded", - "AWS Lambda is triggered by the API Gateway, this java based function generates Amazon S3 presigned URL.", - "A Java program is used to upload a file to the Amazon S3 bucket using the presigned URL" - ] - }, - "gitHub": { - "template": { - "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/apigw-lambda-s3-terraform-java", - "templateURL": "serverless-patterns/apigw-lambda-s3-terraform-java", - "projectFolder": "apigw-lambda-s3-terraform-java", - "templateFile": "main.tf" - } - }, - "resources": { - "bullets": [ - { - "text": "Create a presigned URL for Amazon S3 using an AWS SDK", - "link": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_Scenario_PresignedUrl_section.html" - }, - { - "text": "Uploading objects with presigned URLs", - "link": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html" - } - ] - }, - "deploy": { - "text": [ - "mvn clean package", - "terraform init", - "terraform apply" - ] - }, - "testing": { - "text": [ - "See the GitHub repo for detailed testing instructions." - ] - }, - "cleanup": { - "text": [ - "Delete the Amazon S3 bucket content: aws s3 rm s3://{MyS3BucketName} --recursive", - "Delete the stack: terraform destroy." - ] - }, - "authors": [ - { - "name": "Jing Xiang Peh", - "image": "images/profile-pic.jpg", - "bio": "I am a Specialist Solutions Architect for Serveless based in Singapore", - "linkedin": "jing-xiang-peh" - } - ], - "patternArch": { - "icon1": { - "x": 20, - "y": 50, - "service": "apigw", - "label": "Amazon API Gateway" - }, - "icon2": { - "x": 50, - "y": 50, - "service": "lambda", - "label": "AWS Lambda" - }, - "icon3": { - "x": 80, - "y": 50, - "service": "s3", - "label": "Amazon S3 Bucket" - }, - "line1": { - "from": "icon1", - "to": "icon2", - "label": "" - }, - "line2": { - "from": "icon2", - "to": "icon3", - "label": "" - } - } -} diff --git a/apigw-lambda-s3-terraform-java/images/profile-pic.jpg b/apigw-lambda-s3-terraform-java/images/profile-pic.jpg deleted file mode 100644 index 89bf670e9..000000000 Binary files a/apigw-lambda-s3-terraform-java/images/profile-pic.jpg and /dev/null differ diff --git a/eventbridge-bedrock-s3-aoss/eventbridge-bedrock-s3-aoss.json b/eventbridge-bedrock-s3-aoss/eventbridge-bedrock-s3-aoss.json deleted file mode 100644 index 2d51cfcbe..000000000 --- a/eventbridge-bedrock-s3-aoss/eventbridge-bedrock-s3-aoss.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "title": "Automatic sync of Amazon Bedrock Knowledge Base using EventBridge Scheduler", - "description": "Use Amazon EventBridge Scheduler to trigger an Ingestion Job periodically to keep the Knowledge Bases vector store up-to-date", - "language": "Python", - "level": "200", - "framework": "CDK", - "introBox": { - "headline": "How it works", - "text": [ - "This sample project demonstrates how to use an EventBridge rule to periodically sync a Bedrock Knowledge Base data source to Amazon OpenSearch Serverless.", - "The sample project uses an EventBridge Scheduler that runs on a regular interval. The scheduler has a universal target configured to trigger the StartIngestionJob API on Amazon Bedrock Agent service. The StartIngestionJob runs a job to sync the data source to the Knowledge Base" - ] - }, - "gitHub": { - "template": { - "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-bedrock-s3-aoss", - "templateURL": "serverless-patterns/eventbridge-bedrock-s3-aoss", - "projectFolder": "eventbridge-bedrock-s3-aoss", - "templateFile": "app.py" - } - }, - "resources": { - "bullets": [ - { - "text": "Sync to ingest your data sources into the knowledge base", - "link": "https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-ingest.html" - }, - { - "text": "Knowledge bases for Amazon Bedrock", - "link": "https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html" - }, - { - "text": "What is Amazon EventBridge Scheduler?", - "link": "https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html" - } - ] - }, - "deploy": { - "text": [ - "cdk deploy --all" - ] - }, - "testing": { - "text": [ - "See the GitHub repo for detailed testing instructions." - ] - }, - "cleanup": { - "text": [ - "Delete the stack: cdk destroy." - ] - }, - "authors": [ - { - "name": "Raja Vaidyanathan", - "image": "https://avatars.githubusercontent.com/u/125882914?v=4", - "bio": "Solutions Architect @ AWS", - "linkedin": "rajav", - "twitter": "rajav" - } - ], - "patternArch": { - "icon1": { - "x": 20, - "y": 50, - "service": "eventbridge-scheduler", - "label": "Amazon EventBridge Scheduler" - }, - "icon2": { - "x": 50, - "y": 50, - "service": "bedrock", - "label": "Amazon Bedrock" - }, - "icon3": { - "x": 80, - "y": 50, - "service": "opensearch", - "label": "Amazon OpenSearch" - }, - "line1": { - "from": "icon1", - "to": "icon2", - "label": "Ingestion job" - }, - "line2": { - "from": "icon2", - "to": "icon3", - "label": "vectors" - } - } -} diff --git a/eventbridge-pipes-ddbstream-sfn-terraform/eventbridge-pipes-ddbstream-sfn-terraform.json b/eventbridge-pipes-ddbstream-sfn-terraform/eventbridge-pipes-ddbstream-sfn-terraform.json deleted file mode 100644 index a494c3ec5..000000000 --- a/eventbridge-pipes-ddbstream-sfn-terraform/eventbridge-pipes-ddbstream-sfn-terraform.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "title": "Amazon DynamoDB Stream to AWS Step Functions", - "description": "Invoke AWS Step Functions workflow from a Amazon DynamoDB stream message", - "language": "YAML", - "level": "200", - "framework": "Terraform", - "introBox": { - "headline": "Invoke a Step Functions workflow from a DynamoDB stream", - "text": [ - "This sample project demonstrates how to invoke an AWS Step Functions state machine directly from a DynamoDB Stream using Amazon EventBridge Pipes.", - "This pattern deploys one Step Function, one DynamoDB with stream enabled, and one Amazon EventBridge Pipe." - ] - }, - "gitHub": { - "template": { - "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-pipes-ddbstream-sfn-terraform", - "templateURL": "serverless-patterns/eventbridge-pipes-ddbstream-sfn-terraform", - "projectFolder": "eventbridge-pipes-ddbstream-sfn-terraform", - "templateFile": "main.tf" - } - }, - "resources": { - "bullets": [ - { - "text": "Amazon EventBridge Pipes - connects sources to targets.", - "link": "https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html" - } - ] - }, - "deploy": { - "text": [ - "terraform init", - "terraform apply" - ] - }, - "testing": { - "text": [ - "See the GitHub repo for detailed testing instructions." - ] - }, - "cleanup": { - "text": [ - "terraform destroy" - ] - }, - "authors": [ - { - "name": "Oriol Matavacas", - "image": "https://togithub.s3.eu-west-1.amazonaws.com/Oriol.jpg", - "bio": "Oriol Matavacas is a Sr. Solutions Architect at AWS based in Barcelona. Oriol primarily supporting customers on the journey to the Cloud. He enjoys building new solutions with scalability, availability and easy to maintain by using serverless.", - "linkedin": "oriol-matavacas-rodriguez-b165868a", - "twitter": "" - } - ], - "patternArch": { - "icon1": { - "x": 20, - "y": 50, - "service": "dynamodb", - "label": "Amazon DynamoDB" - }, - "icon2": { - "x": 50, - "y": 50, - "service": "eventbridge-pipes", - "label": "Amazon EventBridge Pipes" - }, - "icon3": { - "x": 80, - "y": 50, - "service": "sfn", - "label": "AWS Step Functions" - }, - "line1": { - "from": "icon1", - "to": "icon2", - "label": "Stream" - }, - "line2": { - "from": "icon2", - "to": "icon3" - } - } -} diff --git a/eventbridge-schedule-secret-rotation-cdk/eventbridge-schedule-secret-rotation-cdk.json b/eventbridge-schedule-secret-rotation-cdk/eventbridge-schedule-secret-rotation-cdk.json deleted file mode 100644 index 59726f7d7..000000000 --- a/eventbridge-schedule-secret-rotation-cdk/eventbridge-schedule-secret-rotation-cdk.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "title": "Secret rotation using Amazon EventBridge Scheduler and AWS Lambda", - "description": "Secret rotation in AMS Secrets Manager using Amazon EventBridge Scheduler and AWS Lambda", - "language": "Python", - "level": "200", - "framework": "CDK", - "introBox": { - "headline": "How it works", - "text": [ - "This sample project demonstrates rotating secrets in AWS Secrests Manager using Amazon EventBridge Scheduler and AWS Lambda at desired intervals for several use cases. e.g. rotating OAtuth tokens with limited lifespan.", - "An EventBridge schedule is created based on the 'Secret rotation schedule' CDK parameter with rotation Lambda as the target which does the job", - "You could provide the interval at which you want the secret to be rotated as a cron or rate expression." - ] - }, - "gitHub": { - "template": { - "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/eventbridge-schedule-secret-rotation-cdk", - "templateURL": "serverless-patterns/eventbridge-schedule-secret-rotation-cdk", - "projectFolder": "eventbridge-schedule-secret-rotation-cdk", - "templateFile": "cdk/eventbridge_schedule_secret_rotation_stack.py" - } - }, - "deploy": { - "text": [ - "cdk deploy" - ] - }, - "testing": { - "text": [ - "See the GitHub repo for detailed testing instructions." - ] - }, - "cleanup": { - "text": [ - "Delete the stack: cdk destroy." - ] - }, - "authors": [ - { - "name": "Senthil Mohan", - "image": "https://ca.slack-edge.com/E015GUGD2V6-U03JTLBU1HD-ffd97b7877e5-512", - "bio": "Senthil is a Solutions Architect at AWS working with ISVs in the UK to migrate, modernize and build their software products on AWS.", - "linkedin": "senthil-kumar-mohan" - }, - { - "name": "Shubhankar Sumar", - "image": "https://ca.slack-edge.com/E015GUGD2V6-W01BSTRT7EZ-3a3d16cf4fa5-192", - "bio": "Shubhankar is a Sr. Solutions Architect at AWS working with ISVs in the UK to build, run, and scale their software products on AWS.", - "linkedin": "shubhankar-sumar" - } - ], - "resources": { - "bullets": [ - { - "text": "Using cron and rate expressions to schedule rules in Amazon EventBridge", - "link": "https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-scheduled-rule-pattern.html" - }, - { - "text": "AWS Secrets Manager rotation template", - "link": "https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/blob/master/SecretsManagerRotationTemplate/lambda_function.py" - } - ] - }, - "patternArch": { - "icon1": { - "x": 20, - "y": 50, - "service": "eventbridge-scheduler", - "label": "Amazon EventBridge Scheduler" - }, - "icon2": { - "x": 50, - "y": 50, - "service": "lambda", - "label": "AWS Lambda" - }, - "icon3": { - "x": 80, - "y": 50, - "service": "secretsmanager", - "label": "AWS Secrets Manager" - }, - "line1": { - "from": "icon1", - "to": "icon2", - "label": "trigger" - }, - "line2": { - "from": "icon2", - "to": "icon3", - "label": "rotate secret" - } - } -} diff --git a/eventbridge-schedule-secret-rotation-cdk/example-pattern.json b/eventbridge-schedule-secret-rotation-cdk/example-pattern.json index 11688f7b0..ca1b1ab64 100644 --- a/eventbridge-schedule-secret-rotation-cdk/example-pattern.json +++ b/eventbridge-schedule-secret-rotation-cdk/example-pattern.json @@ -1,13 +1,13 @@ { "title": "Secret rotation using Amazon EventBridge Scheduler and AWS Lambda", - "description": "Secret rotation in AMS Secrets Manager using Amazon EventBridge Scheduler and AWS Lambda", + "description": "Secret rotation in AWS Secrets Manager using Amazon EventBridge Scheduler and AWS Lambda", "language": "Python", "level": "200", "framework": "CDK", "introBox": { "headline": "How it works", "text": [ - "This sample project demonstrates rotating secrets in AWS Secrests Manager using Amazon EventBridge Scheduler and AWS Lambda at desired intervals for several use cases. e.g. rotating OAtuth tokens with limited lifespan.", + "This sample project demonstrates rotating secrets in AWS Secrets Manager using Amazon EventBridge Scheduler and AWS Lambda at desired intervals for several use cases. e.g. rotating OAuth tokens with limited lifespan.", "An EventBridge schedule is created based on the 'Secret rotation schedule' CDK parameter with rotation Lambda as the target which does the job", "You could provide the interval at which you want the secret to be rotated as a cron or rate expression." ] diff --git a/private-apigw-cross-region/example-pattern.json b/private-apigw-cross-region/example-pattern.json index 61617e2eb..3a0c93983 100644 --- a/private-apigw-cross-region/example-pattern.json +++ b/private-apigw-cross-region/example-pattern.json @@ -1,13 +1,13 @@ { "title": "Private Amazon API Gateway REST API to be invoked from an AWS Lambda function in a different AWS Region", - "description": "This pattern creates a Private Amazon API Gateway REST API, along with an Interface VPC Endpoint in an AWS Region. Subsequently, it creates a VPC, a Lambda function, a Private Hosted Zone, and a VPC Peering Connection in a second AWS Region. Finally, the VPC Peering connection is created in the first AWS Region. This way, a client in an AWS Region can send requests to the Private API Gateway in a different AWS Region.", + "description": "This sample project demonstrates how to invoke a Private Amazon API Gateway REST API from a different AWS Region.", "language": "Python", "level": "300", "framework": "SAM", "introBox": { "headline": "How it works", "text": [ - "This sample project demonstrates how to invoke a Private Amazon API Gateway REST API from a different AWS Region." + "This pattern implements a cross-region private Amazon API Gateway REST API using an Interface VPC Endpoint and VPC peering." ] }, "gitHub": { diff --git a/private-apigw-cross-region/private-apigw-cross-region.json b/private-apigw-cross-region/private-apigw-cross-region.json deleted file mode 100644 index 568884850..000000000 --- a/private-apigw-cross-region/private-apigw-cross-region.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "title": "Cross-region private Amazon API Gateway REST API", - "description": " This pattern implements a cross-region private Amazon API Gateway REST API using an Interface VPC Endpoint and VPC peering.", - "language": "Python", - "level": "300", - "framework": "SAM", - "introBox": { - "headline": "How it works", - "text": [ - "This sample project demonstrates how to invoke a Private Amazon API Gateway REST API from a different AWS Region." - ] - }, - "gitHub": { - "template": { - "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/private-apigw-cross-region", - "templateURL": "serverless-patterns/private-apigw-cross-region", - "projectFolder": "private-apigw-cross-region", - "templateFile": "template1-regionA.yaml" - } - }, - "resources": { - "bullets": [ - { - "text": "Private APIs", - "link": "https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html" - }, - { - "text": "Private Hosted Zones", - "link": "https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html" - }, - { - "text": "VPC Peering", - "link": "https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html" - }, - { - "text": "VPC Endpoints", - "link": "https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html" - } - ] - }, - "deploy": { - "text": [ - "See the GitHub repo for detailed instructions." - ] - }, - "testing": { - "text": [ - "See the GitHub repo for detailed testing instructions." - ] - }, - "cleanup": { - "text": [ - "Delete the stack: sam delete." - ] - }, - "authors": [ - { - "name": "Luigi Napoleone Capasso", - "bio": "Luigi Napoleone Capasso is a Technical Account Manager at Amazon Web Services.", - "linkedin": "luigi-napoleone-capasso-0aa405147" - } - ], - "patternArch": { - "icon1": { - "x": 15, - "y": 50, - "service": "lambda", - "label": "AWS Lambda Requester" - }, - "icon2": { - "x": 45, - "y": 50, - "service": "vpc-endpoint", - "label": "Region B VPC Endpoint" - }, - "icon3": { - "x": 80, - "y": 50, - "service": "apigw", - "label": "Private API Gateway REST API" - }, - "line1": { - "from": "icon1", - "to": "icon2", - "label": "Request" - }, - "line2": { - "from": "icon2", - "to": "icon3", - "label": "Request" - } - } -} diff --git a/s3-eventbridge-fargate-cdk/s3-eventbirdge-fargate-cdk.json b/s3-eventbridge-fargate-cdk/example-pattern.json similarity index 76% rename from s3-eventbridge-fargate-cdk/s3-eventbirdge-fargate-cdk.json rename to s3-eventbridge-fargate-cdk/example-pattern.json index 38376b7ad..b75d7e850 100644 --- a/s3-eventbridge-fargate-cdk/s3-eventbirdge-fargate-cdk.json +++ b/s3-eventbridge-fargate-cdk/example-pattern.json @@ -58,35 +58,5 @@ "linkedin": "jeromevdl", "twitter": "jeromevdl" } - ], - "patternArch": { - "icon1": { - "x": 20, - "y": 50, - "service": "s3", - "label": "Amazon S3" - }, - "icon2": { - "x": 50, - "y": 50, - "service": "eventbridge", - "label": "Amazon EventBridge" - }, - "icon3": { - "x": 80, - "y": 50, - "service": "fargate", - "label": "AWS Fargate" - }, - "line1": { - "from": "icon1", - "to": "icon2", - "label": "Event" - }, - "line2": { - "from": "icon2", - "to": "icon3", - "label": "Rule" - } - } + ] } diff --git a/stepfunctions-sns-apigw-human-review/example-pattern.json b/stepfunctions-sns-apigw-human-review/example-pattern.json index 06fe937dc..f8ee90a24 100644 --- a/stepfunctions-sns-apigw-human-review/example-pattern.json +++ b/stepfunctions-sns-apigw-human-review/example-pattern.json @@ -1,20 +1,19 @@ { - "title": "Human review process using Amazon Step Functions.", - "description": "Integrate a human review process into your workflow.", - "language": "", - "level": "200", - "framework": "SAM", - "diagram":"/resources/statemachine.png", - "introBox": { - "headline": "How it works", - "text": [ - "This application will create a State Machine, an SNS topic, and an API Gateway REST API.", - "The State Machine sends a message to an SNS topic which sends a notification to a human reviewer by email. The workflow then waits until the approver completes their review. When the reviewer makes a selection, it will trigger an API that sends the SendTaskSuccess API call with the chosen result.", - "Waiting for completion of the review is done using the .waitForTaskToken service integration. The payload of the SNS message contains a task token, which is automatically generated by AWS Step Functions.", - "The task will pause until it receives that task token back with a SendTaskSuccess or SendTaskFailure API call." - - ] - }, + "title": "Human review process using AWS Step Functions.", + "description": "Integrate a human review process into your workflow.", + "language": "", + "level": "200", + "framework": "SAM", + "diagram": "/resources/statemachine.png", + "introBox": { + "headline": "How it works", + "text": [ + "The application will create a AWS Step Functions State Machine, an Amazon SNS topic, and an Amazon API Gateway REST API.", + "The State Machine sends a message to an SNS topic which sends a notification to a human reviewer by email. The workflow then waits until the approver completes their review. When the reviewer makes a selection, it will trigger an API that sends the SendTaskSuccess API call with the chosen result.", + "Waiting for completion of the review is done using the .waitForTaskToken service integration. The payload of the SNS message contains a task token, which is automatically generated by AWS Step Functions.", + "The task will pause until it receives that task token back with a SendTaskSuccess or SendTaskFailure API call." + ] + }, "gitHub": { "template": { "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/stepfunctions-sns-apigw-human-review",