@aws/nx-plugin 1.0.0-rc.83 → 1.0.0-rc.84

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 (68) hide show
  1. package/migrations.json +26 -1
  2. package/package.json +1 -1
  3. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +51 -2
  4. package/src/agentcore-harness/__snapshots__/generator.spec.ts.snap +4 -5
  5. package/src/agentcore-harness/files/project/README.md.template +4 -5
  6. package/src/migrations/latest/agentcore-harness-no-tools-by-default/__snapshots__/migration.spec.ts.snap +79 -0
  7. package/src/migrations/latest/agentcore-harness-no-tools-by-default/metadata.json +3 -0
  8. package/src/migrations/latest/agentcore-harness-no-tools-by-default/migration.d.ts +6 -0
  9. package/src/migrations/latest/agentcore-harness-no-tools-by-default/migration.js +87 -0
  10. package/src/migrations/latest/agentcore-harness-no-tools-by-default/migration.js.map +1 -0
  11. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/__snapshots__/migration.spec.ts.snap +54 -0
  12. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/metadata.json +3 -0
  13. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/migration.d.ts +6 -0
  14. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/migration.js +86 -0
  15. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/migration.js.map +1 -0
  16. package/src/migrations/latest/terraform-declare-used-providers/metadata.json +3 -0
  17. package/src/migrations/latest/terraform-declare-used-providers/migration.d.ts +6 -0
  18. package/src/migrations/latest/terraform-declare-used-providers/migration.js +147 -0
  19. package/src/migrations/latest/terraform-declare-used-providers/migration.js.map +1 -0
  20. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/__snapshots__/migration.spec.ts.snap +521 -0
  21. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/metadata.json +3 -0
  22. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/migration.d.ts +6 -0
  23. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/migration.js +504 -0
  24. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/migration.js.map +1 -0
  25. package/src/migrations/latest/waf-log-group-cmk-encryption/__snapshots__/migration.spec.ts.snap +286 -0
  26. package/src/migrations/latest/waf-log-group-cmk-encryption/metadata.json +3 -0
  27. package/src/migrations/latest/waf-log-group-cmk-encryption/migration.d.ts +6 -0
  28. package/src/migrations/latest/waf-log-group-cmk-encryption/migration.js +238 -0
  29. package/src/migrations/latest/waf-log-group-cmk-encryption/migration.js.map +1 -0
  30. package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +12 -0
  31. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +231 -24
  32. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +8 -0
  33. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +4 -0
  34. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +31 -2
  35. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +216 -25
  36. package/src/terraform/project/files/application/bootstrap/providers.tf.template +9 -0
  37. package/src/terraform/project/files/application/src/providers.tf.template +4 -0
  38. package/src/terraform/project/files/library/src/main.tf.template +9 -0
  39. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +231 -24
  40. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +8 -0
  41. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +4 -0
  42. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +8 -0
  43. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +4 -0
  44. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +62 -4
  45. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +4 -0
  46. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +35 -8
  47. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +4 -0
  48. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.ts.template +39 -1
  49. package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +8 -1
  50. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +57 -2
  51. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.tf.template +258 -24
  52. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +4 -0
  53. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +8 -0
  54. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +9 -1
  55. package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +60 -7
  56. package/src/utils/dcr-proxy-constructs/files/terraform/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.tf.template +4 -0
  57. package/src/utils/files/terraform/src/metrics/providers.tf.template +12 -0
  58. package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +4 -0
  59. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +33 -8
  60. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +4 -0
  61. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +51 -2
  62. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +18 -0
  63. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +15 -4
  64. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +2 -2
  65. package/src/utils/rdb-constructs/rdb-constructs.d.ts +12 -0
  66. package/src/utils/rdb-constructs/rdb-constructs.js +24 -3
  67. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  68. package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +4 -0
