@mavogel/awscdk-rootmail 0.0.336 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/.codegraph/.gitignore +5 -0
  2. package/.jsii +460 -8
  3. package/CLAUDE.md +1 -1
  4. package/README.md +6 -1
  5. package/docs/plans/2026-08-09-bump-mvc-projen-cdk-nag-v3.md +199 -0
  6. package/integ-tests/integ.rootmail-custom-santa.ts +2 -2
  7. package/integ-tests/integ.rootmail-filter-subject.ts +2 -2
  8. package/integ-tests/integ.rootmail.ts +2 -2
  9. package/lib/hosted-zone-dkim-propagation.js +46 -15
  10. package/lib/hosted-zone-dkim-verification-records.js +47 -12
  11. package/lib/rootmail-autowire-dns.js +47 -15
  12. package/lib/rootmail.js +13 -16
  13. package/lib/ses-receipt-ruleset-activation.js +53 -15
  14. package/lib/ses-receive.js +12 -12
  15. package/node_modules/cdk-nag/.jsii +6331 -2945
  16. package/node_modules/cdk-nag/.jsii.tabl.json +1 -1
  17. package/node_modules/cdk-nag/API.md +490 -1778
  18. package/node_modules/cdk-nag/MIGRATION.md +239 -0
  19. package/node_modules/cdk-nag/README.md +88 -513
  20. package/node_modules/cdk-nag/lib/index.d.ts +0 -3
  21. package/node_modules/cdk-nag/lib/index.js +1 -4
  22. package/node_modules/cdk-nag/lib/nag-logger.d.ts +5 -145
  23. package/node_modules/cdk-nag/lib/nag-logger.js +4 -199
  24. package/node_modules/cdk-nag/lib/nag-pack.d.ts +57 -44
  25. package/node_modules/cdk-nag/lib/nag-pack.js +140 -114
  26. package/node_modules/cdk-nag/lib/nag-rules.d.ts +0 -2
  27. package/node_modules/cdk-nag/lib/nag-rules.js +3 -5
  28. package/node_modules/cdk-nag/lib/packs/aws-solutions.d.ts +4 -15
  29. package/node_modules/cdk-nag/lib/packs/aws-solutions.js +21 -40
  30. package/node_modules/cdk-nag/lib/packs/hipaa-security.d.ts +4 -2
  31. package/node_modules/cdk-nag/lib/packs/hipaa-security.js +31 -37
  32. package/node_modules/cdk-nag/lib/packs/nist-800-53-r4.d.ts +4 -2
  33. package/node_modules/cdk-nag/lib/packs/nist-800-53-r4.js +29 -35
  34. package/node_modules/cdk-nag/lib/packs/nist-800-53-r5.d.ts +4 -2
  35. package/node_modules/cdk-nag/lib/packs/nist-800-53-r5.js +30 -36
  36. package/node_modules/cdk-nag/lib/packs/pci-dss-321.d.ts +4 -2
  37. package/node_modules/cdk-nag/lib/packs/pci-dss-321.js +29 -35
  38. package/node_modules/cdk-nag/lib/packs/serverless.d.ts +4 -2
  39. package/node_modules/cdk-nag/lib/packs/serverless.js +14 -20
  40. package/node_modules/cdk-nag/lib/rules/ec2/EC2IMDSv2Enabled.js +5 -1
  41. package/node_modules/cdk-nag/package.json +5 -5
  42. package/package.json +16 -17
  43. package/node_modules/cdk-nag/lib/ignore-suppression-conditions.d.ts +0 -59
  44. package/node_modules/cdk-nag/lib/ignore-suppression-conditions.js +0 -97
  45. package/node_modules/cdk-nag/lib/models/nag-suppression.d.ts +0 -30
  46. package/node_modules/cdk-nag/lib/models/nag-suppression.js +0 -7
  47. package/node_modules/cdk-nag/lib/nag-suppressions.d.ts +0 -30
  48. package/node_modules/cdk-nag/lib/nag-suppressions.js +0 -96
  49. package/node_modules/cdk-nag/lib/utils/nag-suppression-helper.d.ts +0 -20
  50. package/node_modules/cdk-nag/lib/utils/nag-suppression-helper.js +0 -119
package/.jsii CHANGED
@@ -13,13 +13,13 @@
13
13
  "@aws-sdk/client-s3": "^3.1083.0",
14
14
  "@aws-sdk/client-ses": "^3.1083.0",
15
15
  "@aws-sdk/client-ssm": "^3.1083.0",
16
- "cdk-nag": "^2.37.55",
16
+ "cdk-nag": "^3.0.1",
17
17
  "mailparser": "^3.9.14",
18
18
  "uuid": "^14.0.1"
19
19
  },
20
20
  "dependencies": {
21
- "@mavogel/mvc-projen": "^0.0.25",
22
- "aws-cdk-lib": "^2.243.0",
21
+ "@mavogel/mvc-projen": "^0.0.30",
22
+ "aws-cdk-lib": "^2.263.0",
23
23
  "constructs": "^10.5.1"
24
24
  },
