From 6bfa0ba45dc3da895f7dc96968b4066de10f7664 Mon Sep 17 00:00:00 2001 From: John Walker Date: Thu, 7 Nov 2024 14:26:13 +0100 Subject: [PATCH 01/17] Add wildcard match in event-pattern.ts --- packages/aws-cdk-lib/aws-events/lib/event-pattern.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts index c4f37bdffe055..b3c044149d6ac 100644 --- a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts +++ b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts @@ -65,6 +65,13 @@ export class Match implements IResolvable { return this.fromObjects([{ suffix: value }]); } + /** + * Matches strings with the given wildcard pattern in the JSON of the event + */ + public static wildcard(value: string): string[] { + return this.fromObjects([{ wildcard: value }]); + } + /** * Matches IPv4 and IPv6 network addresses using the Classless Inter-Domain Routing (CIDR) format */ From dd23feaab6335a6d9c291656e42708d05d662561 Mon Sep 17 00:00:00 2001 From: John Walker Date: Thu, 7 Nov 2024 14:29:51 +0100 Subject: [PATCH 02/17] add test for wildcard match in matchers.test.ts --- packages/aws-cdk-lib/aws-events/test/matchers.test.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/aws-cdk-lib/aws-events/test/matchers.test.ts b/packages/aws-cdk-lib/aws-events/test/matchers.test.ts index cdda43b3c1a1a..cb91bbef326c8 100644 --- a/packages/aws-cdk-lib/aws-events/test/matchers.test.ts +++ b/packages/aws-cdk-lib/aws-events/test/matchers.test.ts @@ -77,6 +77,12 @@ describe(Match, () => { ]); }); + test('wildcard', () => { + expect(stack.resolve(Match.wildcard('*.json'))).toEqual([ + { wildcard: '*.json' }, + ]); + }); + test('equalsIgnoreCase', () => { expect(stack.resolve(Match.equalsIgnoreCase('foo'))).toEqual([ { 'equals-ignore-case': 'foo' }, From 07d6d551bb65d285647d3ee58e01d4bb52d08d94 Mon Sep 17 00:00:00 2001 From: John Walker Date: Thu, 7 Nov 2024 15:19:13 +0100 Subject: [PATCH 03/17] Update README.md --- packages/aws-cdk-lib/aws-events/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-events/README.md b/packages/aws-cdk-lib/aws-events/README.md index 9a8af87acee4c..f3646b207f3d4 100644 --- a/packages/aws-cdk-lib/aws-events/README.md +++ b/packages/aws-cdk-lib/aws-events/README.md @@ -100,11 +100,12 @@ const rule = new events.Rule(this, 'rule', { object: { // Matchers may appear at any level size: events.Match.greaterThan(1024), + key: events.Match.wildcard('path/to/object/*.txt'), }, // 'OR' condition 'source-storage-class': events.Match.anyOf( - events.Match.prefix("GLACIER"), + events.Match.prefix('GLACIER'), events.Match.exactString('DEEP_ARCHIVE'), ), }, From ce497a58977832492ee5ad368b546686b61bf4dc Mon Sep 17 00:00:00 2001 From: John Walker Date: Thu, 7 Nov 2024 15:52:20 +0100 Subject: [PATCH 04/17] add integration test for wildcard in integ.rule.ts --- .../framework-integ/test/aws-events/test/integ.rule.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts index 958e3d9d1694b..79b3147ff6d0d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts @@ -30,6 +30,7 @@ new Rule(stack, 'MyRule', { notPrefixedBy: Match.anythingButPrefix('sensitive-'), suffix: Match.suffix('.com'), equalsIgnoreCase: Match.equalsIgnoreCase('ignore case'), + wildcard: Match.wildcard('*:*:*:*:*:event-bus/*'), }, detailType: ['detailType1'], id: ['id1', 'id2'], From b1f8342922440e89111665c8a4945b133b4ccddc Mon Sep 17 00:00:00 2001 From: John Walker Date: Fri, 8 Nov 2024 07:46:20 +0000 Subject: [PATCH 05/17] simplify wildcard pattern in integration test --- .../framework-integ/test/aws-events/test/integ.rule.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts index 79b3147ff6d0d..0091a045f002a 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts @@ -30,7 +30,7 @@ new Rule(stack, 'MyRule', { notPrefixedBy: Match.anythingButPrefix('sensitive-'), suffix: Match.suffix('.com'), equalsIgnoreCase: Match.equalsIgnoreCase('ignore case'), - wildcard: Match.wildcard('*:*:*:*:*:event-bus/*'), + wildcard: Match.wildcard('*.txt'), }, detailType: ['detailType1'], id: ['id1', 'id2'], From 0ac3c0005acbe50e5cc65eb85cdd22d0c19dd407 Mon Sep 17 00:00:00 2001 From: John Walker Date: Fri, 8 Nov 2024 07:49:08 +0000 Subject: [PATCH 06/17] update integration test snapshot --- ...efaultTestDeployAssertC15EFFF2.assets.json | 2 +- .../RuleStack.assets.json | 2 +- .../test/integ.rule.js.snapshot/cdk.out | 2 +- .../test/integ.rule.js.snapshot/integ.json | 2 +- .../test/integ.rule.js.snapshot/manifest.json | 6 ++++- .../test/integ.rule.js.snapshot/tree.json | 26 +++++++++---------- 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.assets.json index 0ee3c895dea43..729e582cb3fac 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.assets.json @@ -1,5 +1,5 @@ { - "version": "21.0.0", + "version": "38.0.1", "files": { "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { "source": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json index 21e208bc4a0a6..1f446a7c534f0 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json @@ -1,5 +1,5 @@ { - "version": "21.0.0", + "version": "38.0.1", "files": { "f9728b2d2c64ff638563c8cc4a3e8eb9ddf3074e2ae01d68fde11aeda0968fb1": { "source": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/cdk.out index 8ecc185e9dbee..c6e612584e352 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"21.0.0"} \ No newline at end of file +{"version":"38.0.1"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/integ.json index 3716c914b03f1..6b1bd909d381f 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "21.0.0", + "version": "38.0.1", "testCases": { "IntegTest-BatchDefaultEnvVarsStack/DefaultTest": { "stacks": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json index 4117383bdd483..111abf2de7143 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "21.0.0", + "version": "38.0.1", "artifacts": { "RuleStack.assets": { "type": "cdk:asset-manifest", @@ -14,7 +14,9 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "RuleStack.template.json", + "terminationProtection": false, "validateOnSynth": false, + "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/f9728b2d2c64ff638563c8cc4a3e8eb9ddf3074e2ae01d68fde11aeda0968fb1.json", @@ -67,7 +69,9 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.template.json", + "terminationProtection": false, "validateOnSynth": false, + "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json index f68ebe1fc832e..a4706d86814c6 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json @@ -165,13 +165,13 @@ } }, "constructInfo": { - "fqn": "@aws-cdk/aws-events.CfnRule", + "fqn": "aws-cdk-lib.aws_events.CfnRule", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-events.Rule", + "fqn": "aws-cdk-lib.aws_events.Rule", "version": "0.0.0" } }, @@ -179,7 +179,7 @@ "id": "BootstrapVersion", "path": "RuleStack/BootstrapVersion", "constructInfo": { - "fqn": "@aws-cdk/core.CfnParameter", + "fqn": "aws-cdk-lib.CfnParameter", "version": "0.0.0" } }, @@ -187,13 +187,13 @@ "id": "CheckBootstrapVersion", "path": "RuleStack/CheckBootstrapVersion", "constructInfo": { - "fqn": "@aws-cdk/core.CfnRule", + "fqn": "aws-cdk-lib.CfnRule", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/core.Stack", + "fqn": "aws-cdk-lib.Stack", "version": "0.0.0" } }, @@ -210,7 +210,7 @@ "path": "IntegTest-BatchDefaultEnvVarsStack/DefaultTest/Default", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.154" + "version": "10.4.2" } }, "DeployAssert": { @@ -221,7 +221,7 @@ "id": "BootstrapVersion", "path": "IntegTest-BatchDefaultEnvVarsStack/DefaultTest/DeployAssert/BootstrapVersion", "constructInfo": { - "fqn": "@aws-cdk/core.CfnParameter", + "fqn": "aws-cdk-lib.CfnParameter", "version": "0.0.0" } }, @@ -229,25 +229,25 @@ "id": "CheckBootstrapVersion", "path": "IntegTest-BatchDefaultEnvVarsStack/DefaultTest/DeployAssert/CheckBootstrapVersion", "constructInfo": { - "fqn": "@aws-cdk/core.CfnRule", + "fqn": "aws-cdk-lib.CfnRule", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/core.Stack", + "fqn": "aws-cdk-lib.Stack", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/integ-tests.IntegTestCase", + "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/integ-tests.IntegTest", + "fqn": "@aws-cdk/integ-tests-alpha.IntegTest", "version": "0.0.0" } }, @@ -256,12 +256,12 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.154" + "version": "10.4.2" } } }, "constructInfo": { - "fqn": "@aws-cdk/core.App", + "fqn": "aws-cdk-lib.App", "version": "0.0.0" } } From 4b70c5e0c26366a255b06015bcd3cd3adcbe37aa Mon Sep 17 00:00:00 2001 From: John Walker Date: Sat, 9 Nov 2024 08:32:03 +0000 Subject: [PATCH 07/17] update integration test and snapshot --- .../RuleStack.assets.json | 4 +- .../RuleStack.template.json | 44 +++++++++++++ .../test/integ.rule.js.snapshot/manifest.json | 8 ++- .../test/integ.rule.js.snapshot/tree.json | 62 +++++++++++++++++++ .../test/aws-events/test/integ.rule.ts | 15 +++++ 5 files changed, 130 insertions(+), 3 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json index 1f446a7c534f0..801ae982e9f0e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json @@ -1,7 +1,7 @@ { "version": "38.0.1", "files": { - "f9728b2d2c64ff638563c8cc4a3e8eb9ddf3074e2ae01d68fde11aeda0968fb1": { + "48930e0b4798a89ba9deb6969b39a19e74642b31c089a4f6fe95dbdff1077c2f": { "source": { "path": "RuleStack.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "f9728b2d2c64ff638563c8cc4a3e8eb9ddf3074e2ae01d68fde11aeda0968fb1.json", + "objectKey": "48930e0b4798a89ba9deb6969b39a19e74642b31c089a4f6fe95dbdff1077c2f.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json index 5025f8b2c914b..ee8caf406cdee 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json @@ -148,6 +148,50 @@ }, "State": "ENABLED" } + }, + "MyWilcardRuleF89CAFCF": { + "Type": "AWS::Events::Rule", + "Properties": { + "EventPattern": { + "account": [ + "account1", + "account2" + ], + "detail": { + "wildcard": [ + { + "wildcard": "*.txt" + } + ] + }, + "detail-type": [ + "detailType1" + ], + "id": [ + "id1", + "id2" + ], + "region": [ + "region1", + "region2", + "region3" + ], + "resources": [ + "r1" + ], + "source": [ + "src1", + "src2" + ], + "time": [ + "t1" + ], + "version": [ + "0" + ] + }, + "State": "ENABLED" + } } }, "Parameters": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json index 111abf2de7143..1770fc98f2e48 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json @@ -19,7 +19,7 @@ "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/f9728b2d2c64ff638563c8cc4a3e8eb9ddf3074e2ae01d68fde11aeda0968fb1.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/48930e0b4798a89ba9deb6969b39a19e74642b31c089a4f6fe95dbdff1077c2f.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -41,6 +41,12 @@ "data": "MyRuleA44AB831" } ], + "/RuleStack/MyWilcardRule/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyWilcardRuleF89CAFCF" + } + ], "/RuleStack/BootstrapVersion": [ { "type": "aws:cdk:logicalId", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json index a4706d86814c6..41d7bbcebe969 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json @@ -175,6 +175,68 @@ "version": "0.0.0" } }, + "MyWilcardRule": { + "id": "MyWilcardRule", + "path": "RuleStack/MyWilcardRule", + "children": { + "Resource": { + "id": "Resource", + "path": "RuleStack/MyWilcardRule/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Events::Rule", + "aws:cdk:cloudformation:props": { + "eventPattern": { + "account": [ + "account1", + "account2" + ], + "detail": { + "wildcard": [ + { + "wildcard": "*.txt" + } + ] + }, + "detail-type": [ + "detailType1" + ], + "id": [ + "id1", + "id2" + ], + "region": [ + "region1", + "region2", + "region3" + ], + "resources": [ + "r1" + ], + "source": [ + "src1", + "src2" + ], + "time": [ + "t1" + ], + "version": [ + "0" + ] + }, + "state": "ENABLED" + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_events.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_events.Rule", + "version": "0.0.0" + } + }, "BootstrapVersion": { "id": "BootstrapVersion", "path": "RuleStack/BootstrapVersion", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts index 0091a045f002a..da76c3ba1835c 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts @@ -30,6 +30,21 @@ new Rule(stack, 'MyRule', { notPrefixedBy: Match.anythingButPrefix('sensitive-'), suffix: Match.suffix('.com'), equalsIgnoreCase: Match.equalsIgnoreCase('ignore case'), + }, + detailType: ['detailType1'], + id: ['id1', 'id2'], + region: ['region1', 'region2', 'region3'], + resources: ['r1'], + source: ['src1', 'src2'], + time: ['t1'], + version: ['0'], + }, +}); + +new Rule(stack, 'MyWildcardRule', { + eventPattern: { + account: ['account1', 'account2'], + detail: { wildcard: Match.wildcard('*.txt'), }, detailType: ['detailType1'], From 0982d12bbd8bfc547749d41156f8c4e493a1f628 Mon Sep 17 00:00:00 2001 From: John Walker Date: Sat, 9 Nov 2024 09:55:35 +0000 Subject: [PATCH 08/17] extend anythingBut rules * add functions anythingButSuffix, anythingButWildcard, and anythingButEqualsIgnoreCase * change anythingButPrefix to support multiple values * implement unit tests * implement integration tests * update snapshots --- .../RuleStack.assets.json | 4 +- .../RuleStack.template.json | 110 ++++++--- .../test/integ.rule.js.snapshot/manifest.json | 39 ++- .../test/integ.rule.js.snapshot/tree.json | 232 +++++++++++++----- .../test/aws-events/test/integ.rule.ts | 36 ++- .../aws-events/lib/event-pattern.ts | 41 +++- .../aws-events/test/matchers.test.ts | 36 ++- .../aws-cdk-lib/aws-events/test/rule.test.ts | 2 +- 8 files changed, 385 insertions(+), 115 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json index 801ae982e9f0e..77b75597298ef 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json @@ -1,7 +1,7 @@ { "version": "38.0.1", "files": { - "48930e0b4798a89ba9deb6969b39a19e74642b31c089a4f6fe95dbdff1077c2f": { + "4d02feea7194b2b0cb0ce0c947b90f63a75ed25725de6ea5ac1d25d0e73d38ff": { "source": { "path": "RuleStack.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "48930e0b4798a89ba9deb6969b39a19e74642b31c089a4f6fe95dbdff1077c2f.json", + "objectKey": "4d02feea7194b2b0cb0ce0c947b90f63a75ed25725de6ea5ac1d25d0e73d38ff.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json index ee8caf406cdee..48e4b2040078b 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json @@ -105,7 +105,9 @@ "notPrefixedBy": [ { "anything-but": { - "prefix": "sensitive-" + "prefix": [ + "sensitive-" + ] } } ], @@ -149,45 +151,83 @@ "State": "ENABLED" } }, - "MyWilcardRuleF89CAFCF": { + "MyWildcardRule477FB0F9": { "Type": "AWS::Events::Rule", "Properties": { "EventPattern": { "account": [ - "account1", - "account2" - ], - "detail": { - "wildcard": [ - { - "wildcard": "*.txt" + { + "wildcard": "account*" + } + ] + }, + "State": "ENABLED" + } + }, + "MyAnythingButPrefixRule756FC7C6": { + "Type": "AWS::Events::Rule", + "Properties": { + "EventPattern": { + "account": [ + { + "anything-but": { + "prefix": [ + "prefix-" + ] } - ] - }, - "detail-type": [ - "detailType1" - ], - "id": [ - "id1", - "id2" - ], - "region": [ - "region1", - "region2", - "region3" - ], - "resources": [ - "r1" - ], - "source": [ - "src1", - "src2" - ], - "time": [ - "t1" - ], - "version": [ - "0" + } + ] + }, + "State": "ENABLED" + } + }, + "MyAnythingButSuffixRuleB1E496DF": { + "Type": "AWS::Events::Rule", + "Properties": { + "EventPattern": { + "account": [ + { + "anything-but": { + "suffix": [ + "-suffix" + ] + } + } + ] + }, + "State": "ENABLED" + } + }, + "MyAnythingButWildcardRuleEED7F44B": { + "Type": "AWS::Events::Rule", + "Properties": { + "EventPattern": { + "account": [ + { + "anything-but": { + "wildcard": [ + "account*" + ] + } + } + ] + }, + "State": "ENABLED" + } + }, + "MyAnythingButEqualsIgnoreCaseEBE7F91F": { + "Type": "AWS::Events::Rule", + "Properties": { + "EventPattern": { + "account": [ + { + "anything-but": { + "equals-ignore-case": [ + "account1", + "account2" + ] + } + } ] }, "State": "ENABLED" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json index 1770fc98f2e48..dec26e11dd1eb 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json @@ -19,7 +19,7 @@ "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/48930e0b4798a89ba9deb6969b39a19e74642b31c089a4f6fe95dbdff1077c2f.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/4d02feea7194b2b0cb0ce0c947b90f63a75ed25725de6ea5ac1d25d0e73d38ff.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -41,10 +41,34 @@ "data": "MyRuleA44AB831" } ], - "/RuleStack/MyWilcardRule/Resource": [ + "/RuleStack/MyWildcardRule/Resource": [ { "type": "aws:cdk:logicalId", - "data": "MyWilcardRuleF89CAFCF" + "data": "MyWildcardRule477FB0F9" + } + ], + "/RuleStack/MyAnythingButPrefixRule/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyAnythingButPrefixRule756FC7C6" + } + ], + "/RuleStack/MyAnythingButSuffixRule/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyAnythingButSuffixRuleB1E496DF" + } + ], + "/RuleStack/MyAnythingButWildcardRule/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyAnythingButWildcardRuleEED7F44B" + } + ], + "/RuleStack/MyAnythingButEqualsIgnoreCase/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyAnythingButEqualsIgnoreCaseEBE7F91F" } ], "/RuleStack/BootstrapVersion": [ @@ -58,6 +82,15 @@ "type": "aws:cdk:logicalId", "data": "CheckBootstrapVersion" } + ], + "MyWilcardRuleF89CAFCF": [ + { + "type": "aws:cdk:logicalId", + "data": "MyWilcardRuleF89CAFCF", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } ] }, "displayName": "RuleStack" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json index 41d7bbcebe969..6857042ea1806 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json @@ -120,7 +120,9 @@ "notPrefixedBy": [ { "anything-but": { - "prefix": "sensitive-" + "prefix": [ + "sensitive-" + ] } } ], @@ -165,98 +167,208 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_events.CfnRule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_events.Rule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } }, - "MyWilcardRule": { - "id": "MyWilcardRule", - "path": "RuleStack/MyWilcardRule", + "MyWildcardRule": { + "id": "MyWildcardRule", + "path": "RuleStack/MyWildcardRule", "children": { "Resource": { "id": "Resource", - "path": "RuleStack/MyWilcardRule/Resource", + "path": "RuleStack/MyWildcardRule/Resource", "attributes": { "aws:cdk:cloudformation:type": "AWS::Events::Rule", "aws:cdk:cloudformation:props": { "eventPattern": { "account": [ - "account1", - "account2" - ], - "detail": { - "wildcard": [ - { - "wildcard": "*.txt" + { + "wildcard": "account*" + } + ] + }, + "state": "ENABLED" + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + }, + "MyAnythingButPrefixRule": { + "id": "MyAnythingButPrefixRule", + "path": "RuleStack/MyAnythingButPrefixRule", + "children": { + "Resource": { + "id": "Resource", + "path": "RuleStack/MyAnythingButPrefixRule/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Events::Rule", + "aws:cdk:cloudformation:props": { + "eventPattern": { + "account": [ + { + "anything-but": { + "prefix": [ + "prefix-" + ] } - ] - }, - "detail-type": [ - "detailType1" - ], - "id": [ - "id1", - "id2" - ], - "region": [ - "region1", - "region2", - "region3" - ], - "resources": [ - "r1" - ], - "source": [ - "src1", - "src2" - ], - "time": [ - "t1" - ], - "version": [ - "0" + } ] }, "state": "ENABLED" } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_events.CfnRule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_events.Rule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" + } + }, + "MyAnythingButSuffixRule": { + "id": "MyAnythingButSuffixRule", + "path": "RuleStack/MyAnythingButSuffixRule", + "children": { + "Resource": { + "id": "Resource", + "path": "RuleStack/MyAnythingButSuffixRule/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Events::Rule", + "aws:cdk:cloudformation:props": { + "eventPattern": { + "account": [ + { + "anything-but": { + "suffix": [ + "-suffix" + ] + } + } + ] + }, + "state": "ENABLED" + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + }, + "MyAnythingButWildcardRule": { + "id": "MyAnythingButWildcardRule", + "path": "RuleStack/MyAnythingButWildcardRule", + "children": { + "Resource": { + "id": "Resource", + "path": "RuleStack/MyAnythingButWildcardRule/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Events::Rule", + "aws:cdk:cloudformation:props": { + "eventPattern": { + "account": [ + { + "anything-but": { + "wildcard": [ + "account*" + ] + } + } + ] + }, + "state": "ENABLED" + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + }, + "MyAnythingButEqualsIgnoreCase": { + "id": "MyAnythingButEqualsIgnoreCase", + "path": "RuleStack/MyAnythingButEqualsIgnoreCase", + "children": { + "Resource": { + "id": "Resource", + "path": "RuleStack/MyAnythingButEqualsIgnoreCase/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Events::Rule", + "aws:cdk:cloudformation:props": { + "eventPattern": { + "account": [ + { + "anything-but": { + "equals-ignore-case": [ + "account1", + "account2" + ] + } + } + ] + }, + "state": "ENABLED" + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" } }, "BootstrapVersion": { "id": "BootstrapVersion", "path": "RuleStack/BootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnParameter", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } }, "CheckBootstrapVersion": { "id": "CheckBootstrapVersion", "path": "RuleStack/CheckBootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnRule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.Stack", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } }, "IntegTest-BatchDefaultEnvVarsStack": { @@ -283,22 +395,22 @@ "id": "BootstrapVersion", "path": "IntegTest-BatchDefaultEnvVarsStack/DefaultTest/DeployAssert/BootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnParameter", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } }, "CheckBootstrapVersion": { "id": "CheckBootstrapVersion", "path": "IntegTest-BatchDefaultEnvVarsStack/DefaultTest/DeployAssert/CheckBootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnRule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.Stack", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } } }, @@ -323,8 +435,8 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.App", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.4.2" } } } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts index da76c3ba1835c..533187da4c269 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts @@ -43,17 +43,31 @@ new Rule(stack, 'MyRule', { new Rule(stack, 'MyWildcardRule', { eventPattern: { - account: ['account1', 'account2'], - detail: { - wildcard: Match.wildcard('*.txt'), - }, - detailType: ['detailType1'], - id: ['id1', 'id2'], - region: ['region1', 'region2', 'region3'], - resources: ['r1'], - source: ['src1', 'src2'], - time: ['t1'], - version: ['0'], + account: Match.wildcard('account*'), + }, +}); + +new Rule(stack, 'MyAnythingButPrefixRule', { + eventPattern: { + account: Match.anythingButPrefix('prefix-'), + }, +}); + +new Rule(stack, 'MyAnythingButSuffixRule', { + eventPattern: { + account: Match.anythingButSuffix('-suffix'), + }, +}); + +new Rule(stack, 'MyAnythingButWildcardRule', { + eventPattern: { + account: Match.anythingButWildcard('account*'), + }, +}); + +new Rule(stack, 'MyAnythingButEqualsIgnoreCase', { + eventPattern: { + account: Match.anythingButEqualsIgnoreCase('account1', 'account2'), }, }); diff --git a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts index b3c044149d6ac..0330d0b98c919 100644 --- a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts +++ b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts @@ -116,8 +116,45 @@ export class Match implements IResolvable { /** * Matches any string that doesn't start with the given prefix. */ - public static anythingButPrefix(prefix: string): string[] { - return this.fromObjects([{ 'anything-but': { prefix: prefix } }]); + public static anythingButPrefix(...values: string[]): string[] { + if (values.length === 0) { + throw new Error('anythingBut matchers must be non-empty lists'); + } + + return this.fromObjects([{ 'anything-but': { prefix: values } }]); + } + + /** + * Matches any string that doesn't end with the given suffix. + */ + public static anythingButSuffix(...values: string[]): string[] { + if (values.length === 0) { + throw new Error('anythingBut matchers must be non-empty lists'); + } + + return this.fromObjects([{ 'anything-but': { suffix: values } }]); + } + + /** + * Matches any string that doesn't match with the given wildcard pattern. + */ + public static anythingButWildcard(...values: string[]): string[] { + if (values.length === 0) { + throw new Error('anythingBut matchers must be non-empty lists'); + } + + return this.fromObjects([{ 'anything-but': { wildcard: values } }]); + } + + /** + * Matches any string that doesn't match with the given value regardless of character casing. + */ + public static anythingButEqualsIgnoreCase(...values: string[]): string[] { + if (values.length === 0) { + throw new Error('anythingBut matchers must be non-empty lists'); + } + + return this.fromObjects([{ 'anything-but': { 'equals-ignore-case': values } }]); } /** diff --git a/packages/aws-cdk-lib/aws-events/test/matchers.test.ts b/packages/aws-cdk-lib/aws-events/test/matchers.test.ts index cb91bbef326c8..68b74e0e79702 100644 --- a/packages/aws-cdk-lib/aws-events/test/matchers.test.ts +++ b/packages/aws-cdk-lib/aws-events/test/matchers.test.ts @@ -21,7 +21,41 @@ describe(Match, () => { test('anythingButPrefix', () => { expect(stack.resolve(Match.anythingButPrefix('foo'))).toEqual([ - { 'anything-but': { prefix: 'foo' } }, + { 'anything-but': { prefix: ['foo'] } }, + ]); + + expect(stack.resolve(Match.anythingButPrefix('foo', 'bar'))).toEqual([ + { 'anything-but': { prefix: ['foo', 'bar'] } }, + ]); + }); + + test('anythingButSuffix', () => { + expect(stack.resolve(Match.anythingButSuffix('foo'))).toEqual([ + { 'anything-but': { suffix: ['foo'] } }, + ]); + + expect(stack.resolve(Match.anythingButSuffix('foo', 'bar'))).toEqual([ + { 'anything-but': { suffix: ['foo', 'bar'] } }, + ]); + }); + + test('anythingButWildcard', () => { + expect(stack.resolve(Match.anythingButWildcard('*.txt'))).toEqual([ + { 'anything-but': { wildcard: ['*.txt'] } }, + ]); + + expect(stack.resolve(Match.anythingButWildcard('*.txt', '*.json'))).toEqual([ + { 'anything-but': { wildcard: ['*.txt', '*.json'] } }, + ]); + }); + + test('anythingButEqualsIgnoreCase', () => { + expect(stack.resolve(Match.anythingButEqualsIgnoreCase('foo'))).toEqual([ + { 'anything-but': { 'equals-ignore-case': ['foo'] } }, + ]); + + expect(stack.resolve(Match.anythingButEqualsIgnoreCase('foo', 'bar'))).toEqual([ + { 'anything-but': { 'equals-ignore-case': ['foo', 'bar'] } }, ]); }); diff --git a/packages/aws-cdk-lib/aws-events/test/rule.test.ts b/packages/aws-cdk-lib/aws-events/test/rule.test.ts index f360bc41137d5..10f6e5d66151b 100644 --- a/packages/aws-cdk-lib/aws-events/test/rule.test.ts +++ b/packages/aws-cdk-lib/aws-events/test/rule.test.ts @@ -198,7 +198,7 @@ describe('rule', () => { }, state: [{ 'anything-but': ['initializing'] }], limit: [{ 'anything-but': [100, 200, 300] }], - notPrefixedBy: [{ 'anything-but': { 'prefix': 'sensitive-' } }], + notPrefixedBy: [{ 'anything-but': { 'prefix': ['sensitive-'] } }], }, 'detail-type': ['detailType1'], id: ['id1', 'id2'], From c6709c22cce67dac3cc4ee3fa710d2e3b0268a56 Mon Sep 17 00:00:00 2001 From: John Walker Date: Sat, 9 Nov 2024 14:02:15 +0000 Subject: [PATCH 09/17] refactor and abstract anything-but conjunctions and adjust tests accordingly --- .../aws-events/lib/event-pattern.ts | 32 +++++++------------ .../aws-events/test/matchers.test.ts | 16 +++++++--- .../aws-cdk-lib/aws-events/test/rule.test.ts | 2 +- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts index 0330d0b98c919..74f7dddd92dc4 100644 --- a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts +++ b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts @@ -117,44 +117,28 @@ export class Match implements IResolvable { * Matches any string that doesn't start with the given prefix. */ public static anythingButPrefix(...values: string[]): string[] { - if (values.length === 0) { - throw new Error('anythingBut matchers must be non-empty lists'); - } - - return this.fromObjects([{ 'anything-but': { prefix: values } }]); + return this.anythingButConjunction('prefix', values); } /** * Matches any string that doesn't end with the given suffix. */ public static anythingButSuffix(...values: string[]): string[] { - if (values.length === 0) { - throw new Error('anythingBut matchers must be non-empty lists'); - } - - return this.fromObjects([{ 'anything-but': { suffix: values } }]); + return this.anythingButConjunction('suffix', values); } /** * Matches any string that doesn't match with the given wildcard pattern. */ public static anythingButWildcard(...values: string[]): string[] { - if (values.length === 0) { - throw new Error('anythingBut matchers must be non-empty lists'); - } - - return this.fromObjects([{ 'anything-but': { wildcard: values } }]); + return this.anythingButConjunction('wildcard', values); } /** * Matches any string that doesn't match with the given value regardless of character casing. */ public static anythingButEqualsIgnoreCase(...values: string[]): string[] { - if (values.length === 0) { - throw new Error('anythingBut matchers must be non-empty lists'); - } - - return this.fromObjects([{ 'anything-but': { 'equals-ignore-case': values } }]); + return this.anythingButConjunction('equals-ignore-case', values); } /** @@ -229,6 +213,14 @@ export class Match implements IResolvable { return this.fromObjects(matchers); } + private static anythingButConjunction(filterKey: string, values: string[]): string[] { + if (values.length === 0) { + throw new Error('anythingBut matchers must be non-empty lists'); + } + + return this.fromObjects([{ 'anything-but': { [filterKey]: values.length === 1 ? values[0] : values } }]); + } + private static numeric(operator: ComparisonOperator, value: number): string[] { return this.fromObjects([{ numeric: [operator, value] }]); } diff --git a/packages/aws-cdk-lib/aws-events/test/matchers.test.ts b/packages/aws-cdk-lib/aws-events/test/matchers.test.ts index 68b74e0e79702..4749ca066c00e 100644 --- a/packages/aws-cdk-lib/aws-events/test/matchers.test.ts +++ b/packages/aws-cdk-lib/aws-events/test/matchers.test.ts @@ -21,42 +21,50 @@ describe(Match, () => { test('anythingButPrefix', () => { expect(stack.resolve(Match.anythingButPrefix('foo'))).toEqual([ - { 'anything-but': { prefix: ['foo'] } }, + { 'anything-but': { prefix: 'foo' } }, ]); expect(stack.resolve(Match.anythingButPrefix('foo', 'bar'))).toEqual([ { 'anything-but': { prefix: ['foo', 'bar'] } }, ]); + + expect(() => stack.resolve(Match.anythingButPrefix())).toThrowError(/must be non-empty lists/); }); test('anythingButSuffix', () => { expect(stack.resolve(Match.anythingButSuffix('foo'))).toEqual([ - { 'anything-but': { suffix: ['foo'] } }, + { 'anything-but': { suffix: 'foo' } }, ]); expect(stack.resolve(Match.anythingButSuffix('foo', 'bar'))).toEqual([ { 'anything-but': { suffix: ['foo', 'bar'] } }, ]); + + expect(() => stack.resolve(Match.anythingButPrefix())).toThrowError(/must be non-empty lists/); }); test('anythingButWildcard', () => { expect(stack.resolve(Match.anythingButWildcard('*.txt'))).toEqual([ - { 'anything-but': { wildcard: ['*.txt'] } }, + { 'anything-but': { wildcard: '*.txt' } }, ]); expect(stack.resolve(Match.anythingButWildcard('*.txt', '*.json'))).toEqual([ { 'anything-but': { wildcard: ['*.txt', '*.json'] } }, ]); + + expect(() => stack.resolve(Match.anythingButPrefix())).toThrowError(/must be non-empty lists/); }); test('anythingButEqualsIgnoreCase', () => { expect(stack.resolve(Match.anythingButEqualsIgnoreCase('foo'))).toEqual([ - { 'anything-but': { 'equals-ignore-case': ['foo'] } }, + { 'anything-but': { 'equals-ignore-case': 'foo' } }, ]); expect(stack.resolve(Match.anythingButEqualsIgnoreCase('foo', 'bar'))).toEqual([ { 'anything-but': { 'equals-ignore-case': ['foo', 'bar'] } }, ]); + + expect(() => stack.resolve(Match.anythingButPrefix())).toThrowError(/must be non-empty lists/); }); test('numeric', () => { diff --git a/packages/aws-cdk-lib/aws-events/test/rule.test.ts b/packages/aws-cdk-lib/aws-events/test/rule.test.ts index 10f6e5d66151b..f360bc41137d5 100644 --- a/packages/aws-cdk-lib/aws-events/test/rule.test.ts +++ b/packages/aws-cdk-lib/aws-events/test/rule.test.ts @@ -198,7 +198,7 @@ describe('rule', () => { }, state: [{ 'anything-but': ['initializing'] }], limit: [{ 'anything-but': [100, 200, 300] }], - notPrefixedBy: [{ 'anything-but': { 'prefix': ['sensitive-'] } }], + notPrefixedBy: [{ 'anything-but': { 'prefix': 'sensitive-' } }], }, 'detail-type': ['detailType1'], id: ['id1', 'id2'], From e6729ef0e4374437601e882f5612c3347c69b19c Mon Sep 17 00:00:00 2001 From: John Walker Date: Sat, 9 Nov 2024 14:07:16 +0000 Subject: [PATCH 10/17] refactor and add comment for clarity --- packages/aws-cdk-lib/aws-events/lib/event-pattern.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts index 74f7dddd92dc4..8a26f8d5aef98 100644 --- a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts +++ b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts @@ -218,7 +218,10 @@ export class Match implements IResolvable { throw new Error('anythingBut matchers must be non-empty lists'); } - return this.fromObjects([{ 'anything-but': { [filterKey]: values.length === 1 ? values[0] : values } }]); + // When there is a single value return it, otherwise return the array + const filterValue = values.length === 1 ? values[0] : values; + + return this.fromObjects([{ 'anything-but': { [filterKey]: filterValue } }]); } private static numeric(operator: ComparisonOperator, value: number): string[] { From 98fbb4fc5bf5dc2b05be1d11e9bd4ed3bbf15d42 Mon Sep 17 00:00:00 2001 From: John Walker Date: Sat, 9 Nov 2024 14:07:37 +0000 Subject: [PATCH 11/17] update integration test snapshot --- .../integ.rule.js.snapshot/RuleStack.assets.json | 4 ++-- .../RuleStack.template.json | 16 ++++------------ .../test/integ.rule.js.snapshot/manifest.json | 11 +---------- .../test/integ.rule.js.snapshot/tree.json | 16 ++++------------ 4 files changed, 11 insertions(+), 36 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json index 77b75597298ef..473f72707c064 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json @@ -1,7 +1,7 @@ { "version": "38.0.1", "files": { - "4d02feea7194b2b0cb0ce0c947b90f63a75ed25725de6ea5ac1d25d0e73d38ff": { + "d45c24d09ea606a0afb79a53e2106a076bb6a634c118a7b3b12f9993994a38ba": { "source": { "path": "RuleStack.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "4d02feea7194b2b0cb0ce0c947b90f63a75ed25725de6ea5ac1d25d0e73d38ff.json", + "objectKey": "d45c24d09ea606a0afb79a53e2106a076bb6a634c118a7b3b12f9993994a38ba.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json index 48e4b2040078b..dd220cce3c38f 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json @@ -105,9 +105,7 @@ "notPrefixedBy": [ { "anything-but": { - "prefix": [ - "sensitive-" - ] + "prefix": "sensitive-" } } ], @@ -171,9 +169,7 @@ "account": [ { "anything-but": { - "prefix": [ - "prefix-" - ] + "prefix": "prefix-" } } ] @@ -188,9 +184,7 @@ "account": [ { "anything-but": { - "suffix": [ - "-suffix" - ] + "suffix": "-suffix" } } ] @@ -205,9 +199,7 @@ "account": [ { "anything-but": { - "wildcard": [ - "account*" - ] + "wildcard": "account*" } } ] diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json index dec26e11dd1eb..a0958838032cb 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json @@ -19,7 +19,7 @@ "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/4d02feea7194b2b0cb0ce0c947b90f63a75ed25725de6ea5ac1d25d0e73d38ff.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d45c24d09ea606a0afb79a53e2106a076bb6a634c118a7b3b12f9993994a38ba.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -82,15 +82,6 @@ "type": "aws:cdk:logicalId", "data": "CheckBootstrapVersion" } - ], - "MyWilcardRuleF89CAFCF": [ - { - "type": "aws:cdk:logicalId", - "data": "MyWilcardRuleF89CAFCF", - "trace": [ - "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" - ] - } ] }, "displayName": "RuleStack" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json index 6857042ea1806..2a2fd966163f5 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json @@ -120,9 +120,7 @@ "notPrefixedBy": [ { "anything-but": { - "prefix": [ - "sensitive-" - ] + "prefix": "sensitive-" } } ], @@ -222,9 +220,7 @@ "account": [ { "anything-but": { - "prefix": [ - "prefix-" - ] + "prefix": "prefix-" } } ] @@ -257,9 +253,7 @@ "account": [ { "anything-but": { - "suffix": [ - "-suffix" - ] + "suffix": "-suffix" } } ] @@ -292,9 +286,7 @@ "account": [ { "anything-but": { - "wildcard": [ - "account*" - ] + "wildcard": "account*" } } ] From b362fb108a90fc92048ce59401b227457b7f77ad Mon Sep 17 00:00:00 2001 From: John Walker Date: Sat, 9 Nov 2024 14:25:03 +0000 Subject: [PATCH 12/17] add support for prefix and suffix matching while ignoring case --- .../aws-cdk-lib/aws-events/lib/event-pattern.ts | 14 ++++++++++++++ .../aws-cdk-lib/aws-events/test/matchers.test.ts | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts index 8a26f8d5aef98..c9e6750814909 100644 --- a/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts +++ b/packages/aws-cdk-lib/aws-events/lib/event-pattern.ts @@ -65,6 +65,20 @@ export class Match implements IResolvable { return this.fromObjects([{ suffix: value }]); } + /** + * Matches strings with the given prefix in the JSON of the event regardless of the casing + */ + public static prefixEqualsIgnoreCase(value: string): string[] { + return this.fromObjects([{ prefix: { 'equals-ignore-case': value } }]); + } + + /** + * Matches strings with the given suffix in the JSON of the event regardless of the casing + */ + public static suffixEqualsIgnoreCase(value: string): string[] { + return this.fromObjects([{ suffix: { 'equals-ignore-case': value } }]); + } + /** * Matches strings with the given wildcard pattern in the JSON of the event */ diff --git a/packages/aws-cdk-lib/aws-events/test/matchers.test.ts b/packages/aws-cdk-lib/aws-events/test/matchers.test.ts index 4749ca066c00e..b9f9fe24a8403 100644 --- a/packages/aws-cdk-lib/aws-events/test/matchers.test.ts +++ b/packages/aws-cdk-lib/aws-events/test/matchers.test.ts @@ -119,6 +119,18 @@ describe(Match, () => { ]); }); + test('prefixEqualsIgnoreCase', () => { + expect(stack.resolve(Match.prefixEqualsIgnoreCase('foo'))).toEqual([ + { prefix: { 'equals-ignore-case': 'foo' } }, + ]); + }); + + test('suffixEqualsIgnoreCase', () => { + expect(stack.resolve(Match.suffixEqualsIgnoreCase('foo'))).toEqual([ + { suffix: { 'equals-ignore-case': 'foo' } }, + ]); + }); + test('wildcard', () => { expect(stack.resolve(Match.wildcard('*.json'))).toEqual([ { wildcard: '*.json' }, From 2a7f428a17800025d5b6be513b5627d7f5cb4694 Mon Sep 17 00:00:00 2001 From: John Walker Date: Sat, 9 Nov 2024 14:25:35 +0000 Subject: [PATCH 13/17] add integration tests and update snapshot --- .../RuleStack.assets.json | 4 +- .../RuleStack.template.json | 30 +++++++++ .../test/integ.rule.js.snapshot/manifest.json | 14 +++- .../test/integ.rule.js.snapshot/tree.json | 66 +++++++++++++++++++ .../test/aws-events/test/integ.rule.ts | 12 ++++ 5 files changed, 123 insertions(+), 3 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json index 473f72707c064..fcaa8d81d24aa 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.assets.json @@ -1,7 +1,7 @@ { "version": "38.0.1", "files": { - "d45c24d09ea606a0afb79a53e2106a076bb6a634c118a7b3b12f9993994a38ba": { + "48862253eb1fed012c1b274795624b9ddc15444520044ea09a9ecd3ed2f4c300": { "source": { "path": "RuleStack.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "d45c24d09ea606a0afb79a53e2106a076bb6a634c118a7b3b12f9993994a38ba.json", + "objectKey": "48862253eb1fed012c1b274795624b9ddc15444520044ea09a9ecd3ed2f4c300.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json index dd220cce3c38f..51d42081980bd 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/RuleStack.template.json @@ -224,6 +224,36 @@ }, "State": "ENABLED" } + }, + "MyPrefixEqualsIgnoreCaseC9726B40": { + "Type": "AWS::Events::Rule", + "Properties": { + "EventPattern": { + "account": [ + { + "prefix": { + "equals-ignore-case": "prefix-" + } + } + ] + }, + "State": "ENABLED" + } + }, + "MySuffixEqualsIgnoreCaseBE2DDE03": { + "Type": "AWS::Events::Rule", + "Properties": { + "EventPattern": { + "account": [ + { + "suffix": { + "equals-ignore-case": "-suffix" + } + } + ] + }, + "State": "ENABLED" + } } }, "Parameters": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json index a0958838032cb..0db2d9480cad8 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/manifest.json @@ -19,7 +19,7 @@ "notificationArns": [], "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d45c24d09ea606a0afb79a53e2106a076bb6a634c118a7b3b12f9993994a38ba.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/48862253eb1fed012c1b274795624b9ddc15444520044ea09a9ecd3ed2f4c300.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -71,6 +71,18 @@ "data": "MyAnythingButEqualsIgnoreCaseEBE7F91F" } ], + "/RuleStack/MyPrefixEqualsIgnoreCase/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyPrefixEqualsIgnoreCaseC9726B40" + } + ], + "/RuleStack/MySuffixEqualsIgnoreCase/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MySuffixEqualsIgnoreCaseBE2DDE03" + } + ], "/RuleStack/BootstrapVersion": [ { "type": "aws:cdk:logicalId", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json index 2a2fd966163f5..137538f70ceab 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.js.snapshot/tree.json @@ -341,6 +341,72 @@ "version": "10.4.2" } }, + "MyPrefixEqualsIgnoreCase": { + "id": "MyPrefixEqualsIgnoreCase", + "path": "RuleStack/MyPrefixEqualsIgnoreCase", + "children": { + "Resource": { + "id": "Resource", + "path": "RuleStack/MyPrefixEqualsIgnoreCase/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Events::Rule", + "aws:cdk:cloudformation:props": { + "eventPattern": { + "account": [ + { + "prefix": { + "equals-ignore-case": "prefix-" + } + } + ] + }, + "state": "ENABLED" + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + }, + "MySuffixEqualsIgnoreCase": { + "id": "MySuffixEqualsIgnoreCase", + "path": "RuleStack/MySuffixEqualsIgnoreCase", + "children": { + "Resource": { + "id": "Resource", + "path": "RuleStack/MySuffixEqualsIgnoreCase/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Events::Rule", + "aws:cdk:cloudformation:props": { + "eventPattern": { + "account": [ + { + "suffix": { + "equals-ignore-case": "-suffix" + } + } + ] + }, + "state": "ENABLED" + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.4.2" + } + }, "BootstrapVersion": { "id": "BootstrapVersion", "path": "RuleStack/BootstrapVersion", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts index 533187da4c269..64a6fa77ddb51 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-events/test/integ.rule.ts @@ -71,6 +71,18 @@ new Rule(stack, 'MyAnythingButEqualsIgnoreCase', { }, }); +new Rule(stack, 'MyPrefixEqualsIgnoreCase', { + eventPattern: { + account: Match.prefixEqualsIgnoreCase('prefix-'), + }, +}); + +new Rule(stack, 'MySuffixEqualsIgnoreCase', { + eventPattern: { + account: Match.suffixEqualsIgnoreCase('-suffix'), + }, +}); + new IntegTest(app, 'IntegTest-BatchDefaultEnvVarsStack', { testCases: [stack], }); From 03534d9ca85558ce80b8957b3fd97c11db392f6d Mon Sep 17 00:00:00 2001 From: John Walker Date: Wed, 13 Nov 2024 10:09:54 +0100 Subject: [PATCH 14/17] add examples for prefixEqualsIgnoreCase() and suffixEqualsIgnoreCase() in README.md --- packages/aws-cdk-lib/aws-events/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/aws-cdk-lib/aws-events/README.md b/packages/aws-cdk-lib/aws-events/README.md index f3646b207f3d4..241038abfc780 100644 --- a/packages/aws-cdk-lib/aws-events/README.md +++ b/packages/aws-cdk-lib/aws-events/README.md @@ -97,12 +97,18 @@ To define a pattern, use the matcher API, which provides a number of factory met const rule = new events.Rule(this, 'rule', { eventPattern: { detail: { + bucket: { + name: events.Match.prefixEqualsIgnoreCase('my-prefix-') + } + object: { // Matchers may appear at any level size: events.Match.greaterThan(1024), key: events.Match.wildcard('path/to/object/*.txt'), }, + requester: events.Match.suffixEqualsIgnoreCase('.AMAZONAWS.COM') + // 'OR' condition 'source-storage-class': events.Match.anyOf( events.Match.prefix('GLACIER'), From d7f101176bc4146aee16e52848f6c2cb9d39a2f5 Mon Sep 17 00:00:00 2001 From: John Walker Date: Wed, 13 Nov 2024 14:34:23 +0100 Subject: [PATCH 15/17] fix code syntax errors in README.md --- packages/aws-cdk-lib/aws-events/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aws-cdk-lib/aws-events/README.md b/packages/aws-cdk-lib/aws-events/README.md index 241038abfc780..da2682310b1d8 100644 --- a/packages/aws-cdk-lib/aws-events/README.md +++ b/packages/aws-cdk-lib/aws-events/README.md @@ -98,8 +98,8 @@ const rule = new events.Rule(this, 'rule', { eventPattern: { detail: { bucket: { - name: events.Match.prefixEqualsIgnoreCase('my-prefix-') - } + name: events.Match.prefixEqualsIgnoreCase('my-prefix-'), + }, object: { // Matchers may appear at any level @@ -107,7 +107,7 @@ const rule = new events.Rule(this, 'rule', { key: events.Match.wildcard('path/to/object/*.txt'), }, - requester: events.Match.suffixEqualsIgnoreCase('.AMAZONAWS.COM') + requester: events.Match.suffixEqualsIgnoreCase('.AMAZONAWS.COM'), // 'OR' condition 'source-storage-class': events.Match.anyOf( From 41f7ef14f21b643b78c06b3e9095a00a604ef09d Mon Sep 17 00:00:00 2001 From: John Walker Date: Wed, 13 Nov 2024 17:22:34 +0100 Subject: [PATCH 16/17] Update README.md with additional examples for the new methods --- packages/aws-cdk-lib/aws-events/README.md | 62 +++++++++++++++++++---- 1 file changed, 52 insertions(+), 10 deletions(-) diff --git a/packages/aws-cdk-lib/aws-events/README.md b/packages/aws-cdk-lib/aws-events/README.md index da2682310b1d8..678679a8cff7d 100644 --- a/packages/aws-cdk-lib/aws-events/README.md +++ b/packages/aws-cdk-lib/aws-events/README.md @@ -91,31 +91,28 @@ onCommitRule.addTarget(new targets.SnsTopic(topic, { })); ``` -To define a pattern, use the matcher API, which provides a number of factory methods to declare different logical predicates. For example, to match all S3 events for objects larger than 1024 bytes, stored using one of the storage classes Glacier, Glacier IR or Deep Archive and coming from any region other than the AWS GovCloud ones: +### Matchers + +To define a pattern, use the `Match` class, which provides a number of factory methods to declare +different logical predicates. For example, to match all S3 events for objects larger than 1024 +bytes, stored using one of the storage classes Glacier, Glacier IR or Deep Archive and coming from +any region other than the AWS GovCloud ones: ```ts const rule = new events.Rule(this, 'rule', { eventPattern: { detail: { - bucket: { - name: events.Match.prefixEqualsIgnoreCase('my-prefix-'), - }, - object: { // Matchers may appear at any level size: events.Match.greaterThan(1024), - key: events.Match.wildcard('path/to/object/*.txt'), }, - requester: events.Match.suffixEqualsIgnoreCase('.AMAZONAWS.COM'), - // 'OR' condition 'source-storage-class': events.Match.anyOf( events.Match.prefix('GLACIER'), events.Match.exactString('DEEP_ARCHIVE'), ), }, - detailType: events.Match.equalsIgnoreCase('object created'), // If you prefer, you can use a low level array of strings, as directly consumed by EventBridge source: ['aws.s3'], @@ -125,6 +122,52 @@ const rule = new events.Rule(this, 'rule', { }); ``` +Matches can also be made case-insensitive, or make use of wildcard matches. For example, to match +object create events for buckets whose name starts with `raw-`, for objects with key matching +the pattern `path/to/object/*.txt` and the requester ends with `.AMAZONAWS.COM`: + +```ts +const rule = new events.Rule(this, 'rule', { + eventPattern: { + detail: { + bucket: { + name: events.Match.prefixEqualsIgnoreCase('raw-'), + }, + + object: { + key: events.Match.wildcard('path/to/object/*.txt'), + }, + + requester: events.Match.suffixEqualsIgnoreCase('.AMAZONAWS.COM'), + }, + detailType: events.Match.equalsIgnoreCase('object created'), + }, +}); +``` + +The "anything but" matchers also support rest parameters. For example: + +```ts +const rule = new events.Rule(this, 'rule', { + eventPattern: { + region: events.Match.anythingBut('us-east-1', 'us-east-2', 'us-west-1', 'us-west-2'), + + detail: { + bucket: { + name: events.Match.anythingButPrefix('foo', 'bar', 'baz'), + }, + + object: { + key: events.Match.anythingButSuffix('.gif', '.png', '.jpg'), + }, + + requester: events.Match.anythingButWildcard('*.amazonaws.com', '123456789012'), + }, + detailType: events.Match.anythingButEqualsIgnoreCase('object created', 'object deleted'), + }, +}); +``` + ## Scheduling You can configure a Rule to run on a schedule (cron or rate). @@ -278,4 +321,3 @@ new events.EventBus(this, 'Bus', { **Note**: Archives and schema discovery are not supported for event buses encrypted using a customer managed key. To enable archives or schema discovery on an event bus, choose to use an AWS owned key. For more information, see [KMS key options for event bus encryption](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-encryption-at-rest-key-options.html). - From 07a12342dbd4fa2dfcd4b2fd950227caf0a70f36 Mon Sep 17 00:00:00 2001 From: John Walker Date: Sat, 30 Nov 2024 13:41:26 +0100 Subject: [PATCH 17/17] Update packages/aws-cdk-lib/aws-events/README.md Co-authored-by: Grace Luo <54298030+gracelu0@users.noreply.github.com> --- packages/aws-cdk-lib/aws-events/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-events/README.md b/packages/aws-cdk-lib/aws-events/README.md index 678679a8cff7d..a4bc633b94b2f 100644 --- a/packages/aws-cdk-lib/aws-events/README.md +++ b/packages/aws-cdk-lib/aws-events/README.md @@ -145,7 +145,7 @@ const rule = new events.Rule(this, 'rule', { }); ``` -The "anything but" matchers also support rest parameters. For example: +The "anything but" matchers allow you to specify multiple arguments. For example: ```ts const rule = new events.Rule(this, 'rule', {