@@ -3420,10 +3420,18 @@ output "api_log_group_arn" {
3420
3420
  required_version = ">= 1.0"
3421
3421
 
3422
3422
  required_providers {
3423
+ archive = {
3424
+ source = "hashicorp/archive"
3425
+ version = "2.8.0"
3426
+ }
3423
3427
  aws = {
3424
3428
  source = "hashicorp/aws"
3425
3429
  version = "6.61.0"
3426
3430
  }
3431
+ random = {
3432
+ source = "hashicorp/random"
3433
+ version = "3.9.0"
3434
+ }
3427
3435
  }
3428
3436
  }
3429
3437
 
@@ -4162,10 +4170,18 @@ output "api_log_group_arn" {
4162
4170
  required_version = ">= 1.0"
4163
4171
 
4164
4172
  required_providers {
4173
+ archive = {
4174
+ source = "hashicorp/archive"
4175
+ version = "2.8.0"
4176
+ }
4165
4177
  aws = {
4166
4178
  source = "hashicorp/aws"
4167
4179
  version = "6.61.0"
4168
4180
  }
4181
+ random = {
4182
+ source = "hashicorp/random"
4183
+ version = "3.9.0"
4184
+ }
4169
4185
  }
4170
4186
  }
4171
4187
 
@@ -4976,10 +4992,18 @@ output "api_log_group_arn" {
4976
4992
  required_version = ">= 1.0"
4977
4993
 
4978
4994
  required_providers {
4995
+ archive = {
4996
+ source = "hashicorp/archive"
4997
+ version = "2.8.0"
4998
+ }
4979
4999
  aws = {
4980
5000
  source = "hashicorp/aws"
4981
5001
  version = "6.61.0"
4982
5002
  }
5003
+ random = {
5004
+ source = "hashicorp/random"
5005
+ version = "3.9.0"
5006
+ }
4983
5007
  }
4984
5008
  }
4985
5009
 
@@ -5643,22 +5667,75 @@ resource "aws_wafv2_web_acl" "api_waf" {
5643
5667
  }
5644
5668
  }
5645
5669
 
5670
+ resource "random_id" "waf_log_suffix" {
5671
+ count = var.enable_waf ? 1 : 0
5672
+ byte_length = 4
5673
+ }
5674
+
5675
+ locals {
5676
+ waf_log_group_name = var.enable_waf ? "aws-waf-logs-\${var.api_name}-\${random_id.waf_log_suffix[0].hex}" : null
5677
+ }
5678
+
5679
+ # KMS key for encrypting WAF request logs at rest
5680
+ resource "aws_kms_key" "waf_logs" {
5681
+ count = var.enable_waf ? 1 : 0
5682
+
5683
+ description = "\${var.api_name} API WAF log encryption"
5684
+ deletion_window_in_days = 7
5685
+ enable_key_rotation = true
5686
+
5687
+ policy = jsonencode({
5688
+ Version = "2012-10-17"
5689
+ Statement = [
5690
+ {
5691
+ Sid = "Enable IAM User Permissions"
5692
+ Effect = "Allow"
5693
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
5694
+ Action = "kms:*"
5695
+ Resource = "*"
5696
+ },
5697
+ {
5698
+ Sid = "Allow CloudWatch Logs"
5699
+ Effect = "Allow"
5700
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
5701
+ Action = [
5702
+ "kms:Encrypt",
5703
+ "kms:Decrypt",
5704
+ "kms:ReEncrypt*",
5705
+ "kms:GenerateDataKey*",
5706
+ "kms:DescribeKey"
5707
+ ]
5708
+ Resource = "*"
5709
+ Condition = {
5710
+ ArnEquals = {
5711
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:\${local.waf_log_group_name}"
5712
+ }
5713
+ }
5714
+ }
5715
+ ]
5716
+ })
5717
+
5718
+ tags = var.tags
5719
+ }
5720
+
5721
+ resource "aws_kms_alias" "waf_logs" {
5722
+ count = var.enable_waf ? 1 : 0
5723
+
5724
+ name = "alias/\${var.api_name}-\${random_id.waf_log_suffix[0].hex}-waf-logs"
5725
+ target_key_id = aws_kms_key.waf_logs[0].key_id
5726
+ }
5727
+
5646
5728
  # CloudWatch Log Group for WAF request logs. Name must start with \`aws-waf-logs-\`.
