From 53704adee97cab64314ea1a5ab36907a3b4fb73e Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Fri, 4 Apr 2025 21:26:10 +1300 Subject: [PATCH 01/20] initial commit --- typescript/eventbridge-mesh/.gitignore | 11 +++ typescript/eventbridge-mesh/.npmignore | 6 ++ typescript/eventbridge-mesh/README.md | 14 +++ typescript/eventbridge-mesh/cdk.json | 90 +++++++++++++++++++ typescript/eventbridge-mesh/jest.config.js | 8 ++ typescript/eventbridge-mesh/lib/app.ts | 20 +++++ .../lib/eventbridge-mesh-stack.ts | 16 ++++ typescript/eventbridge-mesh/package.json | 26 ++++++ .../test/eventbridge-mesh.test.ts | 17 ++++ typescript/eventbridge-mesh/tsconfig.json | 31 +++++++ 10 files changed, 239 insertions(+) create mode 100644 typescript/eventbridge-mesh/.gitignore create mode 100644 typescript/eventbridge-mesh/.npmignore create mode 100644 typescript/eventbridge-mesh/README.md create mode 100644 typescript/eventbridge-mesh/cdk.json create mode 100644 typescript/eventbridge-mesh/jest.config.js create mode 100644 typescript/eventbridge-mesh/lib/app.ts create mode 100644 typescript/eventbridge-mesh/lib/eventbridge-mesh-stack.ts create mode 100644 typescript/eventbridge-mesh/package.json create mode 100644 typescript/eventbridge-mesh/test/eventbridge-mesh.test.ts create mode 100644 typescript/eventbridge-mesh/tsconfig.json diff --git a/typescript/eventbridge-mesh/.gitignore b/typescript/eventbridge-mesh/.gitignore new file mode 100644 index 0000000000..977f943d1d --- /dev/null +++ b/typescript/eventbridge-mesh/.gitignore @@ -0,0 +1,11 @@ +*.js +!jest.config.js +*.d.ts +node_modules + +# CDK asset staging directory +.cdk.staging +cdk.out + +package-lock.json + diff --git a/typescript/eventbridge-mesh/.npmignore b/typescript/eventbridge-mesh/.npmignore new file mode 100644 index 0000000000..c1d6d45dcf --- /dev/null +++ b/typescript/eventbridge-mesh/.npmignore @@ -0,0 +1,6 @@ +*.ts +!*.d.ts + +# CDK asset staging directory +.cdk.staging +cdk.out diff --git a/typescript/eventbridge-mesh/README.md b/typescript/eventbridge-mesh/README.md new file mode 100644 index 0000000000..9315fe5b9f --- /dev/null +++ b/typescript/eventbridge-mesh/README.md @@ -0,0 +1,14 @@ +# Welcome to your CDK TypeScript project + +This is a blank project for CDK development with TypeScript. + +The `cdk.json` file tells the CDK Toolkit how to execute your app. + +## Useful commands + +* `npm run build` compile typescript to js +* `npm run watch` watch for changes and compile +* `npm run test` perform the jest unit tests +* `npx cdk deploy` deploy this stack to your default AWS account/region +* `npx cdk diff` compare deployed stack with current state +* `npx cdk synth` emits the synthesized CloudFormation template diff --git a/typescript/eventbridge-mesh/cdk.json b/typescript/eventbridge-mesh/cdk.json new file mode 100644 index 0000000000..c7ff1ab18e --- /dev/null +++ b/typescript/eventbridge-mesh/cdk.json @@ -0,0 +1,90 @@ +{ + "app": "npx ts-node --prefer-ts-exts lib/app.ts", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, + "@aws-cdk/aws-eks:nodegroupNameAttribute": true, + "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, + "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, + "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false, + "@aws-cdk/aws-s3:keepNotificationInImportedBucket": false, + "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": false, + "@aws-cdk/aws-ecs:disableEcsImdsBlocking": true, + "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": true, + "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": true, + "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": true, + "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": true, + "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": true, + "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": true, + "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": true, + "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": true, + "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": true, + "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": true, + "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": true, + "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": true, + "@aws-cdk/core:enableAdditionalMetadataCollection": true, + "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": true, + "@aws-cdk/aws-s3:setUniqueReplicationRoleName": true, + "@aws-cdk/aws-events:requireEventBusPolicySid": true + } +} diff --git a/typescript/eventbridge-mesh/jest.config.js b/typescript/eventbridge-mesh/jest.config.js new file mode 100644 index 0000000000..08263b8954 --- /dev/null +++ b/typescript/eventbridge-mesh/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + testEnvironment: 'node', + roots: ['/test'], + testMatch: ['**/*.test.ts'], + transform: { + '^.+\\.tsx?$': 'ts-jest' + } +}; diff --git a/typescript/eventbridge-mesh/lib/app.ts b/typescript/eventbridge-mesh/lib/app.ts new file mode 100644 index 0000000000..fe8b39c80e --- /dev/null +++ b/typescript/eventbridge-mesh/lib/app.ts @@ -0,0 +1,20 @@ +#!/usr/bin/env node +import * as cdk from 'aws-cdk-lib'; +import { EventbridgeMeshStack } from '../lib/eventbridge-mesh-stack'; + +const app = new cdk.App(); +new EventbridgeMeshStack(app, 'EventbridgeMeshStack', { + /* If you don't specify 'env', this stack will be environment-agnostic. + * Account/Region-dependent features and context lookups will not work, + * but a single synthesized template can be deployed anywhere. */ + + /* Uncomment the next line to specialize this stack for the AWS Account + * and Region that are implied by the current CLI configuration. */ + // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, + + /* Uncomment the next line if you know exactly what Account and Region you + * want to deploy the stack to. */ + // env: { account: '123456789012', region: 'us-east-1' }, + + /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ +}); \ No newline at end of file diff --git a/typescript/eventbridge-mesh/lib/eventbridge-mesh-stack.ts b/typescript/eventbridge-mesh/lib/eventbridge-mesh-stack.ts new file mode 100644 index 0000000000..cff05a169e --- /dev/null +++ b/typescript/eventbridge-mesh/lib/eventbridge-mesh-stack.ts @@ -0,0 +1,16 @@ +import * as cdk from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +// import * as sqs from 'aws-cdk-lib/aws-sqs'; + +export class EventbridgeMeshStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + + // The code that defines your stack goes here + + // example resource + // const queue = new sqs.Queue(this, 'EventbridgeMeshQueue', { + // visibilityTimeout: cdk.Duration.seconds(300) + // }); + } +} diff --git a/typescript/eventbridge-mesh/package.json b/typescript/eventbridge-mesh/package.json new file mode 100644 index 0000000000..e31b7411b1 --- /dev/null +++ b/typescript/eventbridge-mesh/package.json @@ -0,0 +1,26 @@ +{ + "name": "eventbridge-mesh", + "version": "0.1.0", + "bin": { + "eventbridge-mesh": "bin/eventbridge-mesh.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "@types/node": "22.7.9", + "jest": "^29.7.0", + "ts-jest": "^29.2.5", + "aws-cdk": "2.1007.0", + "ts-node": "^10.9.2", + "typescript": "~5.6.3" + }, + "dependencies": { + "aws-cdk-lib": "2.186.0", + "constructs": "^10.0.0" + } +} diff --git a/typescript/eventbridge-mesh/test/eventbridge-mesh.test.ts b/typescript/eventbridge-mesh/test/eventbridge-mesh.test.ts new file mode 100644 index 0000000000..9aa0f52058 --- /dev/null +++ b/typescript/eventbridge-mesh/test/eventbridge-mesh.test.ts @@ -0,0 +1,17 @@ +// import * as cdk from 'aws-cdk-lib'; +// import { Template } from 'aws-cdk-lib/assertions'; +// import * as EventbridgeMesh from '../lib/eventbridge-mesh-stack'; + +// example test. To run these tests, uncomment this file along with the +// example resource in lib/eventbridge-mesh-stack.ts +test('SQS Queue Created', () => { +// const app = new cdk.App(); +// // WHEN +// const stack = new EventbridgeMesh.EventbridgeMeshStack(app, 'MyTestStack'); +// // THEN +// const template = Template.fromStack(stack); + +// template.hasResourceProperties('AWS::SQS::Queue', { +// VisibilityTimeout: 300 +// }); +}); diff --git a/typescript/eventbridge-mesh/tsconfig.json b/typescript/eventbridge-mesh/tsconfig.json new file mode 100644 index 0000000000..aaa7dc510f --- /dev/null +++ b/typescript/eventbridge-mesh/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": [ + "es2020", + "dom" + ], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "typeRoots": [ + "./node_modules/@types" + ] + }, + "exclude": [ + "node_modules", + "cdk.out" + ] +} From 05be0c8b6b41d39620fef7ab3c45c29645abe7e8 Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Fri, 4 Apr 2025 22:21:06 +1300 Subject: [PATCH 02/20] created single producer and consumer solution --- typescript/eventbridge-mesh/lib/app.ts | 32 +++++++------ .../lib/eventbridge-mesh-stack.ts | 16 ------- .../lib/single-consumer-stack.ts | 45 +++++++++++++++++++ .../lib/single-producer-stack.ts | 42 +++++++++++++++++ 4 files changed, 106 insertions(+), 29 deletions(-) delete mode 100644 typescript/eventbridge-mesh/lib/eventbridge-mesh-stack.ts create mode 100644 typescript/eventbridge-mesh/lib/single-consumer-stack.ts create mode 100644 typescript/eventbridge-mesh/lib/single-producer-stack.ts diff --git a/typescript/eventbridge-mesh/lib/app.ts b/typescript/eventbridge-mesh/lib/app.ts index fe8b39c80e..588c1de2b8 100644 --- a/typescript/eventbridge-mesh/lib/app.ts +++ b/typescript/eventbridge-mesh/lib/app.ts @@ -1,20 +1,26 @@ #!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; -import { EventbridgeMeshStack } from '../lib/eventbridge-mesh-stack'; +import { consumerStack } from './single-consumer-stack'; +import { producerStack } from './single-producer-stack'; const app = new cdk.App(); -new EventbridgeMeshStack(app, 'EventbridgeMeshStack', { - /* If you don't specify 'env', this stack will be environment-agnostic. - * Account/Region-dependent features and context lookups will not work, - * but a single synthesized template can be deployed anywhere. */ - /* Uncomment the next line to specialize this stack for the AWS Account - * and Region that are implied by the current CLI configuration. */ - // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, +const region = 'us-east-1' +const producerAccountId = '111111111111'; +const consumerAccountId = '222222222222'; - /* Uncomment the next line if you know exactly what Account and Region you - * want to deploy the stack to. */ - // env: { account: '123456789012', region: 'us-east-1' }, +new producerStack(app, 'producerStack', { + env: { + account: producerAccountId, + region: region, + }, + consumerAccountId, +}); - /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ -}); \ No newline at end of file +new consumerStack(app, 'consumerStack', { + env: { + account: consumerAccountId, + region: region, + }, + producerAccountId, +}); diff --git a/typescript/eventbridge-mesh/lib/eventbridge-mesh-stack.ts b/typescript/eventbridge-mesh/lib/eventbridge-mesh-stack.ts deleted file mode 100644 index cff05a169e..0000000000 --- a/typescript/eventbridge-mesh/lib/eventbridge-mesh-stack.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -// import * as sqs from 'aws-cdk-lib/aws-sqs'; - -export class EventbridgeMeshStack extends cdk.Stack { - constructor(scope: Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); - - // The code that defines your stack goes here - - // example resource - // const queue = new sqs.Queue(this, 'EventbridgeMeshQueue', { - // visibilityTimeout: cdk.Duration.seconds(300) - // }); - } -} diff --git a/typescript/eventbridge-mesh/lib/single-consumer-stack.ts b/typescript/eventbridge-mesh/lib/single-consumer-stack.ts new file mode 100644 index 0000000000..5d65b234e7 --- /dev/null +++ b/typescript/eventbridge-mesh/lib/single-consumer-stack.ts @@ -0,0 +1,45 @@ +import * as cdk from 'aws-cdk-lib'; +import { EventBus, EventBusPolicy, Rule } from 'aws-cdk-lib/aws-events'; +import { CloudWatchLogGroup } from 'aws-cdk-lib/aws-events-targets'; +import { AccountPrincipal, Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam'; +import { LogGroup } from 'aws-cdk-lib/aws-logs'; +import { Construct } from 'constructs'; + +export interface consumerStackProps extends cdk.StackProps { + readonly producerAccountId: string; +} + +export class consumerStack extends cdk.Stack { + constructor(scope: Construct, id: string, props: consumerStackProps) { + super(scope, id, props); + + // Create or reference the consumer event bus + const consumerEventBus = new EventBus(this, 'ConsumerEventBus'); + + // Add policy to allow producer account to put events + consumerEventBus.addToResourcePolicy(new PolicyStatement({ + sid: 'allowProducerAccount', + effect: Effect.ALLOW, + principals: [new AccountPrincipal(props.producerAccountId)], + actions: ['events:PutEvents'], + resources: [consumerEventBus.eventBusArn] + })); + + // Create consumer rules + const consumerRule = new Rule(this, 'ConsumerRule', { + eventBus: consumerEventBus, + eventPattern: { + // Define more specific filtering here + source: ['com.myapp.events'], + detail: { + type: ['specific-event-type'] + } + } + }); + + // Add target (e.g., CloudWatch) + consumerRule.addTarget(new CloudWatchLogGroup( + new LogGroup(this, 'ConsumerLogs') + )); + } +} diff --git a/typescript/eventbridge-mesh/lib/single-producer-stack.ts b/typescript/eventbridge-mesh/lib/single-producer-stack.ts new file mode 100644 index 0000000000..36b50f7bc0 --- /dev/null +++ b/typescript/eventbridge-mesh/lib/single-producer-stack.ts @@ -0,0 +1,42 @@ +import * as cdk from 'aws-cdk-lib'; +import * as targets from 'aws-cdk-lib/aws-events-targets'; +import { EventBus, Rule } from 'aws-cdk-lib/aws-events'; +import { LogGroup } from 'aws-cdk-lib/aws-logs'; +import { Construct } from 'constructs'; + +export interface producerStackProps extends cdk.StackProps { + readonly consumerAccountId: string; +} + +export class producerStack extends cdk.Stack { + constructor(scope: Construct, id: string, props: producerStackProps) { + super(scope, id, props); + + // Create the EventBus + const producerEventBus = new EventBus(this, 'ProducerEventBus'); + + // Create rule to forward events to consumer account + const rule = new Rule(this, 'ForwardToConsumerRule', { + eventBus: producerEventBus, + eventPattern: { + // Define your event pattern here + source: ['com.myapp.events'], + }, + }); + + // Add target to forward to consumer account's event bus + rule.addTarget(new targets.EventBus( + EventBus.fromEventBusArn( + this, + 'ConsumerEventBus', + `arn:aws:events:${cdk.Stack.of(this).region}:${props.consumerAccountId}:event-bus/default` + ) + )); + + // Optional: Add CloudWatch target for monitoring + rule.addTarget(new targets.CloudWatchLogGroup( + new LogGroup(this, 'producerLogs') + )); + } + } + \ No newline at end of file From 624eaef85523d64d73d8c03b174112a5a3ec8949 Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Fri, 4 Apr 2025 22:27:43 +1300 Subject: [PATCH 03/20] added images and updated README --- typescript/eventbridge-mesh/README.md | 22 ++++++++++-------- .../images/multi-consumers.png | Bin 0 -> 56578 bytes .../images/single-consumer.png | Bin 0 -> 50121 bytes 3 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 typescript/eventbridge-mesh/images/multi-consumers.png create mode 100644 typescript/eventbridge-mesh/images/single-consumer.png diff --git a/typescript/eventbridge-mesh/README.md b/typescript/eventbridge-mesh/README.md index 9315fe5b9f..b3bca4d6df 100644 --- a/typescript/eventbridge-mesh/README.md +++ b/typescript/eventbridge-mesh/README.md @@ -1,14 +1,16 @@ -# Welcome to your CDK TypeScript project +# CDK Sample: Event Bridge mesh with CDK -This is a blank project for CDK development with TypeScript. +## Description +A CDK way to set up a Event Bridge Mesh, where you relay the messages from one Event Bridge in a producer account to another Event Bridge in a consumer account -The `cdk.json` file tells the CDK Toolkit how to execute your app. +## Backgroud -## Useful commands -* `npm run build` compile typescript to js -* `npm run watch` watch for changes and compile -* `npm run test` perform the jest unit tests -* `npx cdk deploy` deploy this stack to your default AWS account/region -* `npx cdk diff` compare deployed stack with current state -* `npx cdk synth` emits the synthesized CloudFormation template +## Solution + + +### Single consumer + + +### Multiple consumers + diff --git a/typescript/eventbridge-mesh/images/multi-consumers.png b/typescript/eventbridge-mesh/images/multi-consumers.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4ad38478d526ccd20432387b3235c0b9e60538 GIT binary patch literal 56578 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 literal 0 HcmV?d00001 diff --git a/typescript/eventbridge-mesh/images/single-consumer.png b/typescript/eventbridge-mesh/images/single-consumer.png new file mode 100644 index 0000000000000000000000000000000000000000..a3daa8b2f73c77c0350fab438941b0cc88020532 GIT binary patch literal 50121 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

