@aws/nx-plugin 1.0.0-rc.82 → 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 (94) hide show
  1. package/migrations.json +41 -1
  2. package/package.json +1 -1
  3. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +51 -2
  4. package/src/agentcore-gateway/generator.d.ts +7 -6
  5. package/src/agentcore-gateway/generator.js +2 -12
  6. package/src/agentcore-gateway/generator.js.map +1 -1
  7. package/src/agentcore-harness/__snapshots__/generator.spec.ts.snap +4 -5
  8. package/src/agentcore-harness/files/project/README.md.template +4 -5
  9. package/src/migrations/latest/agentcore-harness-no-tools-by-default/__snapshots__/migration.spec.ts.snap +79 -0
  10. package/src/migrations/latest/agentcore-harness-no-tools-by-default/metadata.json +3 -0
  11. package/src/migrations/latest/agentcore-harness-no-tools-by-default/migration.d.ts +6 -0
  12. package/src/migrations/latest/agentcore-harness-no-tools-by-default/migration.js +87 -0
  13. package/src/migrations/latest/agentcore-harness-no-tools-by-default/migration.js.map +1 -0
  14. package/src/migrations/latest/dynamodb-terraform-app-module-outputs/metadata.json +3 -0
  15. package/src/migrations/latest/dynamodb-terraform-app-module-outputs/migration.d.ts +6 -0
  16. package/src/migrations/latest/dynamodb-terraform-app-module-outputs/migration.js +69 -0
  17. package/src/migrations/latest/dynamodb-terraform-app-module-outputs/migration.js.map +1 -0
  18. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/__snapshots__/migration.spec.ts.snap +54 -0
  19. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/metadata.json +3 -0
  20. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/migration.d.ts +6 -0
  21. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/migration.js +86 -0
  22. package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/migration.js.map +1 -0
  23. package/src/migrations/latest/terraform-data-resource-destroy-protection/__snapshots__/migration.spec.ts.snap +75 -0
  24. package/src/migrations/latest/terraform-data-resource-destroy-protection/metadata.json +3 -0
  25. package/src/migrations/latest/terraform-data-resource-destroy-protection/migration.d.ts +6 -0
  26. package/src/migrations/latest/terraform-data-resource-destroy-protection/migration.js +78 -0
  27. package/src/migrations/latest/terraform-data-resource-destroy-protection/migration.js.map +1 -0
  28. package/src/migrations/latest/terraform-declare-used-providers/metadata.json +3 -0
  29. package/src/migrations/latest/terraform-declare-used-providers/migration.d.ts +6 -0
  30. package/src/migrations/latest/terraform-declare-used-providers/migration.js +147 -0
  31. package/src/migrations/latest/terraform-declare-used-providers/migration.js.map +1 -0
  32. package/src/migrations/latest/terraform-gateway-cedar-render-root-ejs/metadata.json +3 -0
  33. package/src/migrations/latest/terraform-gateway-cedar-render-root-ejs/migration.d.ts +6 -0
  34. package/src/migrations/latest/terraform-gateway-cedar-render-root-ejs/migration.js +38 -0
  35. package/src/migrations/latest/terraform-gateway-cedar-render-root-ejs/migration.js.map +1 -0
  36. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/__snapshots__/migration.spec.ts.snap +521 -0
  37. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/metadata.json +3 -0
  38. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/migration.d.ts +6 -0
  39. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/migration.js +504 -0
  40. package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/migration.js.map +1 -0
  41. package/src/migrations/latest/waf-log-group-cmk-encryption/__snapshots__/migration.spec.ts.snap +286 -0
  42. package/src/migrations/latest/waf-log-group-cmk-encryption/metadata.json +3 -0
  43. package/src/migrations/latest/waf-log-group-cmk-encryption/migration.d.ts +6 -0
  44. package/src/migrations/latest/waf-log-group-cmk-encryption/migration.js +238 -0
  45. package/src/migrations/latest/waf-log-group-cmk-encryption/migration.js.map +1 -0
  46. package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +12 -0
  47. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +21 -0
  48. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +231 -24
  49. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +8 -0
  50. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +4 -0
  51. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +31 -2
  52. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +216 -25
  53. package/src/terraform/project/files/application/bootstrap/providers.tf.template +9 -0
  54. package/src/terraform/project/files/application/src/providers.tf.template +4 -0
  55. package/src/terraform/project/files/library/src/main.tf.template +9 -0
  56. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +231 -24
  57. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +8 -0
  58. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +4 -0
  59. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +21 -0
  60. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +8 -0
  61. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +4 -0
  62. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +74 -4
  63. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +4 -0
  64. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +35 -8
  65. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +4 -0
  66. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +9 -2
  67. package/src/utils/agent-core-constructs/agent-core-constructs.js +22 -8
  68. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  69. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.ts.template +39 -1
  70. package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +8 -1
  71. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +57 -2
  72. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.tf.template +258 -24
  73. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +4 -0
  74. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +8 -0
  75. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +9 -1
  76. package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +60 -7
  77. package/src/utils/dcr-proxy-constructs/files/terraform/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.tf.template +4 -0
  78. package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +15 -0
  79. package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +6 -0
  80. package/src/utils/files/terraform/src/metrics/providers.tf.template +12 -0
  81. package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +4 -0
  82. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +33 -8
  83. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +4 -0
  84. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +51 -2
  85. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +18 -0
  86. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +15 -4
  87. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +8 -2
  88. package/src/utils/rdb-constructs/rdb-constructs.d.ts +12 -0
  89. package/src/utils/rdb-constructs/rdb-constructs.js +24 -3
  90. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  91. package/src/utils/shared-constructs-constants.d.ts +5 -0
  92. package/src/utils/shared-constructs-constants.js +4 -0
  93. package/src/utils/shared-constructs-constants.js.map +1 -1
  94. 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
 