5647
5729
  resource "aws_cloudwatch_log_group" "api_waf_logs" {
5648
- #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
5649
5730
  #checkov:skip=CKV_AWS_338:Log retention set to one month which is sufficient for WAF logs
5650
5731
  count = var.enable_waf ? 1 : 0
5651
5732
 
5652
- name = "aws-waf-logs-\${var.api_name}-\${random_id.waf_log_suffix[0].hex}"
5733
+ name = local.waf_log_group_name
5653
5734
  retention_in_days = 30
5735
+ kms_key_id = aws_kms_key.waf_logs[0].arn
5654
5736
  tags = var.tags
5655
5737
  }
5656
5738
 
5657
- resource "random_id" "waf_log_suffix" {
5658
- count = var.enable_waf ? 1 : 0
5659
- byte_length = 4
5660
- }
5661
-
5662
5739
  resource "aws_wafv2_web_acl_logging_configuration" "api_waf_logging" {
5663
5740
  count = var.enable_waf ? 1 : 0
5664
5741
 
@@ -5704,10 +5781,18 @@ output "waf_web_acl_arn" {
5704
5781
  required_version = ">= 1.0"
5705
5782
 
5706
5783
  required_providers {
5784
+ archive = {
5785
+ source = "hashicorp/archive"
5786
+ version = "2.8.0"
5787
+ }
5707
5788
  aws = {
5708
5789
  source = "hashicorp/aws"
5709
5790
  version = "6.61.0"
5710
5791
  }
5792
+ random = {
5793
+ source = "hashicorp/random"
5794
+ version = "3.9.0"
5795
+ }
5711
5796
  }
5712
5797
  }
5713
5798
 
@@ -6280,7 +6365,7 @@ module "add_url_to_runtime_config" {
6280
6365
 
6281
6366
  namespace = "connection"
6282
6367
  key = "apis"
6283
- value = { "TestApi" = aws_api_gateway_stage.api_stage.invoke_url }
6368
+ value = { "TestApi" = "\${aws_api_gateway_stage.api_stage.invoke_url}/" }
6284
6369
 
6285
6370
  depends_on = [aws_api_gateway_stage.api_stage]
6286
6371
  }
@@ -6619,22 +6704,75 @@ resource "aws_wafv2_web_acl" "api_waf" {
6619
6704
  }
6620
6705
  }
6621
6706
 
6707
+ resource "random_id" "waf_log_suffix" {
6708
+ count = var.enable_waf ? 1 : 0
6709
+ byte_length = 4
6710
+ }
6711
+
6712
+ locals {
6713
+ waf_log_group_name = var.enable_waf ? "aws-waf-logs-\${var.api_name}-\${random_id.waf_log_suffix[0].hex}" : null
6714
+ }
6715
+
6716
+ # KMS key for encrypting WAF request logs at rest
6717
+ resource "aws_kms_key" "waf_logs" {
6718
+ count = var.enable_waf ? 1 : 0
6719
+
6720
+ description = "\${var.api_name} API WAF log encryption"
6721
+ deletion_window_in_days = 7
6722
+ enable_key_rotation = true
6723
+
6724
+ policy = jsonencode({
6725
+ Version = "2012-10-17"
6726
+ Statement = [
6727
+ {
6728
+ Sid = "Enable IAM User Permissions"
6729
+ Effect = "Allow"
6730
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
6731
+ Action = "kms:*"
6732
+ Resource = "*"
6733
+ },
6734
+ {
6735
+ Sid = "Allow CloudWatch Logs"
6736
+ Effect = "Allow"
6737
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
6738
+ Action = [
6739
+ "kms:Encrypt",
6740
+ "kms:Decrypt",
6741
+ "kms:ReEncrypt*",
6742
+ "kms:GenerateDataKey*",
6743
+ "kms:DescribeKey"
6744
+ ]
6745
+ Resource = "*"
6746
+ Condition = {
6747
+ ArnEquals = {
6748
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:\${local.waf_log_group_name}"
6749
+ }
6750
+ }
6751
+ }
6752
+ ]
6753
+ })
6754
+
6755
+ tags = var.tags
6756
+ }
6757
+
6758
+ resource "aws_kms_alias" "waf_logs" {
6759
+ count = var.enable_waf ? 1 : 0
6760
+
6761
+ name = "alias/\${var.api_name}-\${random_id.waf_log_suffix[0].hex}-waf-logs"
6762
+ target_key_id = aws_kms_key.waf_logs[0].key_id
6763
+ }
6764
+
6622
6765
  # CloudWatch Log Group for WAF request logs. Name must start with \`aws-waf-logs-\`.