9sUn{-j>7Db7dN|B$Bwa(fF_4vL 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 F{{wzgY<>U$ literal 0 HcmV?d00001 From c35917a0824ffcae2c5d1375f293aaacd5ec47ed Mon Sep 17 00:00:00 2001 From: Jacky Fan <104741984+jfan9@users.noreply.github.com> Date: Fri, 4 Apr 2025 22:30:21 +1300 Subject: [PATCH 04/20] added images in README.md --- typescript/eventbridge-mesh/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/eventbridge-mesh/README.md b/typescript/eventbridge-mesh/README.md index b3bca4d6df..8665f6cc35 100644 --- a/typescript/eventbridge-mesh/README.md +++ b/typescript/eventbridge-mesh/README.md @@ -10,7 +10,7 @@ A CDK way to set up a Event Bridge Mesh, where you relay the messages from one E ### Single consumer - +![architecture](./images/single-consumer.png) ### Multiple consumers - +![architecture](./images/multi-consumers.png) From 05794d20d0e154f70a895ccef04544a46575baee Mon Sep 17 00:00:00 2001 From: Jacky Fan <104741984+jfan9@users.noreply.github.com> Date: Fri, 4 Apr 2025 22:49:17 +1300 Subject: [PATCH 05/20] added background in README.md --- typescript/eventbridge-mesh/README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/typescript/eventbridge-mesh/README.md b/typescript/eventbridge-mesh/README.md index 8665f6cc35..71cebcb8e4 100644 --- a/typescript/eventbridge-mesh/README.md +++ b/typescript/eventbridge-mesh/README.md @@ -1,13 +1,16 @@ # CDK Sample: Event Bridge mesh with CDK -## Description -A CDK way to set up a Event Bridge Mesh, where you relay the messages from one Event Bridge in a producer account to another Event Bridge in a consumer account +## Description: +A CDK way to set up a Event Bridge Mesh(Cross-Account), where you relay the messages from one Event Bridge in a producer account to another Event Bridge in a consumer account -## Backgroud +## Backgroud: +This is a CDK application that implements cross-account event routing using Amazon EventBridge. It's designed for enterprise scenarios where: +- Teams work in separate AWS accounts (producer and consumer) +- Consumer teams need autonomy to manage their event processing +- Event routing changes shouldn't require coordination with producer teams -## Solution - +## Solution: ### Single consumer ![architecture](./images/single-consumer.png) From 1503eaa3cf6aa568f9dc09e61283613e44c1cb7e Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Fri, 4 Apr 2025 23:12:50 +1300 Subject: [PATCH 06/20] added appName for all resources --- typescript/eventbridge-mesh/lib/app.ts | 12 +++++++----- .../eventbridge-mesh/lib/single-consumer-stack.ts | 7 ++++--- .../eventbridge-mesh/lib/single-producer-stack.ts | 7 ++++--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/typescript/eventbridge-mesh/lib/app.ts b/typescript/eventbridge-mesh/lib/app.ts index 588c1de2b8..d73079b148 100644 --- a/typescript/eventbridge-mesh/lib/app.ts +++ b/typescript/eventbridge-mesh/lib/app.ts @@ -4,23 +4,25 @@ import { consumerStack } from './single-consumer-stack'; import { producerStack } from './single-producer-stack'; const app = new cdk.App(); - +const appName = 'eventbridge-mesh' const region = 'us-east-1' -const producerAccountId = '111111111111'; -const consumerAccountId = '222222222222'; +const producerAccountId = '123510061335'; +const consumerAccountId = '737719307477'; -new producerStack(app, 'producerStack', { +new producerStack(app, `${appName}-producer-stack`, { env: { account: producerAccountId, region: region, }, + appName, consumerAccountId, }); -new consumerStack(app, 'consumerStack', { +new consumerStack(app, `${appName}-consumer-stack`, { env: { account: consumerAccountId, region: region, }, + appName, producerAccountId, }); diff --git a/typescript/eventbridge-mesh/lib/single-consumer-stack.ts b/typescript/eventbridge-mesh/lib/single-consumer-stack.ts index 5d65b234e7..a5b8d9a401 100644 --- a/typescript/eventbridge-mesh/lib/single-consumer-stack.ts +++ b/typescript/eventbridge-mesh/lib/single-consumer-stack.ts @@ -6,6 +6,7 @@ import { LogGroup } from 'aws-cdk-lib/aws-logs'; import { Construct } from 'constructs'; export interface consumerStackProps extends cdk.StackProps { + readonly appName: string; readonly producerAccountId: string; } @@ -14,7 +15,7 @@ export class consumerStack extends cdk.Stack { super(scope, id, props); // Create or reference the consumer event bus - const consumerEventBus = new EventBus(this, 'ConsumerEventBus'); + const consumerEventBus = new EventBus(this, `${props.appName}-consumer-event-bus`); // Add policy to allow producer account to put events consumerEventBus.addToResourcePolicy(new PolicyStatement({ @@ -26,7 +27,7 @@ export class consumerStack extends cdk.Stack { })); // Create consumer rules - const consumerRule = new Rule(this, 'ConsumerRule', { + const consumerRule = new Rule(this, `${props.appName}-consumer-rule`, { eventBus: consumerEventBus, eventPattern: { // Define more specific filtering here @@ -39,7 +40,7 @@ export class consumerStack extends cdk.Stack { // Add target (e.g., CloudWatch) consumerRule.addTarget(new CloudWatchLogGroup( - new LogGroup(this, 'ConsumerLogs') + new LogGroup(this, `${props.appName}-consumer-logs`) )); } } diff --git a/typescript/eventbridge-mesh/lib/single-producer-stack.ts b/typescript/eventbridge-mesh/lib/single-producer-stack.ts index 36b50f7bc0..9bbc7ae83a 100644 --- a/typescript/eventbridge-mesh/lib/single-producer-stack.ts +++ b/typescript/eventbridge-mesh/lib/single-producer-stack.ts @@ -5,6 +5,7 @@ import { LogGroup } from 'aws-cdk-lib/aws-logs'; import { Construct } from 'constructs'; export interface producerStackProps extends cdk.StackProps { + readonly appName: string; readonly consumerAccountId: string; } @@ -13,10 +14,10 @@ export class producerStack extends cdk.Stack { super(scope, id, props); // Create the EventBus - const producerEventBus = new EventBus(this, 'ProducerEventBus'); + const producerEventBus = new EventBus(this, `${props.appName}-producer-event-bus`); // Create rule to forward events to consumer account - const rule = new Rule(this, 'ForwardToConsumerRule', { + const rule = new Rule(this, `${props.appName}-forward-to-consumer-rule`, { eventBus: producerEventBus, eventPattern: { // Define your event pattern here @@ -35,7 +36,7 @@ export class producerStack extends cdk.Stack { // Optional: Add CloudWatch target for monitoring rule.addTarget(new targets.CloudWatchLogGroup( - new LogGroup(this, 'producerLogs') + new LogGroup(this, `${props.appName}-producer-logs`) )); } } From b7711117b6977e6e223eacdecb022a66f5fb8e29 Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Fri, 4 Apr 2025 23:35:42 +1300 Subject: [PATCH 07/20] moved to single-consumer directory --- .../eventbridge-mesh/single-consumer/cdk.json | 90 ++++++++++++++ .../eventbridge-mesh/single-consumer/index.ts | 110 ++++++++++++++++++ .../single-consumer/package.json | 23 ++++ .../single-consumer/tsconfig.json | 31 +++++ 4 files changed, 254 insertions(+) create mode 100644 typescript/eventbridge-mesh/single-consumer/cdk.json create mode 100644 typescript/eventbridge-mesh/single-consumer/index.ts create mode 100644 typescript/eventbridge-mesh/single-consumer/package.json create mode 100644 typescript/eventbridge-mesh/single-consumer/tsconfig.json diff --git a/typescript/eventbridge-mesh/single-consumer/cdk.json b/typescript/eventbridge-mesh/single-consumer/cdk.json new file mode 100644 index 0000000000..c538cdb7a5 --- /dev/null +++ b/typescript/eventbridge-mesh/single-consumer/cdk.json @@ -0,0 +1,90 @@ +{ + "app": "npx ts-node --prefer-ts-exts index.ts", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, + "@aws-cdk/aws-eks:nodegroupNameAttribute": true, + "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, + "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, + "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false, + "@aws-cdk/aws-s3:keepNotificationInImportedBucket": false, + "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": false, + "@aws-cdk/aws-ecs:disableEcsImdsBlocking": true, + "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": true, + "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": true, + "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": true, + "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": true, + "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": true, + "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": true, + "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": true, + "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": true, + "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": true, + "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": true, + "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": true, + "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": true, + "@aws-cdk/core:enableAdditionalMetadataCollection": true, + "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": true, + "@aws-cdk/aws-s3:setUniqueReplicationRoleName": true, + "@aws-cdk/aws-events:requireEventBusPolicySid": true + } +} diff --git a/typescript/eventbridge-mesh/single-consumer/index.ts b/typescript/eventbridge-mesh/single-consumer/index.ts new file mode 100644 index 0000000000..d19af9c510 --- /dev/null +++ b/typescript/eventbridge-mesh/single-consumer/index.ts @@ -0,0 +1,110 @@ +import * as cdk from 'aws-cdk-lib'; +import * as targets from 'aws-cdk-lib/aws-events-targets'; +import { EventBus, Rule } from 'aws-cdk-lib/aws-events'; +import { LogGroup } from 'aws-cdk-lib/aws-logs'; +import { CloudWatchLogGroup } from 'aws-cdk-lib/aws-events-targets'; +import { AccountPrincipal, Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam'; +import { Construct } from 'constructs'; + +export interface producerStackProps extends cdk.StackProps { + readonly appName: string; + readonly consumerAccountId: string; +} + +export interface consumerStackProps extends cdk.StackProps { + readonly appName: string; + readonly producerAccountId: string; +} + +export class producerStack extends cdk.Stack { + constructor(scope: Construct, id: string, props: producerStackProps) { + super(scope, id, props); + + // Create the EventBus + const producerEventBus = new EventBus(this, `${props.appName}-producer-event-bus`); + + // Create rule to forward events to consumer account + const rule = new Rule(this, `${props.appName}-forward-to-consumer-rule`, { + eventBus: producerEventBus, + eventPattern: { + // Define your event pattern here + source: ['com.myapp.events'], + }, + }); + + // Add target to forward to consumer account's event bus + rule.addTarget(new targets.EventBus( + EventBus.fromEventBusArn( + this, + 'ConsumerEventBus', + `arn:aws:events:${cdk.Stack.of(this).region}:${props.consumerAccountId}:event-bus/default` + ) + )); + + // Optional: Add CloudWatch target for monitoring + rule.addTarget(new targets.CloudWatchLogGroup( + new LogGroup(this, `${props.appName}-producer-logs`) + )); + } + } + + export class consumerStack extends cdk.Stack { + constructor(scope: Construct, id: string, props: consumerStackProps) { + super(scope, id, props); + + // Create or reference the consumer event bus + const consumerEventBus = new EventBus(this, `${props.appName}-consumer-event-bus`); + + // Add policy to allow producer account to put events + consumerEventBus.addToResourcePolicy(new PolicyStatement({ + sid: 'allowProducerAccount', + effect: Effect.ALLOW, + principals: [new AccountPrincipal(props.producerAccountId)], + actions: ['events:PutEvents'], + resources: [consumerEventBus.eventBusArn] + })); + + // Create consumer rules + const consumerRule = new Rule(this, `${props.appName}-consumer-rule`, { + eventBus: consumerEventBus, + eventPattern: { + // Define more specific filtering here + source: ['com.myapp.events'], + detail: { + type: ['specific-event-type'] + } + } + }); + + // Add target (e.g., CloudWatch) + consumerRule.addTarget(new CloudWatchLogGroup( + new LogGroup(this, `${props.appName}-consumer-logs`) + )); + } + } + + const app = new cdk.App(); + const appName = 'eventbridge-mesh'; + const region = 'us-east-1'; + const producerAccountId = '123510061335'; + const consumerAccountId = '737719307477'; + + new producerStack(app, `${appName}-producer-stack`, { + env: { + account: producerAccountId, + region: region, + }, + appName, + consumerAccountId, + }); + + new consumerStack(app, `${appName}-consumer-stack`, { + env: { + account: consumerAccountId, + region: region, + }, + appName, + producerAccountId, + }); + + app.synth(); diff --git a/typescript/eventbridge-mesh/single-consumer/package.json b/typescript/eventbridge-mesh/single-consumer/package.json new file mode 100644 index 0000000000..56004d5752 --- /dev/null +++ b/typescript/eventbridge-mesh/single-consumer/package.json @@ -0,0 +1,23 @@ +{ + "name": "eventbridge-mesh", + "version": "0.1.0", + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "@types/node": "22.7.9", + "jest": "^29.7.0", + "ts-jest": "^29.2.5", + "aws-cdk": "2.1007.0", + "ts-node": "^10.9.2", + "typescript": "~5.6.3" + }, + "dependencies": { + "aws-cdk-lib": "2.186.0", + "constructs": "^10.0.0" + } +} diff --git a/typescript/eventbridge-mesh/single-consumer/tsconfig.json b/typescript/eventbridge-mesh/single-consumer/tsconfig.json new file mode 100644 index 0000000000..aaa7dc510f --- /dev/null +++ b/typescript/eventbridge-mesh/single-consumer/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": [ + "es2020", + "dom" + ], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "typeRoots": [ + "./node_modules/@types" + ] + }, + "exclude": [ + "node_modules", + "cdk.out" + ] +} From 87b507ff9f9b47592d7e3c9a85a2467817252821 Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Sat, 5 Apr 2025 00:08:45 +1300 Subject: [PATCH 08/20] added multiple consumers solution --- .../multiple-consumers/cdk.json | 10 ++ .../multiple-consumers/index.ts | 122 ++++++++++++++++++ .../multiple-consumers/package.json | 23 ++++ .../multiple-consumers/tsconfig.json | 31 +++++ .../eventbridge-mesh/single-consumer/cdk.json | 89 +------------ .../eventbridge-mesh/single-consumer/index.ts | 8 +- 6 files changed, 194 insertions(+), 89 deletions(-) create mode 100644 typescript/eventbridge-mesh/multiple-consumers/cdk.json create mode 100644 typescript/eventbridge-mesh/multiple-consumers/index.ts create mode 100644 typescript/eventbridge-mesh/multiple-consumers/package.json create mode 100644 typescript/eventbridge-mesh/multiple-consumers/tsconfig.json diff --git a/typescript/eventbridge-mesh/multiple-consumers/cdk.json b/typescript/eventbridge-mesh/multiple-consumers/cdk.json new file mode 100644 index 0000000000..13b73af643 --- /dev/null +++ b/typescript/eventbridge-mesh/multiple-consumers/cdk.json @@ -0,0 +1,10 @@ +{ + "app": "npx ts-node --prefer-ts-exts index.ts", + "context": { + "appName": "eventbridge-mesh", + "region": "us-east-1", + "producerAccountId": "111111111111", + "consumer1AccountId": "222222222222", + "consumer2AccountId": "333333333333" + } +} diff --git a/typescript/eventbridge-mesh/multiple-consumers/index.ts b/typescript/eventbridge-mesh/multiple-consumers/index.ts new file mode 100644 index 0000000000..dffe62f799 --- /dev/null +++ b/typescript/eventbridge-mesh/multiple-consumers/index.ts @@ -0,0 +1,122 @@ +import * as cdk from 'aws-cdk-lib'; +import * as targets from 'aws-cdk-lib/aws-events-targets'; +import { EventBus, Rule } from 'aws-cdk-lib/aws-events'; +import { LogGroup } from 'aws-cdk-lib/aws-logs'; +import { CloudWatchLogGroup } from 'aws-cdk-lib/aws-events-targets'; +import { AccountPrincipal, Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam'; +import { Construct } from 'constructs'; + +export interface producerStackProps extends cdk.StackProps { + readonly appName: string; + readonly consumerAccounts: string[]; +} + +export interface consumerStackProps extends cdk.StackProps { + readonly appName: string; + readonly consumerName: string; + readonly producerAccountId: string; +} + +export class producerStack extends cdk.Stack { + constructor(scope: Construct, id: string, props: producerStackProps) { + super(scope, id, props); + + // Create the EventBus + const producerEventBus = new EventBus(this, `${props.appName}-producer-event-bus`); + + props.consumerAccounts.forEach((consumerAccountId, index) => { + // Create rule to forward events to consumer account + const rule = new Rule(this, `${props.appName}-forward-to-consumer-${index + 1}-rule`, { + eventBus: producerEventBus, + eventPattern: { + // Define your event pattern here + source: ['com.myapp.events'], + }, + }); + + // Add target to forward to consumer account's event bus + rule.addTarget(new targets.EventBus( + EventBus.fromEventBusArn( + this, + `${props.appName}-consumer-${index + 1}-event-bus`, + `arn:aws:events:${cdk.Stack.of(this).region}:${consumerAccountId}:event-bus/default` + ) + )); + }); + } +} + +export class consumerStack extends cdk.Stack { + constructor(scope: Construct, id: string, props: consumerStackProps) { + super(scope, id, props); + + // Create or reference the consumer event bus + const consumerEventBus = new EventBus(this, `${props.appName}-${props.consumerName}-event-bus`); + + // Add policy to allow producer account to put events + consumerEventBus.addToResourcePolicy(new PolicyStatement({ + sid: 'allowProducerAccount', + effect: Effect.ALLOW, + principals: [new AccountPrincipal(props.producerAccountId)], + actions: ['events:PutEvents'], + resources: [consumerEventBus.eventBusArn] + })); + + // Create consumer rules + const consumerRule = new Rule(this, `${props.appName}-${props.consumerName}-rule`, { + eventBus: consumerEventBus, + eventPattern: { + // Define more specific filtering here + source: ['com.myapp.events'], + detail: { + type: ['specific-event-type'] + } + } + }); + + // Add target (e.g., CloudWatch) + consumerRule.addTarget(new CloudWatchLogGroup( + new LogGroup(this, `${props.appName}-${props.consumerName}-logs`) + )); + } +} + +const app = new cdk.App(); +const appName = app.node.tryGetContext('appName'); +const region = app.node.tryGetContext('region'); +const producerAccountId = app.node.tryGetContext('producerAccountId'); +const consumer1AccountId = app.node.tryGetContext('consumer1AccountId'); +const consumer2AccountId = app.node.tryGetContext('consumer2AccountId'); + +new producerStack(app, `${appName}-producer-stack`, { + env: { + account: producerAccountId, + region: region, + }, + appName, + consumerAccounts: [consumer1AccountId, consumer2AccountId], +}); + +// Deploy consumer 1 stack +new consumerStack(app, `${appName}-consumer1-stack`, { + env: { + account: consumer1AccountId, + region: region, + }, + appName, + producerAccountId, + consumerName: 'consumer1' +}); + +// Deploy consumer 2 stack +new consumerStack(app, `${appName}-consumer2-stack`, { + env: { + account: consumer2AccountId, + region: region, + }, + appName, + producerAccountId, + consumerName: 'consumer2' +}); + +app.synth(); diff --git a/typescript/eventbridge-mesh/multiple-consumers/package.json b/typescript/eventbridge-mesh/multiple-consumers/package.json new file mode 100644 index 0000000000..56004d5752 --- /dev/null +++ b/typescript/eventbridge-mesh/multiple-consumers/package.json @@ -0,0 +1,23 @@ +{ + "name": "eventbridge-mesh", + "version": "0.1.0", + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "@types/node": "22.7.9", + "jest": "^29.7.0", + "ts-jest": "^29.2.5", + "aws-cdk": "2.1007.0", + "ts-node": "^10.9.2", + "typescript": "~5.6.3" + }, + "dependencies": { + "aws-cdk-lib": "2.186.0", + "constructs": "^10.0.0" + } +} diff --git a/typescript/eventbridge-mesh/multiple-consumers/tsconfig.json b/typescript/eventbridge-mesh/multiple-consumers/tsconfig.json new file mode 100644 index 0000000000..aaa7dc510f --- /dev/null +++ b/typescript/eventbridge-mesh/multiple-consumers/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": [ + "es2020", + "dom" + ], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "typeRoots": [ + "./node_modules/@types" + ] + }, + "exclude": [ + "node_modules", + "cdk.out" + ] +} diff --git a/typescript/eventbridge-mesh/single-consumer/cdk.json b/typescript/eventbridge-mesh/single-consumer/cdk.json index c538cdb7a5..f593a9b66e 100644 --- a/typescript/eventbridge-mesh/single-consumer/cdk.json +++ b/typescript/eventbridge-mesh/single-consumer/cdk.json @@ -1,90 +1,9 @@ { "app": "npx ts-node --prefer-ts-exts index.ts", - "watch": { - "include": [ - "**" - ], - "exclude": [ - "README.md", - "cdk*.json", - "**/*.d.ts", - "**/*.js", - "tsconfig.json", - "package*.json", - "yarn.lock", - "node_modules", - "test" - ] - }, "context": { - "@aws-cdk/aws-lambda:recognizeLayerVersion": true, - "@aws-cdk/core:checkSecretUsage": true, - "@aws-cdk/core:target-partitions": [ - "aws", - "aws-cn" - ], - "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, - "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, - "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, - "@aws-cdk/aws-iam:minimizePolicies": true, - "@aws-cdk/core:validateSnapshotRemovalPolicy": true, - "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, - "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, - "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, - "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, - "@aws-cdk/core:enablePartitionLiterals": true, - "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, - "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, - "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, - "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, - "@aws-cdk/aws-route53-patters:useCertificate": true, - "@aws-cdk/customresources:installLatestAwsSdkDefault": false, - "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, - "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, - "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, - "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, - "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, - "@aws-cdk/aws-redshift:columnId": true, - "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, - "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, - "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, - "@aws-cdk/aws-kms:aliasNameRef": true, - "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, - "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, - "@aws-cdk/aws-efs:denyAnonymousAccess": true, - "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, - "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, - "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, - "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, - "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, - "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, - "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, - "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, - "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, - "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, - "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, - "@aws-cdk/aws-eks:nodegroupNameAttribute": true, - "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, - "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, - "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false, - "@aws-cdk/aws-s3:keepNotificationInImportedBucket": false, - "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": false, - "@aws-cdk/aws-ecs:disableEcsImdsBlocking": true, - "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": true, - "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": true, - "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": true, - "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": true, - "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": true, - "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": true, - "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": true, - "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": true, - "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": true, - "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": true, - "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": true, - "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": true, - "@aws-cdk/core:enableAdditionalMetadataCollection": true, - "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": true, - "@aws-cdk/aws-s3:setUniqueReplicationRoleName": true, - "@aws-cdk/aws-events:requireEventBusPolicySid": true + "appName": "eventbridge-mesh", + "region": "us-east-1", + "producerAccountId": "111111111111", + "consumerAccountId": "222222222222" } } diff --git a/typescript/eventbridge-mesh/single-consumer/index.ts b/typescript/eventbridge-mesh/single-consumer/index.ts index d19af9c510..ff0f967113 100644 --- a/typescript/eventbridge-mesh/single-consumer/index.ts +++ b/typescript/eventbridge-mesh/single-consumer/index.ts @@ -84,10 +84,10 @@ export class producerStack extends cdk.Stack { } const app = new cdk.App(); - const appName = 'eventbridge-mesh'; - const region = 'us-east-1'; - const producerAccountId = '123510061335'; - const consumerAccountId = '737719307477'; + const appName = app.node.tryGetContext('appName'); + const region = app.node.tryGetContext('region'); + const producerAccountId = app.node.tryGetContext('producerAccountId'); + const consumerAccountId = app.node.tryGetContext('consumer1AccountId'); new producerStack(app, `${appName}-producer-stack`, { env: { From 17c50749fa31d7d60acfb1c0ea3f83d68e918aca Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Sat, 5 Apr 2025 00:10:30 +1300 Subject: [PATCH 09/20] clean up un-used files --- typescript/eventbridge-mesh/cdk.json | 90 ------------------- typescript/eventbridge-mesh/jest.config.js | 8 -- typescript/eventbridge-mesh/lib/app.ts | 28 ------ .../lib/single-consumer-stack.ts | 46 ---------- .../lib/single-producer-stack.ts | 43 --------- typescript/eventbridge-mesh/package.json | 26 ------ typescript/eventbridge-mesh/tsconfig.json | 31 ------- 7 files changed, 272 deletions(-) delete mode 100644 typescript/eventbridge-mesh/cdk.json delete mode 100644 typescript/eventbridge-mesh/jest.config.js delete mode 100644 typescript/eventbridge-mesh/lib/app.ts delete mode 100644 typescript/eventbridge-mesh/lib/single-consumer-stack.ts delete mode 100644 typescript/eventbridge-mesh/lib/single-producer-stack.ts delete mode 100644 typescript/eventbridge-mesh/package.json delete mode 100644 typescript/eventbridge-mesh/tsconfig.json diff --git a/typescript/eventbridge-mesh/cdk.json b/typescript/eventbridge-mesh/cdk.json deleted file mode 100644 index c7ff1ab18e..0000000000 --- a/typescript/eventbridge-mesh/cdk.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "app": "npx ts-node --prefer-ts-exts lib/app.ts", - "watch": { - "include": [ - "**" - ], - "exclude": [ - "README.md", - "cdk*.json", - "**/*.d.ts", - "**/*.js", - "tsconfig.json", - "package*.json", - "yarn.lock", - "node_modules", - "test" - ] - }, - "context": { - "@aws-cdk/aws-lambda:recognizeLayerVersion": true, - "@aws-cdk/core:checkSecretUsage": true, - "@aws-cdk/core:target-partitions": [ - "aws", - "aws-cn" - ], - "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, - "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, - "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, - "@aws-cdk/aws-iam:minimizePolicies": true, - "@aws-cdk/core:validateSnapshotRemovalPolicy": true, - "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, - "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, - "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, - "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, - "@aws-cdk/core:enablePartitionLiterals": true, - "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, - "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, - "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, - "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, - "@aws-cdk/aws-route53-patters:useCertificate": true, - "@aws-cdk/customresources:installLatestAwsSdkDefault": false, - "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, - "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, - "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, - "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, - "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, - "@aws-cdk/aws-redshift:columnId": true, - "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, - "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, - "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, - "@aws-cdk/aws-kms:aliasNameRef": true, - "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, - "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, - "@aws-cdk/aws-efs:denyAnonymousAccess": true, - "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, - "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, - "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, - "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, - "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, - "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, - "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, - "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, - "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, - "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, - "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, - "@aws-cdk/aws-eks:nodegroupNameAttribute": true, - "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, - "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, - "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false, - "@aws-cdk/aws-s3:keepNotificationInImportedBucket": false, - "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": false, - "@aws-cdk/aws-ecs:disableEcsImdsBlocking": true, - "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": true, - "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": true, - "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": true, - "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": true, - "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": true, - "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": true, - "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": true, - "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": true, - "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": true, - "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": true, - "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": true, - "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": true, - "@aws-cdk/core:enableAdditionalMetadataCollection": true, - "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": true, - "@aws-cdk/aws-s3:setUniqueReplicationRoleName": true, - "@aws-cdk/aws-events:requireEventBusPolicySid": true - } -} diff --git a/typescript/eventbridge-mesh/jest.config.js b/typescript/eventbridge-mesh/jest.config.js deleted file mode 100644 index 08263b8954..0000000000 --- a/typescript/eventbridge-mesh/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - testEnvironment: 'node', - roots: ['/test'], - testMatch: ['**/*.test.ts'], - transform: { - '^.+\\.tsx?$': 'ts-jest' - } -}; diff --git a/typescript/eventbridge-mesh/lib/app.ts b/typescript/eventbridge-mesh/lib/app.ts deleted file mode 100644 index d73079b148..0000000000 --- a/typescript/eventbridge-mesh/lib/app.ts +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env node -import * as cdk from 'aws-cdk-lib'; -import { consumerStack } from './single-consumer-stack'; -import { producerStack } from './single-producer-stack'; - -const app = new cdk.App(); -const appName = 'eventbridge-mesh' -const region = 'us-east-1' -const producerAccountId = '123510061335'; -const consumerAccountId = '737719307477'; - -new producerStack(app, `${appName}-producer-stack`, { - env: { - account: producerAccountId, - region: region, - }, - appName, - consumerAccountId, -}); - -new consumerStack(app, `${appName}-consumer-stack`, { - env: { - account: consumerAccountId, - region: region, - }, - appName, - producerAccountId, -}); diff --git a/typescript/eventbridge-mesh/lib/single-consumer-stack.ts b/typescript/eventbridge-mesh/lib/single-consumer-stack.ts deleted file mode 100644 index a5b8d9a401..0000000000 --- a/typescript/eventbridge-mesh/lib/single-consumer-stack.ts +++ /dev/null @@ -1,46 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { EventBus, EventBusPolicy, Rule } from 'aws-cdk-lib/aws-events'; -import { CloudWatchLogGroup } from 'aws-cdk-lib/aws-events-targets'; -import { AccountPrincipal, Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam'; -import { LogGroup } from 'aws-cdk-lib/aws-logs'; -import { Construct } from 'constructs'; - -export interface consumerStackProps extends cdk.StackProps { - readonly appName: string; - readonly producerAccountId: string; -} - -export class consumerStack extends cdk.Stack { - constructor(scope: Construct, id: string, props: consumerStackProps) { - super(scope, id, props); - - // Create or reference the consumer event bus - const consumerEventBus = new EventBus(this, `${props.appName}-consumer-event-bus`); - - // Add policy to allow producer account to put events - consumerEventBus.addToResourcePolicy(new PolicyStatement({ - sid: 'allowProducerAccount', - effect: Effect.ALLOW, - principals: [new AccountPrincipal(props.producerAccountId)], - actions: ['events:PutEvents'], - resources: [consumerEventBus.eventBusArn] - })); - - // Create consumer rules - const consumerRule = new Rule(this, `${props.appName}-consumer-rule`, { - eventBus: consumerEventBus, - eventPattern: { - // Define more specific filtering here - source: ['com.myapp.events'], - detail: { - type: ['specific-event-type'] - } - } - }); - - // Add target (e.g., CloudWatch) - consumerRule.addTarget(new CloudWatchLogGroup( - new LogGroup(this, `${props.appName}-consumer-logs`) - )); - } -} diff --git a/typescript/eventbridge-mesh/lib/single-producer-stack.ts b/typescript/eventbridge-mesh/lib/single-producer-stack.ts deleted file mode 100644 index 9bbc7ae83a..0000000000 --- a/typescript/eventbridge-mesh/lib/single-producer-stack.ts +++ /dev/null @@ -1,43 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import * as targets from 'aws-cdk-lib/aws-events-targets'; -import { EventBus, Rule } from 'aws-cdk-lib/aws-events'; -import { LogGroup } from 'aws-cdk-lib/aws-logs'; -import { Construct } from 'constructs'; - -export interface producerStackProps extends cdk.StackProps { - readonly appName: string; - readonly consumerAccountId: string; -} - -export class producerStack extends cdk.Stack { - constructor(scope: Construct, id: string, props: producerStackProps) { - super(scope, id, props); - - // Create the EventBus - const producerEventBus = new EventBus(this, `${props.appName}-producer-event-bus`); - - // Create rule to forward events to consumer account - const rule = new Rule(this, `${props.appName}-forward-to-consumer-rule`, { - eventBus: producerEventBus, - eventPattern: { - // Define your event pattern here - source: ['com.myapp.events'], - }, - }); - - // Add target to forward to consumer account's event bus - rule.addTarget(new targets.EventBus( - EventBus.fromEventBusArn( - this, - 'ConsumerEventBus', - `arn:aws:events:${cdk.Stack.of(this).region}:${props.consumerAccountId}:event-bus/default` - ) - )); - - // Optional: Add CloudWatch target for monitoring - rule.addTarget(new targets.CloudWatchLogGroup( - new LogGroup(this, `${props.appName}-producer-logs`) - )); - } - } - \ No newline at end of file diff --git a/typescript/eventbridge-mesh/package.json b/typescript/eventbridge-mesh/package.json deleted file mode 100644 index e31b7411b1..0000000000 --- a/typescript/eventbridge-mesh/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "eventbridge-mesh", - "version": "0.1.0", - "bin": { - "eventbridge-mesh": "bin/eventbridge-mesh.js" - }, - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "test": "jest", - "cdk": "cdk" - }, - "devDependencies": { - "@types/jest": "^29.5.14", - "@types/node": "22.7.9", - "jest": "^29.7.0", - "ts-jest": "^29.2.5", - "aws-cdk": "2.1007.0", - "ts-node": "^10.9.2", - "typescript": "~5.6.3" - }, - "dependencies": { - "aws-cdk-lib": "2.186.0", - "constructs": "^10.0.0" - } -} diff --git a/typescript/eventbridge-mesh/tsconfig.json b/typescript/eventbridge-mesh/tsconfig.json deleted file mode 100644 index aaa7dc510f..0000000000 --- a/typescript/eventbridge-mesh/tsconfig.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "module": "commonjs", - "lib": [ - "es2020", - "dom" - ], - "declaration": true, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - "inlineSourceMap": true, - "inlineSources": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "typeRoots": [ - "./node_modules/@types" - ] - }, - "exclude": [ - "node_modules", - "cdk.out" - ] -} From 9ccad1cb58dac9248852588d7d41bca278e2b81e Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Sat, 5 Apr 2025 00:10:47 +1300 Subject: [PATCH 10/20] remove test dir --- .../test/eventbridge-mesh.test.ts | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 typescript/eventbridge-mesh/test/eventbridge-mesh.test.ts diff --git a/typescript/eventbridge-mesh/test/eventbridge-mesh.test.ts b/typescript/eventbridge-mesh/test/eventbridge-mesh.test.ts deleted file mode 100644 index 9aa0f52058..0000000000 --- a/typescript/eventbridge-mesh/test/eventbridge-mesh.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -// import * as cdk from 'aws-cdk-lib'; -// import { Template } from 'aws-cdk-lib/assertions'; -// import * as EventbridgeMesh from '../lib/eventbridge-mesh-stack'; - -// example test. To run these tests, uncomment this file along with the -// example resource in lib/eventbridge-mesh-stack.ts -test('SQS Queue Created', () => { -// const app = new cdk.App(); -// // WHEN -// const stack = new EventbridgeMesh.EventbridgeMeshStack(app, 'MyTestStack'); -// // THEN -// const template = Template.fromStack(stack); - -// template.hasResourceProperties('AWS::SQS::Queue', { -// VisibilityTimeout: 300 -// }); -}); From 6143616c9d1b965a2826eb691140ebd7f51afa5c Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Sat, 5 Apr 2025 00:21:04 +1300 Subject: [PATCH 11/20] added instructions of how to deploy --- typescript/eventbridge-mesh/README.md | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/typescript/eventbridge-mesh/README.md b/typescript/eventbridge-mesh/README.md index 71cebcb8e4..5965df495d 100644 --- a/typescript/eventbridge-mesh/README.md +++ b/typescript/eventbridge-mesh/README.md @@ -17,3 +17,34 @@ This is a CDK application that implements cross-account event routing using Amaz ### Multiple consumers ![architecture](./images/multi-consumers.png) + + +## Instructions + +### Single consumer: +1. Run: `cd single-consumer` +2. Change the values of `producerAccountId` and `consumerAccountId` in `cdk.json` +3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html +```ruby +npm run build + +cdk ls + +cdk synth + +cdk deploy --all +``` + +### Multiple consumers: +1. Run: `cd multiple-consumer` +2. Change the values of `producerAccountId`, `consumer1AccountId`, and `consumer2AccountId` in `cdk.json` +3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html +```ruby +npm run build + +cdk ls + +cdk synth + +cdk deploy --all +``` From a4f4947b4d8867922857ac1f686c59cace3e8a93 Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Sat, 5 Apr 2025 18:55:34 +1300 Subject: [PATCH 12/20] added single-consumer solution in python --- python/eventbridge-mesh/README.md | 71 +++++++++++ .../eventbridge-mesh/single-consumer/app.py | 111 ++++++++++++++++++ .../eventbridge-mesh/single-consumer/cdk.json | 10 ++ .../single-consumer/requirements.txt | 2 + 4 files changed, 194 insertions(+) create mode 100644 python/eventbridge-mesh/README.md create mode 100644 python/eventbridge-mesh/single-consumer/app.py create mode 100644 python/eventbridge-mesh/single-consumer/cdk.json create mode 100644 python/eventbridge-mesh/single-consumer/requirements.txt diff --git a/python/eventbridge-mesh/README.md b/python/eventbridge-mesh/README.md new file mode 100644 index 0000000000..59a2aafe45 --- /dev/null +++ b/python/eventbridge-mesh/README.md @@ -0,0 +1,71 @@ +# CDK Python Sample: Event Bridge mesh with CDK + +![Language-Support: Stable](https://img.shields.io/badge/language--support-stable-success.svg?style=for-the-badge) + +## Description: +A CDK way to set up a Event Bridge Mesh(Cross-Account), where you relay the messages from one Event Bridge in a producer account to another Event Bridge in a consumer account + +## Backgroud: +This is a CDK application that implements cross-account event routing using Amazon EventBridge. It's designed for enterprise scenarios where: + +- Teams work in separate AWS accounts (producer and consumer) +- Consumer teams need autonomy to manage their event processing +- Event routing changes shouldn't require coordination with producer teams + +## Solution: + +### Single consumer +![architecture](./images/single-consumer.png) + +### Multiple consumers +![architecture](./images/multi-consumers.png) + + +## Instructions + +### CDK bootstrapping +To deploy the stacks in different accounts, you need to bootstrap the CDKToolkit with trust flag. Assuming you will run `cdk deploy` command from account ID: `000000000000`, and deploys producer stack to account ID: `111111111111`, and consumer stack to account ID: `222222222222` + +1. In account: `111111111111`, run the below command: +``` +cdk bootstrap aws://111111111111/us-east-1 \ + --trust 000000000000 \ + --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess +``` + +2. In account: `222222222222`, run the below command: +``` +cdk bootstrap aws://222222222222/us-east-1 \ + --trust 000000000000 \ + --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess +``` + +### Deploy Single consumer solution: +1. Run: `cd single-consumer` +2. Change the values of `producerAccountId` and `consumerAccountId` in `cdk.json` +3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html +4. Make sure you use a role or user has proper permission in account ID: `000000000000`, and run below commands: +```ruby +npm run build + +cdk ls + +cdk synth + +cdk deploy --all +``` + +### Deploy Multiple consumers solution: +1. Run: `cd multiple-consumer` +2. Change the values of `producerAccountId`, `consumer1AccountId`, and `consumer2AccountId` in `cdk.json` +3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html +4. Make sure you use a role or user has proper permission in account ID: `000000000000`, and run below commands: +```ruby +npm run build + +cdk ls + +cdk synth + +cdk deploy --all +``` diff --git a/python/eventbridge-mesh/single-consumer/app.py b/python/eventbridge-mesh/single-consumer/app.py new file mode 100644 index 0000000000..b5b6c338f4 --- /dev/null +++ b/python/eventbridge-mesh/single-consumer/app.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +from aws_cdk import ( + aws_events as events, + aws_events_targets as targets, + aws_logs as logs, + aws_iam as iam, + App, Stack, Environment +) +from constructs import Construct + +class ProducerStack(Stack): + def __init__(self, scope: Construct, id: str, *, + app_name: str, + consumer_account_id: str, + **kwargs) -> None: + super().__init__(scope, id, **kwargs) + + # Create the EventBus + producer_event_bus = events.EventBus( + self, f"{app_name}-producer-event-bus" + ) + + # Create rule to forward events to consumer account + rule = events.Rule( + self, f"{app_name}-forward-to-consumer-rule", + event_bus=producer_event_bus, + event_pattern=events.EventPattern( + source=['com.myapp.events'] + ) + ) + + # Add target to forward to consumer account's event bus + consumer_bus = events.EventBus.from_event_bus_arn( + self, + 'ConsumerEventBus', + f"arn:aws:events:{Stack.of(self).region}:{consumer_account_id}:event-bus/default" + ) + rule.add_target(targets.EventBus(consumer_bus)) + + # Optional: Add CloudWatch target for monitoring + log_group = logs.LogGroup(self, f"{app_name}-producer-logs") + rule.add_target(targets.CloudWatchLogGroup(log_group)) + + +class ConsumerStack(Stack): + def __init__(self, scope: Construct, id: str, *, + app_name: str, + producer_account_id: str, + **kwargs) -> None: + super().__init__(scope, id, **kwargs) + + # Create or reference the consumer event bus + consumer_event_bus = events.EventBus( + self, f"{app_name}-consumer-event-bus" + ) + + # Add policy to allow producer account to put events + consumer_event_bus.add_to_resource_policy(iam.PolicyStatement( + sid="allowProducerAccount", + effect=iam.Effect.ALLOW, + principals=[iam.AccountPrincipal(producer_account_id)], + actions=["events:PutEvents"], + resources=[consumer_event_bus.event_bus_arn] + )) + + # Create consumer rules + consumer_rule = events.Rule( + self, f"{app_name}-consumer-rule", + event_bus=consumer_event_bus, + event_pattern=events.EventPattern( + source=['com.myapp.events'], + detail_type=['specific-event-type'] + ) + ) + + # Add target (e.g., CloudWatch) + log_group = logs.LogGroup(self, f"{app_name}-consumer-logs") + consumer_rule.add_target(targets.CloudWatchLogGroup(log_group)) + + +app = App() + +# Get context values +app_name = app.node.try_get_context("appName") +region = app.node.try_get_context("region") +producer_account_id = app.node.try_get_context("producerAccountId") +consumer_account_id = app.node.try_get_context("consumer1AccountId") + +# Create producer stack +producer_stack = ProducerStack( + app, f"{app_name}-producer-stack", + app_name=app_name, + consumer_account_id=consumer_account_id, + env=Environment( + account=producer_account_id, + region=region + ) +) + +# Create consumer stack +consumer_stack = ConsumerStack( + app, f"{app_name}-consumer-stack", + app_name=app_name, + producer_account_id=producer_account_id, + env=Environment( + account=consumer_account_id, + region=region + ) +) + +app.synth() diff --git a/python/eventbridge-mesh/single-consumer/cdk.json b/python/eventbridge-mesh/single-consumer/cdk.json new file mode 100644 index 0000000000..3668959fed --- /dev/null +++ b/python/eventbridge-mesh/single-consumer/cdk.json @@ -0,0 +1,10 @@ +{ + "app": "python3 app.py", + "context": { + "appName": "eventbridge-mesh", + "region": "us-east-1", + "producerAccountId": "117645918752", + "consumer1AccountId": "778142832559" + } + +} \ No newline at end of file diff --git a/python/eventbridge-mesh/single-consumer/requirements.txt b/python/eventbridge-mesh/single-consumer/requirements.txt new file mode 100644 index 0000000000..23452e33ae --- /dev/null +++ b/python/eventbridge-mesh/single-consumer/requirements.txt @@ -0,0 +1,2 @@ +aws-cdk-lib==2.186.0 +constructs>=10.0.0,<11.0.0 \ No newline at end of file From 1d323c664416f9ef75d069a11be26e59a23ff242 Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Sat, 5 Apr 2025 19:11:43 +1300 Subject: [PATCH 13/20] added multiple-consumer solution in python --- python/eventbridge-mesh/README.md | 7 + .../multiple-consumers/app.py | 128 ++++++++++++++++++ .../multiple-consumers/cdk.json | 10 ++ .../multiple-consumers/requirements.txt | 2 + 4 files changed, 147 insertions(+) create mode 100644 python/eventbridge-mesh/multiple-consumers/app.py create mode 100644 python/eventbridge-mesh/multiple-consumers/cdk.json create mode 100644 python/eventbridge-mesh/multiple-consumers/requirements.txt diff --git a/python/eventbridge-mesh/README.md b/python/eventbridge-mesh/README.md index 59a2aafe45..7b9daf0af7 100644 --- a/python/eventbridge-mesh/README.md +++ b/python/eventbridge-mesh/README.md @@ -40,6 +40,13 @@ cdk bootstrap aws://222222222222/us-east-1 \ --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess ``` +3. (Optional: Only do this step, when you deploys multiple consumers solution) In account: `333333333333`, run the below command: +``` +cdk bootstrap aws://333333333333/us-east-1 \ + --trust 000000000000 \ + --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess +``` + ### Deploy Single consumer solution: 1. Run: `cd single-consumer` 2. Change the values of `producerAccountId` and `consumerAccountId` in `cdk.json` diff --git a/python/eventbridge-mesh/multiple-consumers/app.py b/python/eventbridge-mesh/multiple-consumers/app.py new file mode 100644 index 0000000000..7c520401e2 --- /dev/null +++ b/python/eventbridge-mesh/multiple-consumers/app.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +from aws_cdk import ( + aws_events as events, + aws_events_targets as targets, + aws_logs as logs, + aws_iam as iam, + App, Stack, Environment +) +from constructs import Construct + +class ProducerStack(Stack): + def __init__(self, scope: Construct, id: str, *, + app_name: str, + consumer_accounts: list[str], + **kwargs) -> None: + super().__init__(scope, id, **kwargs) + + # Create the EventBus + producer_event_bus = events.EventBus( + self, f"{app_name}-producer-event-bus" + ) + + # Create rules for each consumer account + for index, consumer_account_id in enumerate(consumer_accounts): + # Create rule to forward events to consumer account + rule = events.Rule( + self, + f"{app_name}-forward-to-consumer-{index + 1}-rule", + event_bus=producer_event_bus, + event_pattern=events.EventPattern( + source=['com.myapp.events'] + ) + ) + + # Add target to forward to consumer account's event bus + consumer_bus = events.EventBus.from_event_bus_arn( + self, + f"{app_name}-consumer-{index + 1}-event-bus", + f"arn:aws:events:{Stack.of(self).region}:{consumer_account_id}:event-bus/default" + ) + rule.add_target(targets.EventBus(consumer_bus)) + + +class ConsumerStack(Stack): + def __init__(self, scope: Construct, id: str, *, + app_name: str, + consumer_name: str, + producer_account_id: str, + **kwargs) -> None: + super().__init__(scope, id, **kwargs) + + # Create or reference the consumer event bus + consumer_event_bus = events.EventBus( + self, f"{app_name}-{consumer_name}-event-bus" + ) + + # Add policy to allow producer account to put events + consumer_event_bus.add_to_resource_policy(iam.PolicyStatement( + sid="allowProducerAccount", + effect=iam.Effect.ALLOW, + principals=[iam.AccountPrincipal(producer_account_id)], + actions=["events:PutEvents"], + resources=[consumer_event_bus.event_bus_arn] + )) + + # Create consumer rules + consumer_rule = events.Rule( + self, + f"{app_name}-{consumer_name}-rule", + event_bus=consumer_event_bus, + event_pattern=events.EventPattern( + source=['com.myapp.events'], + detail_type=['specific-event-type'] + ) + ) + + # Add target (e.g., CloudWatch) + log_group = logs.LogGroup( + self, f"{app_name}-{consumer_name}-logs" + ) + consumer_rule.add_target(targets.CloudWatchLogGroup(log_group)) + + +app = App() + +# Get context values +app_name = app.node.try_get_context("appName") +region = app.node.try_get_context("region") +producer_account_id = app.node.try_get_context("producerAccountId") +consumer1_account_id = app.node.try_get_context("consumer1AccountId") +consumer2_account_id = app.node.try_get_context("consumer2AccountId") + +# Create producer stack +producer_stack = ProducerStack( + app, f"{app_name}-producer-stack", + app_name=app_name, + consumer_accounts=[consumer1_account_id, consumer2_account_id], + env=Environment( + account=producer_account_id, + region=region + ) +) + +# Create consumer 1 stack +consumer1_stack = ConsumerStack( + app, f"{app_name}-consumer1-stack", + app_name=app_name, + consumer_name="consumer1", + producer_account_id=producer_account_id, + env=Environment( + account=consumer1_account_id, + region=region + ) +) + +# Create consumer 2 stack +consumer2_stack = ConsumerStack( + app, f"{app_name}-consumer2-stack", + app_name=app_name, + consumer_name="consumer2", + producer_account_id=producer_account_id, + env=Environment( + account=consumer2_account_id, + region=region + ) +) + +app.synth() diff --git a/python/eventbridge-mesh/multiple-consumers/cdk.json b/python/eventbridge-mesh/multiple-consumers/cdk.json new file mode 100644 index 0000000000..f354a5dabd --- /dev/null +++ b/python/eventbridge-mesh/multiple-consumers/cdk.json @@ -0,0 +1,10 @@ +{ + "app": "python3 app.py", + "context": { + "appName": "eventbridge-mesh", + "region": "us-east-1", + "producerAccountId": "111111111111", + "consumer1AccountId": "222222222222", + "consumer2AccountId": "333333333333" + } +} \ No newline at end of file diff --git a/python/eventbridge-mesh/multiple-consumers/requirements.txt b/python/eventbridge-mesh/multiple-consumers/requirements.txt new file mode 100644 index 0000000000..23452e33ae --- /dev/null +++ b/python/eventbridge-mesh/multiple-consumers/requirements.txt @@ -0,0 +1,2 @@ +aws-cdk-lib==2.186.0 +constructs>=10.0.0,<11.0.0 \ No newline at end of file From a4f0d19d89d7093d77a500828a96fe1ca56a0005 Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Sat, 5 Apr 2025 19:13:55 +1300 Subject: [PATCH 14/20] added optional cdk bootsrap step for multiple consumer deployment && upgrade cdk.json accounts ids --- python/eventbridge-mesh/README.md | 8 ++++---- python/eventbridge-mesh/single-consumer/cdk.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python/eventbridge-mesh/README.md b/python/eventbridge-mesh/README.md index 7b9daf0af7..007632050a 100644 --- a/python/eventbridge-mesh/README.md +++ b/python/eventbridge-mesh/README.md @@ -24,26 +24,26 @@ This is a CDK application that implements cross-account event routing using Amaz ## Instructions ### CDK bootstrapping -To deploy the stacks in different accounts, you need to bootstrap the CDKToolkit with trust flag. Assuming you will run `cdk deploy` command from account ID: `000000000000`, and deploys producer stack to account ID: `111111111111`, and consumer stack to account ID: `222222222222` +To deploy the stacks in different accounts, you need to bootstrap the CDKToolkit with trust flag. Assuming you will run `cdk deploy` command from account ID: `123456789012`, and deploys producer stack to account ID: `111111111111`, and consumer stack to account ID: `222222222222` 1. In account: `111111111111`, run the below command: ``` cdk bootstrap aws://111111111111/us-east-1 \ - --trust 000000000000 \ + --trust 123456789012 \ --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess ``` 2. In account: `222222222222`, run the below command: ``` cdk bootstrap aws://222222222222/us-east-1 \ - --trust 000000000000 \ + --trust 123456789012 \ --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess ``` 3. (Optional: Only do this step, when you deploys multiple consumers solution) In account: `333333333333`, run the below command: ``` cdk bootstrap aws://333333333333/us-east-1 \ - --trust 000000000000 \ + --trust 123456789012 \ --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess ``` diff --git a/python/eventbridge-mesh/single-consumer/cdk.json b/python/eventbridge-mesh/single-consumer/cdk.json index 3668959fed..1d604b114d 100644 --- a/python/eventbridge-mesh/single-consumer/cdk.json +++ b/python/eventbridge-mesh/single-consumer/cdk.json @@ -3,8 +3,8 @@ "context": { "appName": "eventbridge-mesh", "region": "us-east-1", - "producerAccountId": "117645918752", - "consumer1AccountId": "778142832559" + "producerAccountId": "111111111111", + "consumer1AccountId": "222222222222" } } \ No newline at end of file From c14cd49dc113f6ea06e7b25c00a76081aba62414 Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Sat, 5 Apr 2025 20:50:47 +1300 Subject: [PATCH 15/20] added design diagram in python --- .../eventbridge-mesh/images/multi-consumers.png | Bin 0 -> 56578 bytes .../eventbridge-mesh/images/single-consumer.png | Bin 0 -> 50121 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 python/eventbridge-mesh/images/multi-consumers.png create mode 100644 python/eventbridge-mesh/images/single-consumer.png diff --git a/python/eventbridge-mesh/images/multi-consumers.png b/python/eventbridge-mesh/images/multi-consumers.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4ad38478d526ccd20432387b3235c0b9e60538 GIT binary patch literal 56578 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 literal 0 HcmV?d00001 diff --git a/python/eventbridge-mesh/images/single-consumer.png b/python/eventbridge-mesh/images/single-consumer.png new file mode 100644 index 0000000000000000000000000000000000000000..a3daa8b2f73c77c0350fab438941b0cc88020532 GIT binary patch literal 50121 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

9sUn{-j>7Db7dN|B$Bwa(fF_4vL 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 F{{wzgY<>U$ literal 0 HcmV?d00001 From d381fb8a41cacbbd6e89544e2da3c530d7ed626c Mon Sep 17 00:00:00 2001 From: Jacky Fan Date: Sat, 5 Apr 2025 20:52:52 +1300 Subject: [PATCH 16/20] updated README.md --- python/eventbridge-mesh/README.md | 4 ++-- typescript/eventbridge-mesh/README.md | 34 ++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/python/eventbridge-mesh/README.md b/python/eventbridge-mesh/README.md index 007632050a..36391db92f 100644 --- a/python/eventbridge-mesh/README.md +++ b/python/eventbridge-mesh/README.md @@ -51,7 +51,7 @@ cdk bootstrap aws://333333333333/us-east-1 \ 1. Run: `cd single-consumer` 2. Change the values of `producerAccountId` and `consumerAccountId` in `cdk.json` 3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html -4. Make sure you use a role or user has proper permission in account ID: `000000000000`, and run below commands: +4. Make sure you use a role or user has proper permission in account ID: `123456789012`, and run below commands: ```ruby npm run build @@ -66,7 +66,7 @@ cdk deploy --all 1. Run: `cd multiple-consumer` 2. Change the values of `producerAccountId`, `consumer1AccountId`, and `consumer2AccountId` in `cdk.json` 3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html -4. Make sure you use a role or user has proper permission in account ID: `000000000000`, and run below commands: +4. Make sure you use a role or user has proper permission in account ID: `123456789012`, and run below commands: ```ruby npm run build diff --git a/typescript/eventbridge-mesh/README.md b/typescript/eventbridge-mesh/README.md index 5965df495d..755d1f669b 100644 --- a/typescript/eventbridge-mesh/README.md +++ b/typescript/eventbridge-mesh/README.md @@ -1,4 +1,6 @@ -# CDK Sample: Event Bridge mesh with CDK +# CDK Typescript Sample: Event Bridge mesh with CDK + +![Language-Support: Stable](https://img.shields.io/badge/language--support-stable-success.svg?style=for-the-badge) ## Description: A CDK way to set up a Event Bridge Mesh(Cross-Account), where you relay the messages from one Event Bridge in a producer account to another Event Bridge in a consumer account @@ -21,10 +23,35 @@ This is a CDK application that implements cross-account event routing using Amaz ## Instructions -### Single consumer: +### CDK bootstrapping +To deploy the stacks in different accounts, you need to bootstrap the CDKToolkit with trust flag. Assuming you will run `cdk deploy` command from account ID: `123456789012`, and deploys producer stack to account ID: `111111111111`, and consumer stack to account ID: `222222222222` + +1. In account: `111111111111`, run the below command: +``` +cdk bootstrap aws://111111111111/us-east-1 \ + --trust 123456789012 \ + --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess +``` + +2. In account: `222222222222`, run the below command: +``` +cdk bootstrap aws://222222222222/us-east-1 \ + --trust 123456789012 \ + --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess +``` + +3. (Optional: Only do this step, when you deploys multiple consumers solution) In account: `333333333333`, run the below command: +``` +cdk bootstrap aws://333333333333/us-east-1 \ + --trust 123456789012 \ + --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess +``` + +### Deploy Single consumer solution: 1. Run: `cd single-consumer` 2. Change the values of `producerAccountId` and `consumerAccountId` in `cdk.json` 3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html +4. Make sure you use a role or user has proper permission in account ID: `123456789012`, and run below commands: ```ruby npm run build @@ -35,10 +62,11 @@ cdk synth cdk deploy --all ``` -### Multiple consumers: +### Deploy Multiple consumers solution: 1. Run: `cd multiple-consumer` 2. Change the values of `producerAccountId`, `consumer1AccountId`, and `consumer2AccountId` in `cdk.json` 3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html +4. Make sure you use a role or user has proper permission in account ID: `123456789012`, and run below commands: ```ruby npm run build From 81f26a0b836bf357b6fcebb2ee7bbf0dbd4b4a0e Mon Sep 17 00:00:00 2001 From: Michael Kaiser Date: Tue, 15 Apr 2025 20:30:58 -0500 Subject: [PATCH 17/20] Fix: remove unused test command --- typescript/eventbridge-mesh/multiple-consumers/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/typescript/eventbridge-mesh/multiple-consumers/package.json b/typescript/eventbridge-mesh/multiple-consumers/package.json index 56004d5752..7f5cf9707b 100644 --- a/typescript/eventbridge-mesh/multiple-consumers/package.json +++ b/typescript/eventbridge-mesh/multiple-consumers/package.json @@ -4,7 +4,6 @@ "scripts": { "build": "tsc", "watch": "tsc -w", - "test": "jest", "cdk": "cdk" }, "devDependencies": { From 95a84eea7ddd84ff8bfdc56c6687f6393c891fe2 Mon Sep 17 00:00:00 2001 From: Michael Kaiser Date: Tue, 15 Apr 2025 20:31:27 -0500 Subject: [PATCH 18/20] Fix: remove unused test command --- typescript/eventbridge-mesh/single-consumer/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/typescript/eventbridge-mesh/single-consumer/package.json b/typescript/eventbridge-mesh/single-consumer/package.json index 56004d5752..7f5cf9707b 100644 --- a/typescript/eventbridge-mesh/single-consumer/package.json +++ b/typescript/eventbridge-mesh/single-consumer/package.json @@ -4,7 +4,6 @@ "scripts": { "build": "tsc", "watch": "tsc -w", - "test": "jest", "cdk": "cdk" }, "devDependencies": { From dfb78421d532c21be5c69c0eafd9ea37ad6a8eb4 Mon Sep 17 00:00:00 2001 From: Michael Kaiser Date: Tue, 15 Apr 2025 20:35:55 -0500 Subject: [PATCH 19/20] Doc: update shell language for code blocks --- python/eventbridge-mesh/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/eventbridge-mesh/README.md b/python/eventbridge-mesh/README.md index 36391db92f..e355d2fd74 100644 --- a/python/eventbridge-mesh/README.md +++ b/python/eventbridge-mesh/README.md @@ -52,7 +52,7 @@ cdk bootstrap aws://333333333333/us-east-1 \ 2. Change the values of `producerAccountId` and `consumerAccountId` in `cdk.json` 3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html 4. Make sure you use a role or user has proper permission in account ID: `123456789012`, and run below commands: -```ruby +```shell npm run build cdk ls @@ -67,7 +67,7 @@ cdk deploy --all 2. Change the values of `producerAccountId`, `consumer1AccountId`, and `consumer2AccountId` in `cdk.json` 3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html 4. Make sure you use a role or user has proper permission in account ID: `123456789012`, and run below commands: -```ruby +```shell npm run build cdk ls From 47be69db19703dd681e2349fa4774676d07f99cc Mon Sep 17 00:00:00 2001 From: Michael Kaiser Date: Tue, 15 Apr 2025 20:38:41 -0500 Subject: [PATCH 20/20] Update README.md --- typescript/eventbridge-mesh/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/eventbridge-mesh/README.md b/typescript/eventbridge-mesh/README.md index 755d1f669b..db8c2f3279 100644 --- a/typescript/eventbridge-mesh/README.md +++ b/typescript/eventbridge-mesh/README.md @@ -52,7 +52,7 @@ cdk bootstrap aws://333333333333/us-east-1 \ 2. Change the values of `producerAccountId` and `consumerAccountId` in `cdk.json` 3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html 4. Make sure you use a role or user has proper permission in account ID: `123456789012`, and run below commands: -```ruby +```shell npm run build cdk ls @@ -67,7 +67,7 @@ cdk deploy --all 2. Change the values of `producerAccountId`, `consumer1AccountId`, and `consumer2AccountId` in `cdk.json` 3. Install and configure the CDK: https://docs.aws.amazon.com/CDK/latest/userguide/install_config.html 4. Make sure you use a role or user has proper permission in account ID: `123456789012`, and run below commands: -```ruby +```shell npm run build cdk ls