@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.
- package/migrations.json +26 -1
- package/package.json +1 -1
- package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +51 -2
- package/src/agentcore-harness/__snapshots__/generator.spec.ts.snap +4 -5
- package/src/agentcore-harness/files/project/README.md.template +4 -5
- package/src/migrations/latest/agentcore-harness-no-tools-by-default/__snapshots__/migration.spec.ts.snap +79 -0
- package/src/migrations/latest/agentcore-harness-no-tools-by-default/metadata.json +3 -0
- package/src/migrations/latest/agentcore-harness-no-tools-by-default/migration.d.ts +6 -0
- package/src/migrations/latest/agentcore-harness-no-tools-by-default/migration.js +87 -0
- package/src/migrations/latest/agentcore-harness-no-tools-by-default/migration.js.map +1 -0
- package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/__snapshots__/migration.spec.ts.snap +54 -0
- package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/metadata.json +3 -0
- package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/migration.d.ts +6 -0
- package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/migration.js +86 -0
- package/src/migrations/latest/rdb-terraform-aurora-app-module-defaults/migration.js.map +1 -0
- package/src/migrations/latest/terraform-declare-used-providers/metadata.json +3 -0
- package/src/migrations/latest/terraform-declare-used-providers/migration.d.ts +6 -0
- package/src/migrations/latest/terraform-declare-used-providers/migration.js +147 -0
- package/src/migrations/latest/terraform-declare-used-providers/migration.js.map +1 -0
- package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/__snapshots__/migration.spec.ts.snap +521 -0
- package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/metadata.json +3 -0
- package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/migration.d.ts +6 -0
- package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/migration.js +504 -0
- package/src/migrations/latest/terraform-harness-vpc-role-and-memory-grant/migration.js.map +1 -0
- package/src/migrations/latest/waf-log-group-cmk-encryption/__snapshots__/migration.spec.ts.snap +286 -0
- package/src/migrations/latest/waf-log-group-cmk-encryption/metadata.json +3 -0
- package/src/migrations/latest/waf-log-group-cmk-encryption/migration.d.ts +6 -0
- package/src/migrations/latest/waf-log-group-cmk-encryption/migration.js +238 -0
- package/src/migrations/latest/waf-log-group-cmk-encryption/migration.js.map +1 -0
- package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +12 -0
- package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +231 -24
- package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +8 -0
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +4 -0
- package/src/py/rdb/__snapshots__/generator.spec.ts.snap +31 -2
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +216 -25
- package/src/terraform/project/files/application/bootstrap/providers.tf.template +9 -0
- package/src/terraform/project/files/application/src/providers.tf.template +4 -0
- package/src/terraform/project/files/library/src/main.tf.template +9 -0
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +231 -24
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +8 -0
- package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +4 -0
- package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +8 -0
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +4 -0
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +62 -4
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +4 -0
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +35 -8
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +4 -0
- package/src/utils/agent-core-constructs/files/cdk/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.ts.template +39 -1
- package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +8 -1
- package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +57 -2
- package/src/utils/agent-core-constructs/files/terraform/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.tf.template +258 -24
- package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +4 -0
- package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +8 -0
- package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +9 -1
- package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +60 -7
- package/src/utils/dcr-proxy-constructs/files/terraform/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.tf.template +4 -0
- package/src/utils/files/terraform/src/metrics/providers.tf.template +12 -0
- package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +4 -0
- package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +33 -8
- package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +4 -0
- package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +51 -2
- package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +18 -0
- package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +15 -4
- package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +2 -2
- package/src/utils/rdb-constructs/rdb-constructs.d.ts +12 -0
- package/src/utils/rdb-constructs/rdb-constructs.js +24 -3
- package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
- 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 =
|
|
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 =
|
|
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 =
|
|
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"
|
|
@@ -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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
-
//
|
|
358
|
-
//
|
|
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:
|
|
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,
|