6623
6766
  resource "aws_cloudwatch_log_group" "api_waf_logs" {
6624
- #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
6625
6767
  #checkov:skip=CKV_AWS_338:Log retention set to one month which is sufficient for WAF logs
6626
6768
  count = var.enable_waf ? 1 : 0
6627
6769
 
6628
- name = "aws-waf-logs-\${var.api_name}-\${random_id.waf_log_suffix[0].hex}"
6770
+ name = local.waf_log_group_name
6629
6771
  retention_in_days = 30
6772
+ kms_key_id = aws_kms_key.waf_logs[0].arn
6630
6773
  tags = var.tags
6631
6774
  }
6632
6775
 
6633
- resource "random_id" "waf_log_suffix" {
6634
- count = var.enable_waf ? 1 : 0
6635
- byte_length = 4
6636
- }
6637
-
6638
6776
  resource "aws_wafv2_web_acl_logging_configuration" "api_waf_logging" {
6639
6777
  count = var.enable_waf ? 1 : 0
6640
6778
 
@@ -6680,10 +6818,18 @@ output "waf_web_acl_arn" {
6680
6818
  required_version = ">= 1.0"
6681
6819
 
6682
6820
  required_providers {
6821
+ archive = {
6822
+ source = "hashicorp/archive"
6823
+ version = "2.8.0"
6824
+ }
6683
6825
  aws = {
6684
6826
  source = "hashicorp/aws"
6685
6827
  version = "6.61.0"
6686
6828
  }
6829
+ random = {
6830
+ source = "hashicorp/random"
6831
+ version = "3.9.0"
6832
+ }
6687
6833
  }
6688
6834
  }
6689
6835
 
@@ -7245,7 +7391,7 @@ module "add_url_to_runtime_config" {
7245
7391
 
7246
7392
  namespace = "connection"
7247
7393
  key = "apis"
7248
- value = { "TestApi" = aws_api_gateway_stage.api_stage.invoke_url }
7394
+ value = { "TestApi" = "\${aws_api_gateway_stage.api_stage.invoke_url}/" }
7249
7395
 
7250
7396
  depends_on = [aws_api_gateway_stage.api_stage]
7251
7397
  }
@@ -7584,22 +7730,75 @@ resource "aws_wafv2_web_acl" "api_waf" {
7584
7730
  }
7585
7731
  }
7586
7732
 
7733
+ resource "random_id" "waf_log_suffix" {
7734
+ count = var.enable_waf ? 1 : 0
7735
+ byte_length = 4
7736
+ }
7737
+
7738
+ locals {
7739
+ waf_log_group_name = var.enable_waf ? "aws-waf-logs-\${var.api_name}-\${random_id.waf_log_suffix[0].hex}" : null
7740
+ }
7741
+
7742
+ # KMS key for encrypting WAF request logs at rest
7743
+ resource "aws_kms_key" "waf_logs" {
7744
+ count = var.enable_waf ? 1 : 0
7745
+
7746
+ description = "\${var.api_name} API WAF log encryption"
7747
+ deletion_window_in_days = 7
7748
+ enable_key_rotation = true
7749
+
7750
+ policy = jsonencode({
7751
+ Version = "2012-10-17"
7752
+ Statement = [
7753
+ {
7754
+ Sid = "Enable IAM User Permissions"
7755
+ Effect = "Allow"
7756
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
7757
+ Action = "kms:*"
7758
+ Resource = "*"
7759
+ },
7760
+ {
7761
+ Sid = "Allow CloudWatch Logs"
7762
+ Effect = "Allow"
7763
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
7764
+ Action = [
7765
+ "kms:Encrypt",
7766
+ "kms:Decrypt",
7767
+ "kms:ReEncrypt*",
7768
+ "kms:GenerateDataKey*",
7769
+ "kms:DescribeKey"
7770
+ ]
7771
+ Resource = "*"
7772
+ Condition = {
7773
+ ArnEquals = {
7774
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:\${local.waf_log_group_name}"
7775
+ }
7776
+ }
7777
+ }
7778
+ ]
7779
+ })
7780
+
7781
+ tags = var.tags
7782
+ }
7783
+
7784
+ resource "aws_kms_alias" "waf_logs" {
7785
+ count = var.enable_waf ? 1 : 0
7786
+
7787
+ name = "alias/\${var.api_name}-\${random_id.waf_log_suffix[0].hex}-waf-logs"
7788
+ target_key_id = aws_kms_key.waf_logs[0].key_id
7789
+ }
7790
+
7587
7791
  # CloudWatch Log Group for WAF request logs. Name must start with \`aws-waf-logs-\`.