@@ -126,6 +126,8 @@ resource "aws_kms_key" "table" {
126
126
  description = "KMS key for DynamoDB table \${var.name}"
127
127
  enable_key_rotation = var.enable_key_rotation
128
128
 
129
+ deletion_window_in_days = 30
130
+
129
131
  policy = jsonencode({
130
132
  Version = "2012-10-17"
131
133
  Statement = [
@@ -202,6 +204,10 @@ resource "aws_dynamodb_table" "table" {
202
204
  enabled = var.encryption != "DEFAULT"
203
205
  kms_key_arn = local.table_kms_key_arn
204
206
  }
207
+
208
+ lifecycle {
209
+ prevent_destroy = true
210
+ }
205
211
  }
206
212
 
207
213
  output "table_name" {
@@ -320,6 +326,21 @@ module "add_to_runtime_config" {
320
326
  tableName = module.dynamodb_table.table_name
321
327
  }
322
328
  }
329
+
330
+ output "table_name" {
331
+ description = "Name of the DynamoDB table"
332
+ value = module.dynamodb_table.table_name
333
+ }
334
+
335
+ output "table_arn" {
336
+ description = "ARN of the DynamoDB table, for use in IAM policies granting access to the table. Suffix with /index/* to cover its global secondary indexes."
337
+ value = module.dynamodb_table.table_arn
338
+ }
339
+
340
+ output "kms_key_arn" {
341
+ description = "ARN of the KMS key used to encrypt the DynamoDB table, for use in IAM policies granting access to the table. Null when using the AWS owned key (encryption = DEFAULT)."
342
+ value = module.dynamodb_table.kms_key_arn
343
+ }
323
344
  "
324
345
  `;
325
346
 
@@ -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', {
@@ -1008,6 +1026,8 @@ resource "aws_kms_key" "database" {
1008
1026
  description = "KMS key for Aurora cluster \${var.name}"
1009
1027
  enable_key_rotation = var.enable_key_rotation
1010
1028
 
1029
+ deletion_window_in_days = 30
1030
+
1011
1031
  policy = jsonencode({
1012
1032
  Version = "2012-10-17"
1013
1033
  Statement = [
@@ -1150,6 +1170,10 @@ resource "aws_rds_cluster" "database" {
1150
1170
  tags = merge(var.tags, {
1151
1171
  Name = "\${var.name}-aurora"
1152
1172
  })
1173
+
1174
+ lifecycle {
1175
+ prevent_destroy = true
1176
+ }
1153
1177
  }
1154
1178
 
1155
1179
  resource "aws_rds_cluster_instance" "database" {
@@ -1556,6 +1580,10 @@ exports[`ts#rdb generator > should generate terraform modules when iac is Terraf
1556
1580
  source = "hashicorp/aws"
1557
1581
  version = "6.61.0"
1558
1582
  }
1583
+ external = {
1584
+ source = "hashicorp/external"
1585
+ version = "2.4.1"
1586
+ }
1559
1587
  null = {
1560
1588
  source = "hashicorp/null"
1561
1589
  version = "3.3.1"
@@ -1637,9 +1665,9 @@ variable "enable_credential_rotation" {
1637
1665
  }
1638
1666
 
1639
1667
  variable "enable_cloudwatch_logs" {
1640
- 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."
1641
1669
  type = bool
1642
- default = false
1670
+ default = true
1643
1671
  }
1644
1672
 
1645
1673
  variable "enable_performance_insights" {
@@ -1660,6 +1688,12 @@ variable "enable_backup" {
1660
1688
  default = false
1661
1689
  }
1662
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
+
1663
1697
  variable "tags" {
1664
1698
  description = "Tags to apply to all resources."
1665
1699
  type = map(string)
@@ -1719,6 +1753,7 @@ module "aurora" {
1719
1753
  enable_performance_insights = var.enable_performance_insights
1720
1754
  performance_insights_retention_period = var.performance_insights_retention_period
1721
1755
  enable_backup = var.enable_backup
1756
+ enable_key_rotation = var.enable_key_rotation
1722
1757
  tags = var.tags
1723
1758
  }
1724
1759
 
@@ -2494,6 +2529,8 @@ resource "aws_kms_key" "database" {
2494
2529
  description = "KMS key for Aurora cluster \${var.name}"
2495
2530
  enable_key_rotation = var.enable_key_rotation
2496
2531
 
2532
+ deletion_window_in_days = 30
2533
+
2497
2534
  policy = jsonencode({
2498
2535
  Version = "2012-10-17"
2499
2536
  Statement = [
@@ -2636,6 +2673,10 @@ resource "aws_rds_cluster" "database" {
2636
2673
  tags = merge(var.tags, {
2637
2674
  Name = "\${var.name}-aurora"
2638
2675
  })
2676
+
2677
+ lifecycle {
2678
+ prevent_destroy = true
2679
+ }
2639
2680
  }
2640
2681
 
2641
2682
  resource "aws_rds_cluster_instance" "database" {
@@ -3042,6 +3083,10 @@ exports[`ts#rdb generator > should generate terraform modules with MySQL engine
3042
3083
  source = "hashicorp/aws"
3043
3084
  version = "6.61.0"
3044
3085
  }
3086
+ external = {
3087
+ source = "hashicorp/external"
3088
+ version = "2.4.1"
3089
+ }
3045
3090
  null = {
3046
3091
  source = "hashicorp/null"
3047
3092
  version = "3.3.1"
@@ -3123,9 +3168,9 @@ variable "enable_credential_rotation" {
3123
3168
  }
3124
3169
 
3125
3170
  variable "enable_cloudwatch_logs" {
3126
- 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."
3127
3172
  type = bool
3128
- default = false
3173
+ default = true
3129
3174
  }
3130
3175
 
3131
3176
  variable "enable_performance_insights" {
@@ -3146,6 +3191,12 @@ variable "enable_backup" {
3146
3191
  default = false
3147
3192
  }
3148
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
+
3149
3200
  variable "tags" {
3150
3201
  description = "Tags to apply to all resources."
3151
3202
  type = map(string)
@@ -3205,6 +3256,7 @@ module "aurora" {
3205
3256
  enable_performance_insights = var.enable_performance_insights
3206
3257
  performance_insights_retention_period = var.performance_insights_retention_period
3207
3258
  enable_backup = var.enable_backup
3259
+ enable_key_rotation = var.enable_key_rotation
3208
3260
  tags = var.tags
3209
3261
  }
3210
3262
 
@@ -4332,6 +4384,20 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
4332
4384
  * @default true
4333
4385
  */
4334
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;
4335
4401
  }
4336
4402
 
4337
4403
  /**
@@ -4361,6 +4427,8 @@ export abstract class AuroraDatabase extends Construct {
4361
4427
  enableKeyRotation = true,
4362
4428
  enableCloudwatchLogs = true,
4363
4429
  enablePerformanceInsights = true,
4430
+ serverlessV2MinCapacity = 0.5,
4431
+ serverlessV2MaxCapacity = 4,
4364
4432
  engine,
4365
4433
  engineVersion,
4366
4434
  ...clusterProps
@@ -4376,6 +4444,8 @@ export abstract class AuroraDatabase extends Construct {
4376
4444
  vpc,
4377
4445
  vpcSubnets,
4378
4446
  engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
4447
+ serverlessV2MinCapacity,
4448
+ serverlessV2MaxCapacity,
4379
4449
  writer:
4380
4450
  writer ??
4381
4451
  ClusterInstance.serverlessV2('writer', {