25
25
  "dependencyClosure": {
@@ -108,7 +108,7 @@
108
108
  "@mavogel/mvc-projen": {
109
109
  "targets": {
110
110
  "go": {
111
- "moduleName": "github.com/MV-Consulting/mvc-projen"
111
+ "moduleName": "github.com/mavogel/mvc-projen"
112
112
  },
113
113
  "js": {
114
114
  "npm": "@mavogel/mvc-projen"
@@ -550,6 +550,19 @@
550
550
  }
551
551
  }
552
552
  },
553
+ "aws-cdk-lib.aws_awsexternalanthropic": {
554
+ "targets": {
555
+ "dotnet": {
556
+ "namespace": "Amazon.CDK.AWS.AWSExternalAnthropic"
557
+ },
558
+ "java": {
559
+ "package": "software.amazon.awscdk.services.awsexternalanthropic"
560
+ },
561
+ "python": {
562
+ "module": "aws_cdk.aws_awsexternalanthropic"
563
+ }
564
+ }
565
+ },
553
566
  "aws-cdk-lib.aws_b2bi": {
554
567
  "targets": {
555
568
  "dotnet": {
@@ -615,6 +628,19 @@
615
628
  }
616
629
  }
617
630
  },
631
+ "aws-cdk-lib.aws_bcmpricingcalculator": {
632
+ "targets": {
633
+ "dotnet": {
634
+ "namespace": "Amazon.CDK.AWS.BcmPricingCalculator"
635
+ },
636
+ "java": {
637
+ "package": "software.amazon.awscdk.services.bcmpricingcalculator"
638
+ },
639
+ "python": {
640
+ "module": "aws_cdk.aws_bcmpricingcalculator"
641
+ }
642
+ }
643
+ },
618
644
  "aws-cdk-lib.aws_bedrock": {
619
645
  "targets": {
620
646
  "dotnet": {
@@ -667,6 +693,19 @@
667
693
  }
668
694
  }
669
695
  },
696
+ "aws-cdk-lib.aws_braket": {
697
+ "targets": {
698
+ "dotnet": {
699
+ "namespace": "Amazon.CDK.AWS.Braket"
700
+ },
701
+ "java": {
702
+ "package": "software.amazon.awscdk.services.braket"
703
+ },
704
+ "python": {
705
+ "module": "aws_cdk.aws_braket"
706
+ }
707
+ }
708
+ },
670
709
  "aws-cdk-lib.aws_budgets": {
671
710
  "targets": {
672
711
  "dotnet": {
@@ -745,6 +784,19 @@
745
784
  }
746
785
  }
747
786
  },
787
+ "aws-cdk-lib.aws_chime": {
788
+ "targets": {
789
+ "dotnet": {
790
+ "namespace": "Amazon.CDK.AWS.Chime"
791
+ },
792
+ "java": {
793
+ "package": "software.amazon.awscdk.services.chime"
794
+ },
795
+ "python": {
796
+ "module": "aws_cdk.aws_chime"
797
+ }
798
+ }
799
+ },
748
800
  "aws-cdk-lib.aws_cleanrooms": {
749
801
  "targets": {
750
802
  "dotnet": {
@@ -1123,6 +1175,19 @@
1123
1175
  }
1124
1176
  }
1125
1177
  },
1178
+ "aws-cdk-lib.aws_controlcatalog": {
1179
+ "targets": {
1180
+ "dotnet": {
1181
+ "namespace": "Amazon.CDK.AWS.ControlCatalog"
1182
+ },
1183
+ "java": {
1184
+ "package": "software.amazon.awscdk.services.controlcatalog"
1185
+ },
1186
+ "python": {
1187
+ "module": "aws_cdk.aws_controlcatalog"
1188
+ }
1189
+ }
1190
+ },
1126
1191
  "aws-cdk-lib.aws_controltower": {
1127
1192
  "targets": {
1128
1193
  "dotnet": {
@@ -1175,6 +1240,19 @@
1175
1240
  }
1176
1241
  }
1177
1242
  },
1243
+ "aws-cdk-lib.aws_dataexchange": {
1244
+ "targets": {
1245
+ "dotnet": {
1246
+ "namespace": "Amazon.CDK.AWS.DataExchange"
1247
+ },
1248
+ "java": {
1249
+ "package": "software.amazon.awscdk.services.dataexchange"
1250
+ },
1251
+ "python": {
1252
+ "module": "aws_cdk.aws_dataexchange"
1253
+ }
1254
+ }
1255
+ },
1178
1256
  "aws-cdk-lib.aws_datapipeline": {
1179
1257
  "targets": {
1180
1258
  "dotnet": {
@@ -1623,6 +1701,19 @@
1623
1701
  }
1624
1702
  }
1625
1703
  },
1704
+ "aws-cdk-lib.aws_elementalinference": {
1705
+ "targets": {
1706
+ "dotnet": {
1707
+ "namespace": "Amazon.CDK.AWS.ElementalInference"
1708
+ },
1709
+ "java": {
1710
+ "package": "software.amazon.awscdk.services.elementalinference"
1711
+ },
1712
+ "python": {
1713
+ "module": "aws_cdk.aws_elementalinference"
1714
+ }
1715
+ }
1716
+ },
1626
1717
  "aws-cdk-lib.aws_emr": {
1627
1718
  "targets": {
1628
1719
  "dotnet": {
@@ -2039,6 +2130,19 @@
2039
2130
  }
2040
2131
  }
2041
2132
  },
2133
+ "aws-cdk-lib.aws_interconnect": {
2134
+ "targets": {
2135
+ "dotnet": {
2136
+ "namespace": "Amazon.CDK.AWS.Interconnect"
2137
+ },
2138
+ "java": {
2139
+ "package": "software.amazon.awscdk.services.interconnect"
2140
+ },
2141
+ "python": {
2142
+ "module": "aws_cdk.aws_interconnect"
2143
+ }
2144
+ }
2145
+ },
2042
2146
  "aws-cdk-lib.aws_internetmonitor": {
2043
2147
  "targets": {
2044
2148
  "dotnet": {
@@ -2819,6 +2923,19 @@
2819
2923
  }
2820
2924
  }
2821
2925
  },
2926
+ "aws-cdk-lib.aws_novaact": {
2927
+ "targets": {
2928
+ "dotnet": {
2929
+ "namespace": "Amazon.CDK.AWS.NovaAct"
2930
+ },
2931
+ "java": {
2932
+ "package": "software.amazon.awscdk.services.novaact"
2933
+ },
2934
+ "python": {
2935
+ "module": "aws_cdk.aws_novaact"
2936
+ }
2937
+ }
2938
+ },
2822
2939
  "aws-cdk-lib.aws_oam": {
2823
2940
  "targets": {
2824
2941
  "dotnet": {
@@ -2949,6 +3066,19 @@
2949
3066
  }
2950
3067
  }
2951
3068
  },
3069
+ "aws-cdk-lib.aws_outposts": {
3070
+ "targets": {
3071
+ "dotnet": {
3072
+ "namespace": "Amazon.CDK.AWS.Outposts"
3073
+ },
3074
+ "java": {
3075
+ "package": "software.amazon.awscdk.services.outposts"
3076
+ },
3077
+ "python": {
3078
+ "module": "aws_cdk.aws_outposts"
3079
+ }
3080
+ }
3081
+ },
2952
3082
  "aws-cdk-lib.aws_panorama": {
2953
3083
  "targets": {
2954
3084
  "dotnet": {
@@ -3222,6 +3352,19 @@
3222
3352
  }
3223
3353
  }
3224
3354
  },
3355
+ "aws-cdk-lib.aws_resiliencehubv2": {
3356
+ "targets": {
3357
+ "dotnet": {
3358
+ "namespace": "Amazon.CDK.AWS.ResilienceHubV2"
3359
+ },
3360
+ "java": {
3361
+ "package": "software.amazon.awscdk.services.resiliencehubv2"
3362
+ },
3363
+ "python": {
3364
+ "module": "aws_cdk.aws_resiliencehubv2"
3365
+ }
3366
+ }
3367
+ },
3225
3368
  "aws-cdk-lib.aws_resourceexplorer2": {
3226
3369
  "targets": {
3227
3370
  "dotnet": {
@@ -3313,6 +3456,19 @@
3313
3456
  }
3314
3457
  }
3315
3458
  },
3459
+ "aws-cdk-lib.aws_route53globalresolver": {
3460
+ "targets": {
3461
+ "dotnet": {
3462
+ "namespace": "Amazon.CDK.AWS.Route53GlobalResolver"
3463
+ },
3464
+ "java": {
3465
+ "package": "software.amazon.awscdk.services.route53globalresolver"
3466
+ },
3467
+ "python": {
3468
+ "module": "aws_cdk.aws_route53globalresolver"
3469
+ }
3470
+ }
3471
+ },
3316
3472
  "aws-cdk-lib.aws_route53profiles": {
3317
3473
  "targets": {
3318
3474
  "dotnet": {
@@ -3472,6 +3628,19 @@
3472
3628
  }
3473
3629
  }
3474
3630
  },
3631
+ "aws-cdk-lib.aws_s3files": {
3632
+ "targets": {
3633
+ "dotnet": {
3634
+ "namespace": "Amazon.CDK.AWS.S3Files"
3635
+ },
3636
+ "java": {
3637
+ "package": "software.amazon.awscdk.services.s3files"
3638
+ },
3639
+ "python": {
3640
+ "module": "aws_cdk.aws_s3files"
3641
+ }
3642
+ }
3643
+ },
3475
3644
  "aws-cdk-lib.aws_s3objectlambda": {
3476
3645
  "targets": {
3477
3646
  "dotnet": {
@@ -3602,6 +3771,19 @@
3602
3771
  }
3603
3772
  }
3604
3773
  },
3774
+ "aws-cdk-lib.aws_securityagent": {
3775
+ "targets": {
3776
+ "dotnet": {
3777
+ "namespace": "Amazon.CDK.AWS.SecurityAgent"
3778
+ },
3779
+ "java": {
3780
+ "package": "software.amazon.awscdk.services.securityagent"
3781
+ },
3782
+ "python": {
3783
+ "module": "aws_cdk.aws_securityagent"
3784
+ }
3785
+ }
3786
+ },
3605
3787
  "aws-cdk-lib.aws_securityhub": {
3606
3788
  "targets": {
3607
3789
  "dotnet": {
@@ -3953,6 +4135,19 @@
3953
4135
  }
3954
4136
  }
3955
4137
  },
4138
+ "aws-cdk-lib.aws_uxc": {
4139
+ "targets": {
4140
+ "dotnet": {
4141
+ "namespace": "Amazon.CDK.AWS.UXC"
4142
+ },
4143
+ "java": {
4144
+ "package": "software.amazon.awscdk.services.uxc"
4145
+ },
4146
+ "python": {
4147
+ "module": "aws_cdk.aws_uxc"
4148
+ }
4149
+ }
4150
+ },
3956
4151
  "aws-cdk-lib.aws_verifiedpermissions": {
3957
4152
  "targets": {
3958
4153
  "dotnet": {
@@ -4597,6 +4792,22 @@
4597
4792
  }
4598
4793
  }
4599
4794
  },
4795
+ "aws-cdk-lib.interfaces.aws_awsexternalanthropic": {
4796
+ "targets": {
4797
+ "dotnet": {
4798
+ "namespace": "Amazon.CDK.Interfaces.AWSExternalAnthropic"
4799
+ },
4800
+ "go": {
4801
+ "packageName": "interfacesawsawsexternalanthropic"
4802
+ },
4803
+ "java": {
4804
+ "package": "software.amazon.awscdk.interfaces.awsexternalanthropic"
4805
+ },
4806
+ "python": {
4807
+ "module": "aws_cdk.interfaces.aws_awsexternalanthropic"
4808
+ }
4809
+ }
4810
+ },
4600
4811
  "aws-cdk-lib.interfaces.aws_b2bi": {
4601
4812
  "targets": {
4602
4813
  "dotnet": {
@@ -4661,6 +4872,22 @@
4661
4872
  }
4662
4873
  }
4663
4874
  },
4875
+ "aws-cdk-lib.interfaces.aws_bcm": {
4876
+ "targets": {
4877
+ "dotnet": {
4878
+ "namespace": "Amazon.CDK.Interfaces.BCM"
4879
+ },
4880
+ "go": {
4881
+ "packageName": "interfacesawsbcm"
4882
+ },
4883
+ "java": {
4884
+ "package": "software.amazon.awscdk.interfaces.bcm"
4885
+ },
4886
+ "python": {
4887
+ "module": "aws_cdk.interfaces.aws_bcm"
4888
+ }
4889
+ }
4890
+ },
4664
4891
  "aws-cdk-lib.interfaces.aws_bcmdataexports": {
4665
4892
  "targets": {
4666
4893
  "dotnet": {
@@ -4677,6 +4904,22 @@
4677
4904
  }
4678
4905
  }
4679
4906
  },
4907
+ "aws-cdk-lib.interfaces.aws_bcmpricingcalculator": {
4908
+ "targets": {
4909
+ "dotnet": {
4910
+ "namespace": "Amazon.CDK.Interfaces.BcmPricingCalculator"
4911
+ },
4912
+ "go": {
4913
+ "packageName": "interfacesawsbcmpricingcalculator"
4914
+ },
4915
+ "java": {
4916
+ "package": "software.amazon.awscdk.interfaces.bcmpricingcalculator"
4917
+ },
4918
+ "python": {
4919
+ "module": "aws_cdk.interfaces.aws_bcmpricingcalculator"
4920
+ }
4921
+ }
4922
+ },
4680
4923
  "aws-cdk-lib.interfaces.aws_bedrock": {
4681
4924
  "targets": {
4682
4925
  "dotnet": {
@@ -4757,6 +5000,22 @@
4757
5000
  }
4758
5001
  }
4759
5002
  },
5003
+ "aws-cdk-lib.interfaces.aws_braket": {
5004
+ "targets": {
5005
+ "dotnet": {
5006
+ "namespace": "Amazon.CDK.Interfaces.Braket"
5007
+ },
5008
+ "go": {
5009
+ "packageName": "interfacesawsbraket"
5010
+ },
5011
+ "java": {
5012
+ "package": "software.amazon.awscdk.interfaces.braket"
5013
+ },
5014
+ "python": {
5015
+ "module": "aws_cdk.interfaces.aws_braket"
5016
+ }
5017
+ }
5018
+ },
4760
5019
  "aws-cdk-lib.interfaces.aws_budgets": {
4761
5020
  "targets": {
4762
5021
  "dotnet": {
@@ -4853,6 +5112,22 @@
4853
5112
  }
4854
5113
  }
4855
5114
  },
5115
+ "aws-cdk-lib.interfaces.aws_chime": {
5116
+ "targets": {
5117
+ "dotnet": {
5118
+ "namespace": "Amazon.CDK.Interfaces.Chime"
5119
+ },
5120
+ "go": {
5121
+ "packageName": "interfacesawschime"
5122
+ },
5123
+ "java": {
5124
+ "package": "software.amazon.awscdk.interfaces.chime"
5125
+ },
5126
+ "python": {
5127
+ "module": "aws_cdk.interfaces.aws_chime"
5128
+ }
5129
+ }
5130
+ },
4856
5131
  "aws-cdk-lib.interfaces.aws_cleanrooms": {
4857
5132
  "targets": {
4858
5133
  "dotnet": {
@@ -5253,6 +5528,22 @@
5253
5528
  }
5254
5529
  }
5255
5530
  },
5531
+ "aws-cdk-lib.interfaces.aws_controlcatalog": {
5532
+ "targets": {
5533
+ "dotnet": {
5534
+ "namespace": "Amazon.CDK.Interfaces.ControlCatalog"
5535
+ },
5536
+ "go": {
5537
+ "packageName": "interfacesawscontrolcatalog"
5538
+ },
5539
+ "java": {
5540
+ "package": "software.amazon.awscdk.interfaces.controlcatalog"
5541
+ },
5542
+ "python": {
5543
+ "module": "aws_cdk.interfaces.aws_controlcatalog"
5544
+ }
5545
+ }
5546
+ },
5256
5547
  "aws-cdk-lib.interfaces.aws_controltower": {
5257
5548
  "targets": {
5258
5549
  "dotnet": {
@@ -5317,6 +5608,22 @@
5317
5608
  }
5318
5609
  }
5319
5610
  },
5611
+ "aws-cdk-lib.interfaces.aws_dataexchange": {
5612
+ "targets": {
5613
+ "dotnet": {
5614
+ "namespace": "Amazon.CDK.Interfaces.DataExchange"
5615
+ },
5616
+ "go": {
5617
+ "packageName": "interfacesawsdataexchange"
5618
+ },
5619
+ "java": {
5620
+ "package": "software.amazon.awscdk.interfaces.dataexchange"
5621
+ },
5622
+ "python": {
5623
+ "module": "aws_cdk.interfaces.aws_dataexchange"
5624
+ }
5625
+ }
5626
+ },
5320
5627
  "aws-cdk-lib.interfaces.aws_datapipeline": {
5321
5628
  "targets": {
5322
5629
  "dotnet": {
@@ -5749,6 +6056,22 @@
5749
6056
  }
5750
6057
  }
5751
6058
  },
6059
+ "aws-cdk-lib.interfaces.aws_elementalinference": {
6060
+ "targets": {
6061
+ "dotnet": {
6062
+ "namespace": "Amazon.CDK.Interfaces.ElementalInference"
6063
+ },
6064
+ "go": {
6065
+ "packageName": "interfacesawselementalinference"
6066
+ },
6067
+ "java": {
6068
+ "package": "software.amazon.awscdk.interfaces.elementalinference"
6069
+ },
6070
+ "python": {
6071
+ "module": "aws_cdk.interfaces.aws_elementalinference"
6072
+ }
6073
+ }
6074
+ },
5752
6075
  "aws-cdk-lib.interfaces.aws_emr": {
5753
6076
  "targets": {
5754
6077
  "dotnet": {
@@ -6229,6 +6552,22 @@
6229
6552
  }
6230
6553
  }
6231
6554
  },
6555
+ "aws-cdk-lib.interfaces.aws_interconnect": {
6556
+ "targets": {
6557
+ "dotnet": {
6558
+ "namespace": "Amazon.CDK.Interfaces.Interconnect"
6559
+ },
6560
+ "go": {
6561
+ "packageName": "interfacesawsinterconnect"
6562
+ },
6563
+ "java": {
6564
+ "package": "software.amazon.awscdk.interfaces.interconnect"
6565
+ },
6566
+ "python": {
6567
+ "module": "aws_cdk.interfaces.aws_interconnect"
6568
+ }
6569
+ }
6570
+ },
6232
6571
  "aws-cdk-lib.interfaces.aws_internetmonitor": {
6233
6572
  "targets": {
6234
6573
  "dotnet": {
@@ -7125,6 +7464,22 @@
7125
7464
  }
7126
7465
  }
7127
7466
  },
7467
+ "aws-cdk-lib.interfaces.aws_novaact": {
7468
+ "targets": {
7469
+ "dotnet": {
7470
+ "namespace": "Amazon.CDK.Interfaces.NovaAct"
7471
+ },
7472
+ "go": {
7473
+ "packageName": "interfacesawsnovaact"
7474
+ },
7475
+ "java": {
7476
+ "package": "software.amazon.awscdk.interfaces.novaact"
7477
+ },
7478
+ "python": {
7479
+ "module": "aws_cdk.interfaces.aws_novaact"
7480
+ }
7481
+ }
7482
+ },
7128
7483
  "aws-cdk-lib.interfaces.aws_oam": {
7129
7484
  "targets": {
7130
7485
  "dotnet": {
@@ -7285,6 +7640,22 @@
7285
7640
  }
7286
7641
  }
7287
7642
  },
7643
+ "aws-cdk-lib.interfaces.aws_outposts": {
7644
+ "targets": {
7645
+ "dotnet": {
7646
+ "namespace": "Amazon.CDK.Interfaces.Outposts"
7647
+ },
7648
+ "go": {
7649
+ "packageName": "interfacesawsoutposts"
7650
+ },
7651
+ "java": {
7652
+ "package": "software.amazon.awscdk.interfaces.outposts"
7653
+ },
7654
+ "python": {
7655
+ "module": "aws_cdk.interfaces.aws_outposts"
7656
+ }
7657
+ }
7658
+ },
7288
7659
  "aws-cdk-lib.interfaces.aws_panorama": {
7289
7660
  "targets": {
7290
7661
  "dotnet": {
@@ -7621,6 +7992,22 @@
7621
7992
  }
7622
7993
  }
7623
7994
  },
7995
+ "aws-cdk-lib.interfaces.aws_resiliencehubv2": {
7996
+ "targets": {
7997
+ "dotnet": {
7998
+ "namespace": "Amazon.CDK.Interfaces.ResilienceHubV2"
7999
+ },
8000
+ "go": {
8001
+ "packageName": "interfacesawsresiliencehubv2"
8002
+ },
8003
+ "java": {
8004
+ "package": "software.amazon.awscdk.interfaces.resiliencehubv2"
8005
+ },
8006
+ "python": {
8007
+ "module": "aws_cdk.interfaces.aws_resiliencehubv2"
8008
+ }
8009
+ }
8010
+ },
7624
8011
  "aws-cdk-lib.interfaces.aws_resourceexplorer2": {
7625
8012
  "targets": {
7626
8013
  "dotnet": {
@@ -7701,6 +8088,22 @@
7701
8088
  }
7702
8089
  }
7703
8090
  },
8091
+ "aws-cdk-lib.interfaces.aws_route53globalresolver": {
8092
+ "targets": {
8093
+ "dotnet": {
8094
+ "namespace": "Amazon.CDK.Interfaces.Route53GlobalResolver"
8095
+ },
8096
+ "go": {
8097
+ "packageName": "interfacesawsroute53globalresolver"
8098
+ },
8099
+ "java": {
8100
+ "package": "software.amazon.awscdk.interfaces.route53globalresolver"
8101
+ },
8102
+ "python": {
8103
+ "module": "aws_cdk.interfaces.aws_route53globalresolver"
8104
+ }
8105
+ }
8106
+ },
7704
8107
  "aws-cdk-lib.interfaces.aws_route53profiles": {
7705
8108
  "targets": {
7706
8109
  "dotnet": {
@@ -7829,6 +8232,22 @@
7829
8232
  }
7830
8233
  }
7831
8234
  },
8235
+ "aws-cdk-lib.interfaces.aws_s3files": {
8236
+ "targets": {
8237
+ "dotnet": {
8238
+ "namespace": "Amazon.CDK.Interfaces.S3Files"
8239
+ },
8240
+ "go": {
8241
+ "packageName": "interfacesawss3files"
8242
+ },
8243
+ "java": {
8244
+ "package": "software.amazon.awscdk.interfaces.s3files"
8245
+ },
8246
+ "python": {
8247
+ "module": "aws_cdk.interfaces.aws_s3files"
8248
+ }
8249
+ }
8250
+ },
7832
8251
  "aws-cdk-lib.interfaces.aws_s3objectlambda": {
7833
8252
  "targets": {
7834
8253
  "dotnet": {
@@ -7973,6 +8392,22 @@
7973
8392
  }
7974
8393
  }
7975
8394
  },
8395
+ "aws-cdk-lib.interfaces.aws_securityagent": {
8396
+ "targets": {
8397
+ "dotnet": {
8398
+ "namespace": "Amazon.CDK.Interfaces.SecurityAgent"
8399
+ },
8400
+ "go": {
8401
+ "packageName": "interfacesawssecurityagent"
8402
+ },
8403
+ "java": {
8404
+ "package": "software.amazon.awscdk.interfaces.securityagent"
8405
+ },
8406
+ "python": {
8407
+ "module": "aws_cdk.interfaces.aws_securityagent"
8408
+ }
8409
+ }
8410
+ },
7976
8411
  "aws-cdk-lib.interfaces.aws_securityhub": {
7977
8412
  "targets": {
7978
8413
  "dotnet": {
@@ -8357,6 +8792,22 @@
8357
8792
  }
8358
8793
  }
8359
8794
  },
8795
+ "aws-cdk-lib.interfaces.aws_uxc": {
8796
+ "targets": {
8797
+ "dotnet": {
8798
+ "namespace": "Amazon.CDK.Interfaces.UXC"
8799
+ },
8800
+ "go": {
8801
+ "packageName": "interfacesawsuxc"
8802
+ },
8803
+ "java": {
8804
+ "package": "software.amazon.awscdk.interfaces.uxc"
8805
+ },
8806
+ "python": {
8807
+ "module": "aws_cdk.interfaces.aws_uxc"
8808
+ }
8809
+ }
8810
+ },
8360
8811
  "aws-cdk-lib.interfaces.aws_verifiedpermissions": {
8361
8812
  "targets": {
8362
8813
  "dotnet": {
@@ -8673,6 +9124,7 @@
8673
9124
  "projen.cdk": {},
8674
9125
  "projen.cdk8s": {},
8675
9126
  "projen.cdktf": {},
9127
+ "projen.cdktn": {},
8676
9128
  "projen.circleci": {},
8677
9129
  "projen.github": {},
8678
9130
  "projen.github.workflows": {},
@@ -8728,11 +9180,11 @@
8728
9180
  "hasDefaultInterfaces": true
8729
9181
  }
8730
9182
  },
8731
- "tscRootDir": "src"
9183
+ "tscRootDir": "/home/runner/work/awscdk-rootmail/awscdk-rootmail/src"
8732
9184
  },
8733
9185
  "name": "@mavogel/awscdk-rootmail",
8734
9186
  "readme": {
8735
- "markdown": "![Source](https://img.shields.io/github/stars/MV-Consulting/awscdk-rootmail?logo=github&label=GitHub%20Stars)\n[![Build Status](https://github.com/MV-Consulting/awscdk-rootmail/actions/workflows/build.yml/badge.svg)](https://github.com/MV-Consulting/awscdk-rootmail/actions/workflows/build.yml)\n[![ESLint Code Formatting](https://img.shields.io/badge/code_style-eslint-brightgreen.svg)](https://eslint.org)\n[![Latest release](https://img.shields.io/github/release/MV-Consulting/awscdk-rootmail.svg)](https://github.com/MV-Consulting/awscdk-rootmail/releases)\n![GitHub](https://img.shields.io/github/license/MV-Consulting/awscdk-rootmail)\n[![npm](https://img.shields.io/npm/dt/@mavogel/awscdk-rootmail?label=npm&color=orange)](https://www.npmjs.com/package/@mavogel/awscdk-rootmail)\n[![typescript](https://img.shields.io/badge/jsii-typescript-blueviolet.svg)](https://www.npmjs.com/package/@mavogel/cdk-vscode-server)\n\n# awscdk-rootmail\n\nA single email box for all your root user emails in all AWS accounts of the organization.\n- The cdk implementation and **adaption** of the [superwerker](https://superwerker.cloud/) rootmail feature.\n- See [here](docs/adrs/rootmail.md) for a detailed Architectural Decision Record ([ADR](https://adr.github.io/))\n\n## TL;DR ⚡\nEach AWS account needs one unique email address (the so-called \"AWS account root user email address\").\n\nAccess to these email addresses must be adequately secured since they provide privileged access to AWS accounts, such as account deletion procedures.\n\nThis is why you only need 1 mailing list for the AWS Management (formerly *root*) account,\nwe recommend the following pattern `aws-roots+<uuid>@mycompany.test`\n\n> [!NOTE]\n> Maximum **64** characters are allowed for the whole address.\n\nAnd as you own the domain `mycompany.test` you can add a subdomain, e.g. `aws`, for which all EMails will then be received with this solution within this particular AWS Management account.\n\nFeel free to take a look at the design\n![rootmail-solution-diagram-v1](docs/img/awscdk-rootmail-v1-min.png)\n\n## Usage ✨\n\nInstall the dependencies:\n```sh\nbrew install aws-cli node@18 esbuild\n```\n\nYou can chose via embedding the construct in your cdk-app or use is directly via Cloudformation.\n### cdk 🤖\n1. To start a new project we recommend using [projen](https://projen.io/).\n 1. Create a new projen project\n ```sh\n npx projen new awscdk-app-ts\n ```\n 2. Add `@mavogel/awscdk-rootmail` as a dependency to your project in the `.projenrc.ts` file\n 3. Run `yarn run projen` to install it\n2. In you `main.ts` file add the following code\n```ts\nimport { Rootmail } from '@mavogel/awscdk-rootmail';\nimport {\n App,\n Stack,\n StackProps,\n aws_route53 as r53,\n} from 'aws-cdk-lib';\nimport { Construct } from 'constructs';\n\nexport class MyStack extends Stack {\n constructor(scope: Construct, id: string, props: StackProps = {}) {\n super(scope, id, props);\n\n const domain = 'mycompany.com' // registered via Route53 in the SAME account\n\n const hostedZone = r53.HostedZone.fromLookup(this, 'rootmail-parent-hosted-zone', {\n domainName: domain,\n });\n\n new Rootmail(this, 'rootmail', {\n // 1. a domain you own, registered via Route53 in the SAME account\n domain: domain,\n // 2. so the subdomain will be aws.mycompany.test and\n subdomain: 'aws',\n // 3. wired / delegated automatically to\n wireDNSToHostedZoneID: hostedZone.hostedZoneId,\n });\n }\n}\n```\n2. run on your commandline\n```sh\nyarn run deploy\n```\n1. No need to do anything, the NS records are **automatically** propagated as the parent Hosted Zone is in the same account!\n2. The `hosted-zone-dkim-propagation-provider.is-complete-handler` Lambda function checks every 10 seconds if the DNS for the subdomain is propagated. Details are in the Cloudwatch log group.\n\n> [!TIP]\n> Take a look at the solution design [here](docs/adrs/solution-design-domain-same-aws-account.md) for more details.\n\n### cdk with your own receiver function 🏗️\nYou might also want to pass in you own function on what to do when an EMail is received\n\n> [!TIP]\n> You can add any custom code as receiver function you want.\n\n<details>\n <summary>... click here for the details</summary>\n\nfile `functions/custom-ses-receive-function.ts` which gets the 2 environment variables populated\n- `EMAIL_BUCKET`\n- `EMAIL_BUCKET_ARN`\n\nas well as `s3:GetObject` on the `RootMail/*` objects in the created Rootmail `S3` bucket.\n\n```ts\nimport { S3 } from '@aws-sdk/client-s3';\nimport { ParsedMail, simpleParser } from 'mailparser';\n// populated by default\nconst emailBucket = process.env.EMAIL_BUCKET;\nconst emailBucketArn = process.env.EMAIL_BUCKET_ARN;\nconst s3 = new S3();\n\n// SESEventRecordsToLambda\n// from https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-lambda-event.html\nexport const handler = async (event: SESEventRecordsToLambda) => {\n for (const record of event.Records) {\n\n const id = record.ses.mail.messageId;\n const key = `RootMail/${id}`;\n const response = await s3.getObject({ Bucket: emailBucket as string, Key: key });\n\n const msg: ParsedMail = await simpleParser(response.Body as unknown as Buffer);\n\n let title = msg.subject;\n console.log(`Title: ${title} from emailBucketArn: ${emailBucketArn}`);\n // use the content of the email body\n const body = msg.html;\n // add your custom code here ...\n\n // dummy example: list s3 buckets\n const buckets = await s3.listBuckets({});\n if (!buckets.Buckets) {\n console.log('No buckets found');\n return;\n }\n console.log('Buckets:');\n for (const bucket of buckets.Buckets || []) {\n console.log(bucket.Name);\n }\n }\n\n};\n```\nand you create a separate `NodejsFunction` as follows with the additionally needed IAM permissions:\n```ts\nconst customSesReceiveFunction = new NodejsFunction(stackUnderTest, 'custom-ses-receive-function', {\n functionName: PhysicalName.GENERATE_IF_NEEDED,\n entry: path.join(__dirname, 'functions', 'custom-ses-receive-function.ts'),\n runtime: lambda.Runtime.NODEJS_18_X,\n logRetention: 1,\n timeout: Duration.seconds(30),\n});\n\n// Note: any additional permissions you need to add to the function yourself!\ncustomSesReceiveFunction.addToRolePolicy(new iam.PolicyStatement({\n actions: [\n 's3:List*',\n ],\n resources: ['*'],\n}))\n```\nand then pass it into the `Rootmail` Stack\n```ts\nexport class MyStack extends Stack {\n constructor(scope: Construct, id: string, props: StackProps = {}) {\n super(scope, id, props);\n\n const domain = 'mycompany.test'\n const hostedZone = r53.HostedZone.fromLookup(this, 'rootmail-parent-hosted-zone', {\n domainName: domain,\n });\n\n const rootmail = new Rootmail(this, 'rootmail-stack', {\n domain: domain;\n autowireDNSParentHostedZoneID: hostedZone.hostedZoneId,\n env: {\n region: 'eu-west-1',\n },\n customSesReceiveFunction: customSesReceiveFunction, // <- pass it in here\n });\n }\n}\n```\n\n\n> [!TIP]\n> Take a look at the solution design for external DNS [here](docs/adrs/solution-design-external-dns-provider.md) for more details.\n\n</details>\n\n### Cloudformation 📦\nor use it directly a Cloudformation template `yaml` from the URL [here](https://mvc-prod-releases.s3.eu-central-1.amazonaws.com/rootmail/v0.0.258/awscdk-rootmail.template.yaml).\n\n\n<details>\n <summary>... click here for the details</summary>\n\nand fill out the parameters\n![cloudformation-template](docs/img/cloudformation-tpl-min.png)\n\n</details>\n\n\n## Known issues\n- [jsii/2071](https://github.com/aws/jsii/issues/2071): so adding `compilerOptions.\"esModuleInterop\": true,` in `tsconfig.json` is not possible. See aws-cdk usage with[typescript](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/#Usage_with_TypeScript). So we needed to change import from `import AWS from 'aws-sdk';` -> `import * as AWS from 'aws-sdk';` to be able to compile.\n\n## Related projects / questions\n- [aws-account-factory-email](https://github.com/aws-samples/aws-account-factory-email): a similar approach with SES, however you need to manually configure it upfront and also it about delivering root mails for a specific account to a specific mailing list and mainly decouples the real email address from the one of the AWS account. The main difference is that we do not *hide* or decouple the email address, but more make those as unique and unguessable/bruteforable as possible (with `uuids`).\n- The question `Is it best practise to use a shared mailbox as AWS root user address?` from [stackoverflow](https://stackoverflow.com/questions/76739635/is-it-best-practise-to-use-a-shared-mailbox-as-aws-root-user-address): yes of course you can also use `root+alias-1@mycompany.com` and `root+alias-2@mycompany.com` etc. for your\nroot EMail boxes.\n\n## 🚀 Unlock the Full Potential of Your AWS Cloud Infrastructure\n\nHi, I’m Manuel, an AWS expert passionate about empowering businesses with **scalable, resilient, and cost-optimized cloud solutions**. With **MV Consulting**, I specialize in crafting **tailored AWS architectures** and **DevOps-driven workflows** that not only meet your current needs but grow with you.\n\n---\n\n### 🌟 Why Work With Me?\n\n✔️ **Tailored AWS Solutions:** Every business is unique, so I design custom solutions that fit your goals and challenges.\n✔️ **Well-Architected Designs:** From scalability to security, my solutions align with AWS Well-Architected Framework.\n✔️ **Cloud-Native Focus:** I specialize in modern, cloud-native systems that embrace the full potential of AWS.\n✔️ **Business-Driven Tech:** Technology should serve your business, not the other way around.\n\n---\n\n### 🛠 What I Bring to the Table\n\n🔑 **12x AWS Certifications**\nI’m **AWS Certified Solutions Architect and DevOps – Professional** and hold numerous additional certifications, so you can trust I’ll bring industry best practices to your projects. Feel free to explose by [badges](https://www.credly.com/users/manuel-vogel)\n\n⚙️ **Infrastructure as Code (IaC)**\nWith deep expertise in **AWS CDK** and **Terraform**, I ensure your infrastructure is automated, maintainable, and scalable.\n\n📦 **DevOps Expertise**\nFrom CI/CD pipelines with **GitHub Actions** and **GitLab CI** to container orchestration **Kubernetes** and others, I deliver workflows that are smooth and efficient.\n\n🌐 **Hands-On Experience**\nWith over **7 years of AWS experience** and a decade in the tech world, I’ve delivered solutions for companies large and small. My open-source contributions showcase my commitment to transparency and innovation. Feel free to explore my [GitHub profile](https://github.com/mavogel)\n\n---\n\n### 💼 Let’s Build Something Great Together\n\nI know that choosing the right partner is critical to your success. When you work with me, you’re not just contracting an engineer – you’re gaining a trusted advisor and hands-on expert who cares about your business as much as you do.\n\n✔️ **Direct Collaboration**: No middlemen or red tape – you work with me directly.\n✔️ **Transparent Process**: Expect open communication, clear timelines, and visible results.\n✔️ **Real Value**: My solutions focus on delivering measurable impact for your business.\n\n\n<a href=\"https://tinyurl.com/mvc-15min\"><img alt=\"Schedule your call\" src=\"https://img.shields.io/badge/schedule%20your%20call-success.svg?style=for-the-badge\"/></a>\n\n---\n\n## 🙌 Acknowledgements\n\nBig shoutout to the amazing team behind [Projen](https://github.com/projen/projen)!\nTheir groundbreaking work simplifies cloud infrastructure projects and inspires us every day. 💡\n\n## Author\n\n[Manuel Vogel](https://manuel-vogel.de/about/)\n\n[![](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/manuel-vogel)\n[![](https://img.shields.io/badge/GitHub-2b3137?style=for-the-badge&logo=github&logoColor=white)](https://github.com/mavogel)"
9187
+ "markdown": "![Source](https://img.shields.io/github/stars/MV-Consulting/awscdk-rootmail?logo=github&label=GitHub%20Stars)\n[![Build Status](https://github.com/MV-Consulting/awscdk-rootmail/actions/workflows/build.yml/badge.svg)](https://github.com/MV-Consulting/awscdk-rootmail/actions/workflows/build.yml)\n[![ESLint Code Formatting](https://img.shields.io/badge/code_style-eslint-brightgreen.svg)](https://eslint.org)\n[![Latest release](https://img.shields.io/github/release/MV-Consulting/awscdk-rootmail.svg)](https://github.com/MV-Consulting/awscdk-rootmail/releases)\n![GitHub](https://img.shields.io/github/license/MV-Consulting/awscdk-rootmail)\n[![npm](https://img.shields.io/npm/dt/@mavogel/awscdk-rootmail?label=npm&color=orange)](https://www.npmjs.com/package/@mavogel/awscdk-rootmail)\n[![typescript](https://img.shields.io/badge/jsii-typescript-blueviolet.svg)](https://www.npmjs.com/package/@mavogel/cdk-vscode-server)\n\n# awscdk-rootmail\n\nA single email box for all your root user emails in all AWS accounts of the organization.\n- The cdk implementation and **adaption** of the [superwerker](https://superwerker.cloud/) rootmail feature.\n- See [here](docs/adrs/rootmail.md) for a detailed Architectural Decision Record ([ADR](https://adr.github.io/))\n\n## TL;DR ⚡\nEach AWS account needs one unique email address (the so-called \"AWS account root user email address\").\n\nAccess to these email addresses must be adequately secured since they provide privileged access to AWS accounts, such as account deletion procedures.\n\nThis is why you only need 1 mailing list for the AWS Management (formerly *root*) account,\nwe recommend the following pattern `aws-roots+<uuid>@mycompany.test`\n\n> [!NOTE]\n> Maximum **64** characters are allowed for the whole address.\n\nAnd as you own the domain `mycompany.test` you can add a subdomain, e.g. `aws`, for which all EMails will then be received with this solution within this particular AWS Management account.\n\nFeel free to take a look at the design\n![rootmail-solution-diagram-v1](docs/img/awscdk-rootmail-v1-min.png)\n\n## Usage ✨\n\nInstall the dependencies:\n```sh\nbrew install aws-cli node@18 esbuild\n```\n\nYou can chose via embedding the construct in your cdk-app or use is directly via Cloudformation.\n### cdk 🤖\n1. To start a new project we recommend using [projen](https://projen.io/).\n 1. Create a new projen project\n ```sh\n npx projen new awscdk-app-ts\n ```\n 2. Add `@mavogel/awscdk-rootmail` as a dependency to your project in the `.projenrc.ts` file\n 3. Run `yarn run projen` to install it\n2. In you `main.ts` file add the following code\n```ts\nimport { Rootmail } from '@mavogel/awscdk-rootmail';\nimport {\n App,\n Stack,\n StackProps,\n aws_route53 as r53,\n} from 'aws-cdk-lib';\nimport { Construct } from 'constructs';\n\nexport class MyStack extends Stack {\n constructor(scope: Construct, id: string, props: StackProps = {}) {\n super(scope, id, props);\n\n const domain = 'mycompany.com' // registered via Route53 in the SAME account\n\n const hostedZone = r53.HostedZone.fromLookup(this, 'rootmail-parent-hosted-zone', {\n domainName: domain,\n });\n\n new Rootmail(this, 'rootmail', {\n // 1. a domain you own, registered via Route53 in the SAME account\n domain: domain,\n // 2. so the subdomain will be aws.mycompany.test and\n subdomain: 'aws',\n // 3. wired / delegated automatically to\n wireDNSToHostedZoneID: hostedZone.hostedZoneId,\n });\n }\n}\n```\n2. run on your commandline\n```sh\nyarn run deploy\n```\n1. No need to do anything, the NS records are **automatically** propagated as the parent Hosted Zone is in the same account!\n2. The `hosted-zone-dkim-propagation-provider.is-complete-handler` Lambda function checks every 10 seconds if the DNS for the subdomain is propagated. Details are in the Cloudwatch log group.\n\n> [!TIP]\n> Take a look at the solution design [here](docs/adrs/solution-design-domain-same-aws-account.md) for more details.\n\n### cdk with your own receiver function 🏗️\nYou might also want to pass in you own function on what to do when an EMail is received\n\n> [!TIP]\n> You can add any custom code as receiver function you want.\n\n<details>\n <summary>... click here for the details</summary>\n\nfile `functions/custom-ses-receive-function.ts` which gets the 2 environment variables populated\n- `EMAIL_BUCKET`\n- `EMAIL_BUCKET_ARN`\n\nas well as `s3:GetObject` on the `RootMail/*` objects in the created Rootmail `S3` bucket.\n\n```ts\nimport { S3 } from '@aws-sdk/client-s3';\nimport { ParsedMail, simpleParser } from 'mailparser';\n// populated by default\nconst emailBucket = process.env.EMAIL_BUCKET;\nconst emailBucketArn = process.env.EMAIL_BUCKET_ARN;\nconst s3 = new S3();\n\n// SESEventRecordsToLambda\n// from https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-lambda-event.html\nexport const handler = async (event: SESEventRecordsToLambda) => {\n for (const record of event.Records) {\n\n const id = record.ses.mail.messageId;\n const key = `RootMail/${id}`;\n const response = await s3.getObject({ Bucket: emailBucket as string, Key: key });\n\n const msg: ParsedMail = await simpleParser(response.Body as unknown as Buffer);\n\n let title = msg.subject;\n console.log(`Title: ${title} from emailBucketArn: ${emailBucketArn}`);\n // use the content of the email body\n const body = msg.html;\n // add your custom code here ...\n\n // dummy example: list s3 buckets\n const buckets = await s3.listBuckets({});\n if (!buckets.Buckets) {\n console.log('No buckets found');\n return;\n }\n console.log('Buckets:');\n for (const bucket of buckets.Buckets || []) {\n console.log(bucket.Name);\n }\n }\n\n};\n```\nand you create a separate `NodejsFunction` as follows with the additionally needed IAM permissions:\n```ts\nconst customSesReceiveFunction = new NodejsFunction(stackUnderTest, 'custom-ses-receive-function', {\n functionName: PhysicalName.GENERATE_IF_NEEDED,\n entry: path.join(__dirname, 'functions', 'custom-ses-receive-function.ts'),\n runtime: lambda.Runtime.NODEJS_24_X,\n logRetention: 1,\n timeout: Duration.seconds(30),\n});\n\n// Note: any additional permissions you need to add to the function yourself!\ncustomSesReceiveFunction.addToRolePolicy(new iam.PolicyStatement({\n actions: [\n 's3:List*',\n ],\n resources: ['*'],\n}))\n```\nand then pass it into the `Rootmail` Stack\n```ts\nexport class MyStack extends Stack {\n constructor(scope: Construct, id: string, props: StackProps = {}) {\n super(scope, id, props);\n\n const domain = 'mycompany.test'\n const hostedZone = r53.HostedZone.fromLookup(this, 'rootmail-parent-hosted-zone', {\n domainName: domain,\n });\n\n const rootmail = new Rootmail(this, 'rootmail-stack', {\n domain: domain;\n autowireDNSParentHostedZoneID: hostedZone.hostedZoneId,\n env: {\n region: 'eu-west-1',\n },\n customSesReceiveFunction: customSesReceiveFunction, // <- pass it in here\n });\n }\n}\n```\n\n\n> [!TIP]\n> Take a look at the solution design for external DNS [here](docs/adrs/solution-design-external-dns-provider.md) for more details.\n\n</details>\n\n### Cloudformation 📦\nor use it directly a Cloudformation template `yaml` from the URL [here](https://mvc-prod-releases.s3.eu-central-1.amazonaws.com/rootmail/v0.0.258/awscdk-rootmail.template.yaml).\n\n\n<details>\n <summary>... click here for the details</summary>\n\nand fill out the parameters\n![cloudformation-template](docs/img/cloudformation-tpl-min.png)\n\n</details>\n\n\n## Known issues\n- [jsii/2071](https://github.com/aws/jsii/issues/2071): so adding `compilerOptions.\"esModuleInterop\": true,` in `tsconfig.json` is not possible. See aws-cdk usage with[typescript](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/#Usage_with_TypeScript). So we needed to change import from `import AWS from 'aws-sdk';` -> `import * as AWS from 'aws-sdk';` to be able to compile.\n- Starting with this release, this construct requires `aws-cdk-lib` `>=2.263.0` and depends on `cdk-nag` `v3`, which replaced its suppression API (`NagSuppressions`) with CDK's native `Validations.of(construct).acknowledge(...)`. If you run `cdk-nag`'s `AwsSolutionsChecks` yourself against a stack containing this construct, be aware of the following gaps in what it can suppress on your behalf:\n - `AwsSolutions-IAM4[Policy::...]` findings (AWS managed policies) cannot be acknowledged at all right now: `aws-cdk-lib`'s `Validations.acknowledge()` rejects any rule ID containing more than one `::`, and every AWS managed policy ARN contains one. This is a currently open upstream bug — see [cdklabs/cdk-nag#2359](https://github.com/cdklabs/cdk-nag/issues/2359) and [#2351](https://github.com/cdklabs/cdk-nag/issues/2351).\n - `AwsSolutions-L1` (Lambda runtime), `AwsSolutions-SF1`/`SF2` (Step Functions logging/X-Ray on the internal custom-resource provider framework), and IAM findings on the shared `LogRetention` singleton are not suppressed by this construct — these were never checked before this release either.\n - Granular `AwsSolutions-IAM5[Resource::<value>]` findings that embed a CDK-generated logical ID or your account/region are not portably suppressible by a shared construct library, since the acknowledged value is specific to how you instantiate `Rootmail` in your own app. Only the portable forms (`Resource::*`, a literal `Action::<name>`) are acknowledged internally.\n - Synthesized CloudFormation templates no longer carry the v2-style `Metadata.cdk_nag.rules_to_suppress` block; acknowledgments are recorded as construct metadata instead. If you rely on that metadata for compliance tooling, run `cdk-nag` yourself with `writeSuppressionsToCloudFormation: true`.\n\n## Related projects / questions\n- [aws-account-factory-email](https://github.com/aws-samples/aws-account-factory-email): a similar approach with SES, however you need to manually configure it upfront and also it about delivering root mails for a specific account to a specific mailing list and mainly decouples the real email address from the one of the AWS account. The main difference is that we do not *hide* or decouple the email address, but more make those as unique and unguessable/bruteforable as possible (with `uuids`).\n- The question `Is it best practise to use a shared mailbox as AWS root user address?` from [stackoverflow](https://stackoverflow.com/questions/76739635/is-it-best-practise-to-use-a-shared-mailbox-as-aws-root-user-address): yes of course you can also use `root+alias-1@mycompany.com` and `root+alias-2@mycompany.com` etc. for your\nroot EMail boxes.\n\n## 🚀 Unlock the Full Potential of Your AWS Cloud Infrastructure\n\nHi, I’m Manuel, an AWS expert passionate about empowering businesses with **scalable, resilient, and cost-optimized cloud solutions**. With **MV Consulting**, I specialize in crafting **tailored AWS architectures** and **DevOps-driven workflows** that not only meet your current needs but grow with you.\n\n---\n\n### 🌟 Why Work With Me?\n\n✔️ **Tailored AWS Solutions:** Every business is unique, so I design custom solutions that fit your goals and challenges.\n✔️ **Well-Architected Designs:** From scalability to security, my solutions align with AWS Well-Architected Framework.\n✔️ **Cloud-Native Focus:** I specialize in modern, cloud-native systems that embrace the full potential of AWS.\n✔️ **Business-Driven Tech:** Technology should serve your business, not the other way around.\n\n---\n\n### 🛠 What I Bring to the Table\n\n🔑 **12x AWS Certifications**\nI’m **AWS Certified Solutions Architect and DevOps – Professional** and hold numerous additional certifications, so you can trust I’ll bring industry best practices to your projects. Feel free to explose by [badges](https://www.credly.com/users/manuel-vogel)\n\n⚙️ **Infrastructure as Code (IaC)**\nWith deep expertise in **AWS CDK** and **Terraform**, I ensure your infrastructure is automated, maintainable, and scalable.\n\n📦 **DevOps Expertise**\nFrom CI/CD pipelines with **GitHub Actions** and **GitLab CI** to container orchestration **Kubernetes** and others, I deliver workflows that are smooth and efficient.\n\n🌐 **Hands-On Experience**\nWith over **7 years of AWS experience** and a decade in the tech world, I’ve delivered solutions for companies large and small. My open-source contributions showcase my commitment to transparency and innovation. Feel free to explore my [GitHub profile](https://github.com/mavogel)\n\n---\n\n### 💼 Let’s Build Something Great Together\n\nI know that choosing the right partner is critical to your success. When you work with me, you’re not just contracting an engineer – you’re gaining a trusted advisor and hands-on expert who cares about your business as much as you do.\n\n✔️ **Direct Collaboration**: No middlemen or red tape – you work with me directly.\n✔️ **Transparent Process**: Expect open communication, clear timelines, and visible results.\n✔️ **Real Value**: My solutions focus on delivering measurable impact for your business.\n\n\n<a href=\"https://tinyurl.com/mvc-15min\"><img alt=\"Schedule your call\" src=\"https://img.shields.io/badge/schedule%20your%20call-success.svg?style=for-the-badge\"/></a>\n\n---\n\n## 🙌 Acknowledgements\n\nBig shoutout to the amazing team behind [Projen](https://github.com/projen/projen)!\nTheir groundbreaking work simplifies cloud infrastructure projects and inspires us every day. 💡\n\n## Author\n\n[Manuel Vogel](https://manuel-vogel.de/about/)\n\n[![](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/manuel-vogel)\n[![](https://img.shields.io/badge/GitHub-2b3137?style=for-the-badge&logo=github&logoColor=white)](https://github.com/mavogel)"
8736
9188
  },
8737
9189
  "repository": {
8738
9190
  "type": "git",
@@ -9165,6 +9617,6 @@
9165
9617
  "symbolId": "src/ses-receive:SESReceiveProps"
9166
9618
  }
9167
9619
  },
9168
- "version": "0.0.336",
9169
- "fingerprint": "Q914i/c73Uqd2oGxhhWzLGnpC3a99Wv4ihiWfkmpLt8="
9620
+ "version": "0.1.0",
9621
+ "fingerprint": "jJ0yoOEigTONSBFV9kLTpvspjak1lypfI1mJnogNAH8="
9170
9622
  }