7588
7792
  resource "aws_cloudwatch_log_group" "api_waf_logs" {
7589
- #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
7590
7793
  #checkov:skip=CKV_AWS_338:Log retention set to one month which is sufficient for WAF logs
7591
7794
  count = var.enable_waf ? 1 : 0
7592
7795
 
7593
- name = "aws-waf-logs-\${var.api_name}-\${random_id.waf_log_suffix[0].hex}"
7796
+ name = local.waf_log_group_name
7594
7797
  retention_in_days = 30
7798
+ kms_key_id = aws_kms_key.waf_logs[0].arn
7595
7799
  tags = var.tags
7596
7800
  }
7597
7801
 
7598
- resource "random_id" "waf_log_suffix" {
7599
- count = var.enable_waf ? 1 : 0
7600
- byte_length = 4
7601
- }
7602
-
7603
7802
  resource "aws_wafv2_web_acl_logging_configuration" "api_waf_logging" {
7604
7803
  count = var.enable_waf ? 1 : 0
7605
7804
 
@@ -7645,10 +7844,18 @@ output "waf_web_acl_arn" {
7645
7844
  required_version = ">= 1.0"
7646
7845
 
7647
7846
  required_providers {
7847
+ archive = {
7848
+ source = "hashicorp/archive"
7849
+ version = "2.8.0"
7850
+ }
7648
7851
  aws = {
7649
7852
  source = "hashicorp/aws"
7650
7853
  version = "6.61.0"
7651
7854
  }
7855
+ random = {
7856
+ source = "hashicorp/random"
7857
+ version = "3.9.0"
7858
+ }
7652
7859
  }
7653
7860
  }
7654
7861
 
@@ -8293,7 +8500,7 @@ module "add_url_to_runtime_config" {
8293
8500
 
8294
8501
  namespace = "connection"
8295
8502
  key = "apis"
8296
- value = { "TestApi" = aws_api_gateway_stage.api_stage.invoke_url }
8503
+ value = { "TestApi" = "\${aws_api_gateway_stage.api_stage.invoke_url}/" }
8297
8504
 
8298
8505
  depends_on = [aws_api_gateway_stage.api_stage]
8299
8506
  }
@@ -982,6 +982,10 @@ export * from './workspace.js';
982
982
  exports[`ts#agent generator > should match snapshot for Terraform generated files > terraform-agent.tf 1`] = `
983
983
  "terraform {
984
984
  required_providers {
985
+ aws = {
986
+ source = "hashicorp/aws"
987
+ version = "6.61.0"
988
+ }
985
989
  random = {
986
990
  source = "hashicorp/random"
987
991
  version = "3.9.0"
@@ -1293,6 +1297,10 @@ exports[`ts#agent generator > should match snapshot for Terraform generated file
1293
1297
  source = "hashicorp/aws"
1294
1298
  version = "6.61.0"
1295
1299
  }
1300
+ external = {
1301
+ source = "hashicorp/external"
1302
+ version = "2.4.1"
1303
+ }
1296
1304
  null = {
1297
1305
  source = "hashicorp/null"
1298
1306
  version = "3.3.1"
@@ -585,6 +585,10 @@ terraform {
585
585
  source = "hashicorp/archive"
586
586
  version = "2.8.0"
587
587
  }
588
+ random = {
589
+ source = "hashicorp/random"
590
+ version = "3.9.0"
591
+ }
588
592
  }
589
593
  }
590
594
 
@@ -147,6 +147,10 @@ exports[`ts-lambda-function generator > terraform iac > should generate terrafor
147
147
  source = "hashicorp/archive"
148
148
  version = "2.8.0"
149
149
  }
150
+ random = {
151
+ source = "hashicorp/random"
152
+ version = "3.9.0"
153
+ }
150
154
  }
151
155
  }
152
156
 
@@ -328,6 +332,10 @@ exports[`ts-lambda-function generator > terraform iac > should match snapshot fo
328
332
  source = "hashicorp/archive"
329
333
  version = "2.8.0"
330
334
  }
335
+ random = {
336
+ source = "hashicorp/random"
337
+ version = "3.9.0"
338
+ }
331
339
  }
332
340
  }
333
341
 
@@ -157,6 +157,10 @@ exports[`ts#mcp-server generator > should match snapshot for Terraform generated
157
157
  source = "hashicorp/aws"
158
158
  version = "6.61.0"
159
159
  }
160
+ external = {
161
+ source = "hashicorp/external"
162
+ version = "2.4.1"
163
+ }
160
164
  null = {
161
165
  source = "hashicorp/null"
162
166
  version = "3.3.1"
@@ -539,6 +539,20 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
539
539
  * @default true
540
540
  */
541
541
  readonly enablePerformanceInsights?: boolean;
542
+
543
+ /**
544
+ * Minimum Aurora Serverless v2 ACUs.
545
+ *
546
+ * @default 0.5
547
+ */
548
+ readonly serverlessV2MinCapacity?: number;
549
+
550
+ /**
551
+ * Maximum Aurora Serverless v2 ACUs.
552
+ *
553
+ * @default 4
554
+ */
555
+ readonly serverlessV2MaxCapacity?: number;
542
556
  }
543
557
 
544
558
  /**
@@ -568,6 +582,8 @@ export abstract class AuroraDatabase extends Construct {
568
582
  enableKeyRotation = true,
569
583
  enableCloudwatchLogs = true,
570
584
  enablePerformanceInsights = true,
585
+ serverlessV2MinCapacity = 0.5,
586
+ serverlessV2MaxCapacity = 4,
571
587
  engine,
572
588
  engineVersion,
573
589
  ...clusterProps
@@ -583,6 +599,8 @@ export abstract class AuroraDatabase extends Construct {
583
599
  vpc,
584
600
  vpcSubnets,
585
601
  engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
602
+ serverlessV2MinCapacity,
603
+ serverlessV2MaxCapacity,
586
604
  writer:
587
605
  writer ??
588
606
  ClusterInstance.serverlessV2('writer', {
@@ -1562,6 +1580,10 @@ exports[`ts#rdb generator > should generate terraform modules when iac is Terraf
1562
1580
  source = "hashicorp/aws"
1563
1581
  version = "6.61.0"
1564
1582
  }
1583
+ external = {
1584
+ source = "hashicorp/external"
1585
+ version = "2.4.1"
1586
+ }
1565
1587
  null = {
1566
1588
  source = "hashicorp/null"
1567
1589
  version = "3.3.1"
@@ -1643,9 +1665,9 @@ variable "enable_credential_rotation" {
1643
1665
  }
1644
1666
 
1645
1667
  variable "enable_cloudwatch_logs" {
1646
- description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL also enables verbose statement logging."
1668
+ description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL). Neither logs statement parameter values, to avoid leaking PII into log data."
1647
1669
  type = bool
1648
- default = false
1670
+ default = true
1649
1671
  }
1650
1672
 
1651
1673
  variable "enable_performance_insights" {
@@ -1666,6 +1688,12 @@ variable "enable_backup" {
1666
1688
  default = false
1667
1689
  }
1668
1690
 
1691
+ variable "enable_key_rotation" {
1692
+ description = "Whether to enable automatic key rotation on the KMS key used to encrypt the Aurora cluster and its credentials secret."
1693
+ type = bool
1694
+ default = true
1695
+ }
1696
+
1669
1697
  variable "tags" {
1670
1698
  description = "Tags to apply to all resources."
1671
1699
  type = map(string)
@@ -1725,6 +1753,7 @@ module "aurora" {
1725
1753
  enable_performance_insights = var.enable_performance_insights
1726
1754
  performance_insights_retention_period = var.performance_insights_retention_period
1727
1755
  enable_backup = var.enable_backup
1756
+ enable_key_rotation = var.enable_key_rotation
1728
1757
  tags = var.tags
1729
1758
  }
1730
1759
 
@@ -3054,6 +3083,10 @@ exports[`ts#rdb generator > should generate terraform modules with MySQL engine
3054
3083
  source = "hashicorp/aws"
3055
3084
  version = "6.61.0"
3056
3085
  }
3086
+ external = {
3087
+ source = "hashicorp/external"
3088
+ version = "2.4.1"
3089
+ }
3057
3090
  null = {
3058
3091
  source = "hashicorp/null"
3059
3092
  version = "3.3.1"
@@ -3135,9 +3168,9 @@ variable "enable_credential_rotation" {
3135
3168
  }
3136
3169
 
3137
3170
  variable "enable_cloudwatch_logs" {
3138
- description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL also enables verbose statement logging."
3171
+ description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL). Neither logs statement parameter values, to avoid leaking PII into log data."
3139
3172
  type = bool
3140
- default = false
3173
+ default = true
3141
3174
  }
3142
3175
 
3143
3176
  variable "enable_performance_insights" {
@@ -3158,6 +3191,12 @@ variable "enable_backup" {
3158
3191
  default = false
3159
3192
  }
3160
3193
 
3194
+ variable "enable_key_rotation" {
3195
+ description = "Whether to enable automatic key rotation on the KMS key used to encrypt the Aurora cluster and its credentials secret."
3196
+ type = bool
3197
+ default = true
3198
+ }
3199
+
3161
3200
  variable "tags" {
3162
3201
  description = "Tags to apply to all resources."
3163
3202
  type = map(string)
@@ -3217,6 +3256,7 @@ module "aurora" {
3217
3256
  enable_performance_insights = var.enable_performance_insights
3218
3257
  performance_insights_retention_period = var.performance_insights_retention_period
3219
3258
  enable_backup = var.enable_backup
3259
+ enable_key_rotation = var.enable_key_rotation
3220
3260
  tags = var.tags
3221
3261
  }
3222
3262
 
@@ -4344,6 +4384,20 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
4344
4384
  * @default true
4345
4385
  */
4346
4386
  readonly enablePerformanceInsights?: boolean;
4387
+
4388
+ /**
4389
+ * Minimum Aurora Serverless v2 ACUs.
4390
+ *
4391
+ * @default 0.5
4392
+ */
4393
+ readonly serverlessV2MinCapacity?: number;
4394
+
4395
+ /**
4396
+ * Maximum Aurora Serverless v2 ACUs.
4397
+ *
4398
+ * @default 4
4399
+ */
4400
+ readonly serverlessV2MaxCapacity?: number;
4347
4401
  }
4348
4402
 
4349
4403
  /**
@@ -4373,6 +4427,8 @@ export abstract class AuroraDatabase extends Construct {
4373
4427
  enableKeyRotation = true,
4374
4428
  enableCloudwatchLogs = true,
4375
4429
  enablePerformanceInsights = true,
4430
+ serverlessV2MinCapacity = 0.5,
4431
+ serverlessV2MaxCapacity = 4,
4376
4432
  engine,
4377
4433
  engineVersion,
4378
4434
  ...clusterProps
@@ -4388,6 +4444,8 @@ export abstract class AuroraDatabase extends Construct {
4388
4444
  vpc,
4389
4445
  vpcSubnets,
4390
4446
  engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
4447
+ serverlessV2MinCapacity,
4448
+ serverlessV2MaxCapacity,
4391
4449
  writer:
4392
4450
  writer ??
4393
4451
  ClusterInstance.serverlessV2('writer', {
@@ -134,6 +134,10 @@ exports[`react-website generator > TailwindCSS integration > terraform iac > sho
134
134
  version = "6.61.0"
135
135
  configuration_aliases = [aws.us_east_1]
136
136
  }
137
+ null = {
138
+ source = "hashicorp/null"
139
+ version = "3.3.1"
140
+ }
137
141
  random = {
138
142
  source = "hashicorp/random"
139
143
  version = "3.9.0"
@@ -118,6 +118,8 @@ import {
118
118
  CfnWebACLAssociation,
119
119
  } from 'aws-cdk-lib/aws-wafv2';
120
120
  import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs';
121
+ import { Key } from 'aws-cdk-lib/aws-kms';
122
+ import { Effect, PolicyStatement, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
121
123
  import { Construct } from 'constructs';
122
124
  import { RuntimeConfig } from './runtime-config.js';
123
125
  import { Distribution } from 'aws-cdk-lib/aws-cloudfront';
@@ -354,18 +356,43 @@ export class UserIdentity extends Construct {
354
356
  webAclArn: webAcl.attrArn,
355
357
  });
356
358
 
357
- // Send WAF request logs to CloudWatch. The log group name must start with
358
- // \`aws-waf-logs-\` to satisfy the WAFv2 logging destination requirement.
359
+ // The log group name must start with \`aws-waf-logs-\` to satisfy the WAFv2
360
+ // logging destination requirement.
361
+ const stack = Stack.of(this);
362
+ const wafLogGroupName = \`aws-waf-logs-\${id}-\${this.node.addr.slice(-8)}\`;
363
+
364
+ // KMS key for encrypting WAF logs at rest, usable by CloudWatch Logs
365
+ const logsKey = new Key(this, 'WebAclLogsKey', {
366
+ enableKeyRotation: true,
367
+ });
368
+ logsKey.addToResourcePolicy(
369
+ new PolicyStatement({
370
+ effect: Effect.ALLOW,
371
+ principals: [
372
+ new ServicePrincipal(\`logs.\${stack.region}.amazonaws.com\`),
373
+ ],
374
+ actions: [
375
+ 'kms:Encrypt',
376
+ 'kms:Decrypt',
377
+ 'kms:ReEncrypt*',
378
+ 'kms:GenerateDataKey*',
379
+ 'kms:DescribeKey',
380
+ ],
381
+ resources: ['*'],
382
+ conditions: {
383
+ ArnEquals: {
384
+ 'kms:EncryptionContext:aws:logs:arn': \`arn:aws:logs:\${stack.region}:\${stack.account}:log-group:\${wafLogGroupName}\`,
385
+ },
386
+ },
387
+ }),
388
+ );
389
+
359
390
  const wafLogGroup = new LogGroup(this, 'WebAclLogs', {
360
- logGroupName: \`aws-waf-logs-\${id}-\${this.node.addr.slice(-8)}\`,
391
+ logGroupName: wafLogGroupName,
361
392
  retention: RetentionDays.ONE_MONTH,
393
+ encryptionKey: logsKey,
362
394
  removalPolicy: RemovalPolicy.DESTROY,
363
395
  });
364
- suppressRules(
365
- wafLogGroup,
366
- ['CKV_AWS_158'],
367
- 'Using default CloudWatch log encryption for WAF logs',
368
- );
369
396
 
370
397
  new CfnLoggingConfiguration(this, 'WebAclLoggingConfig', {
371
398
  resourceArn: webAcl.attrArn,
@@ -8,6 +8,10 @@ exports[`cognito-auth generator terraform iac > should generate terraform files
8
8
  source = "hashicorp/aws"
9
9
  version = "6.61.0"
10
10
  }
11
+ null = {
12
+ source = "hashicorp/null"
13
+ version = "3.3.1"
14
+ }
11
15
  }
12
16
  }
13
17