@aws/nx-plugin 1.0.0-rc.83 → 1.0.0-rc.85
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/generators.json +7 -0
- package/migrations.json +31 -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/internal/test-matrix/generator.js +16 -0
- package/src/internal/test-matrix/generator.js.map +1 -1
- 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/terraform-project-checkov-target-and-bootstrap-destroy/metadata.json +3 -0
- package/src/migrations/latest/terraform-project-checkov-target-and-bootstrap-destroy/migration.d.ts +6 -0
- package/src/migrations/latest/terraform-project-checkov-target-and-bootstrap-destroy/migration.js +146 -0
- package/src/migrations/latest/terraform-project-checkov-target-and-bootstrap-destroy/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/open-api/json-metadata/generator.d.ts +24 -0
- package/src/open-api/json-metadata/generator.js +37 -0
- package/src/open-api/json-metadata/generator.js.map +1 -0
- package/src/open-api/json-metadata/schema.d.js +6 -0
- package/src/open-api/json-metadata/schema.d.js.map +1 -0
- package/src/open-api/json-metadata/schema.d.ts +9 -0
- package/src/open-api/json-metadata/schema.json +20 -0
- package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +12 -0
- package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +1875 -623
- package/src/py/fast-api/generator.js +2 -1
- package/src/py/fast-api/generator.js.map +1 -1
- 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/sdk/open-api.d.ts +2 -0
- package/src/sdk/open-api.js +2 -1
- package/src/sdk/open-api.js.map +1 -1
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +1756 -457
- package/src/smithy/ts/api/generator.js +2 -1
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/terraform/project/files/application/bootstrap/providers.tf.template +11 -0
- package/src/terraform/project/files/application/scripts/bootstrap-destroy.ts.template +111 -0
- package/src/terraform/project/files/application/src/providers.tf.template +6 -0
- package/src/terraform/project/files/checkov/checkov.yml.template +8 -0
- package/src/terraform/project/files/library/src/main.tf.template +9 -0
- package/src/terraform/project/generator.js +47 -4
- package/src/terraform/project/generator.js.map +1 -1
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +1848 -614
- package/src/trpc/backend/files-operations/scripts/generate-operations.ts.template +40 -0
- package/src/trpc/backend/generator.js +10 -0
- package/src/trpc/backend/generator.js.map +1 -1
- 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/api-constructs.js +11 -0
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +251 -3
- package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +437 -2
- package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +60 -7
- package/src/utils/api-constructs/open-api-metadata.d.ts +20 -3
- package/src/utils/api-constructs/open-api-metadata.js +64 -8
- package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
- package/src/utils/api-constructs/trpc-operations-metadata.d.ts +21 -0
- package/src/utils/api-constructs/trpc-operations-metadata.js +55 -0
- package/src/utils/api-constructs/trpc-operations-metadata.js.map +1 -0
- 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
|
@@ -19,6 +19,84 @@ variable "model_id" {
|
|
|
19
19
|
default = "global.anthropic.claude-sonnet-4-6"
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
variable "allowed_tools" {
|
|
23
|
+
description = "Tools the Harness may use. Defaults to none; set [\"@builtin\"] for every built-in tool, or name individual tools. Always sent explicitly, since the service treats an absent value as every tool."
|
|
24
|
+
type = list(string)
|
|
25
|
+
default = []
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
variable "memory" {
|
|
29
|
+
description = "Memory configuration for the Harness. Null leaves the service to provision managed memory with default strategies. Set exactly one field: managed_memory_configuration to tune that managed memory, agentcore_memory_configuration to use a memory resource you own, or disabled to turn memory off."
|
|
30
|
+
type = object({
|
|
31
|
+
managed_memory_configuration = optional(object({
|
|
32
|
+
strategies = optional(set(string))
|
|
33
|
+
event_expiry_duration = optional(number)
|
|
34
|
+
encryption_key_arn = optional(string)
|
|
35
|
+
}))
|
|
36
|
+
agentcore_memory_configuration = optional(object({
|
|
37
|
+
arn = string
|
|
38
|
+
actor_id = optional(string)
|
|
39
|
+
messages_count = optional(number)
|
|
40
|
+
}))
|
|
41
|
+
disabled = optional(bool, false)
|
|
42
|
+
})
|
|
43
|
+
default = null
|
|
44
|
+
|
|
45
|
+
validation {
|
|
46
|
+
condition = var.memory == null || length([
|
|
47
|
+
for configured in [
|
|
48
|
+
var.memory.managed_memory_configuration != null,
|
|
49
|
+
var.memory.agentcore_memory_configuration != null,
|
|
50
|
+
var.memory.disabled,
|
|
51
|
+
] : configured if configured
|
|
52
|
+
]) == 1
|
|
53
|
+
error_message = "Set exactly one of memory.managed_memory_configuration, memory.agentcore_memory_configuration or memory.disabled."
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
variable "environment_variables" {
|
|
58
|
+
description = "Environment variables available to the Harness."
|
|
59
|
+
type = map(string)
|
|
60
|
+
default = null
|
|
61
|
+
sensitive = true
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
variable "max_iterations" {
|
|
65
|
+
description = "Maximum agent loop iterations per invocation. Uses the service default when null."
|
|
66
|
+
type = number
|
|
67
|
+
default = null
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
variable "timeout_seconds" {
|
|
71
|
+
description = "Maximum seconds an invocation may run. Uses the service default when null."
|
|
72
|
+
type = number
|
|
73
|
+
default = null
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
variable "create_execution_role" {
|
|
77
|
+
description = "Create the execution role with the baseline permissions below. Set false alongside execution_role_arn to use a role you already have, which is then used as-is."
|
|
78
|
+
type = bool
|
|
79
|
+
default = true
|
|
80
|
+
|
|
81
|
+
validation {
|
|
82
|
+
condition = var.create_execution_role || var.execution_role_arn != null
|
|
83
|
+
error_message = "execution_role_arn must be set when create_execution_role is false."
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
validation {
|
|
87
|
+
condition = var.create_execution_role || (
|
|
88
|
+
var.model_resource_arns == null && length(var.additional_execution_role_policy_statements) == 0
|
|
89
|
+
)
|
|
90
|
+
error_message = "model_resource_arns and additional_execution_role_policy_statements configure the generated execution role, which is not created when create_execution_role is false. Grant those permissions on the supplied role instead."
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
variable "execution_role_arn" {
|
|
95
|
+
description = "ARN of an existing IAM role for the Harness to assume. Requires create_execution_role = false."
|
|
96
|
+
type = string
|
|
97
|
+
default = null
|
|
98
|
+
}
|
|
99
|
+
|
|
22
100
|
variable "model_resource_arns" {
|
|
23
101
|
description = "Bedrock model and inference-profile ARNs the execution role may invoke. Defaults to every foundation model plus this account's Bedrock resources in the deployment region; replace with narrower ARNs to restrict baseline model access."
|
|
24
102
|
type = set(string)
|
|
@@ -37,6 +115,36 @@ variable "additional_execution_role_policy_statements" {
|
|
|
37
115
|
default = []
|
|
38
116
|
}
|
|
39
117
|
|
|
118
|
+
# VPC Configuration (optional)
|
|
119
|
+
variable "enable_vpc" {
|
|
120
|
+
description = "Run the Harness inside a VPC so it can reach private resources. Set alongside vpc_id/subnet_ids."
|
|
121
|
+
type = bool
|
|
122
|
+
default = false
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
variable "vpc_id" {
|
|
126
|
+
description = "VPC ID to run the Harness in. Required when enable_vpc is true."
|
|
127
|
+
type = string
|
|
128
|
+
default = null
|
|
129
|
+
|
|
130
|
+
validation {
|
|
131
|
+
condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
|
|
132
|
+
error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
variable "subnet_ids" {
|
|
137
|
+
description = "Subnet IDs to run the Harness in. Required when enable_vpc is true."
|
|
138
|
+
type = list(string)
|
|
139
|
+
default = null
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
variable "tags" {
|
|
143
|
+
description = "Tags to apply to resources"
|
|
144
|
+
type = map(string)
|
|
145
|
+
default = {}
|
|
146
|
+
}
|
|
147
|
+
|
|
40
148
|
data "aws_caller_identity" "current" {}
|
|
41
149
|
data "aws_partition" "current" {}
|
|
42
150
|
data "aws_region" "current" {}
|
|
@@ -60,9 +168,17 @@ locals {
|
|
|
60
168
|
"arn:${local.partition}:bedrock:*::foundation-model/*",
|
|
61
169
|
"arn:${local.partition}:bedrock:${local.region}:${local.account_id}:*",
|
|
62
170
|
]
|
|
171
|
+
|
|
172
|
+
execution_role_arn = var.create_execution_role ? aws_iam_role.execution_role[0].arn : var.execution_role_arn
|
|
173
|
+
|
|
174
|
+
# The service provisions managed memory unless var.memory redirects it
|
|
175
|
+
# elsewhere or turns it off.
|
|
176
|
+
has_managed_memory = var.memory == null || var.memory.managed_memory_configuration != null
|
|
63
177
|
}
|
|
64
178
|
|
|
65
179
|
resource "aws_iam_role" "execution_role" {
|
|
180
|
+
count = var.create_execution_role ? 1 : 0
|
|
181
|
+
|
|
66
182
|
name = "${local.harness_name_prefix}-HarnessRole-${random_id.unique_suffix.hex}"
|
|
67
183
|
|
|
68
184
|
assume_role_policy = jsonencode({
|
|
@@ -83,14 +199,18 @@ resource "aws_iam_role" "execution_role" {
|
|
|
83
199
|
}
|
|
84
200
|
}]
|
|
85
201
|
})
|
|
202
|
+
|
|
203
|
+
tags = var.tags
|
|
86
204
|
}
|
|
87
205
|
|
|
88
206
|
# Baseline permissions per the AgentCore Harness security guidance; extend for
|
|
89
207
|
# customer-owned resources via var.additional_execution_role_policy_statements.
|
|
90
208
|
# https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/harness-security.html
|
|
91
209
|
resource "aws_iam_role_policy" "execution_role" {
|
|
210
|
+
count = var.create_execution_role ? 1 : 0
|
|
211
|
+
|
|
92
212
|
name = "${local.harness_name_prefix}-HarnessPolicy"
|
|
93
|
-
role = aws_iam_role.execution_role.id
|
|
213
|
+
role = aws_iam_role.execution_role[0].id
|
|
94
214
|
|
|
95
215
|
policy = jsonencode({
|
|
96
216
|
Version = "2012-10-17"
|
|
@@ -184,22 +304,6 @@ resource "aws_iam_role_policy" "execution_role" {
|
|
|
184
304
|
"arn:${local.partition}:bedrock-agentcore:${local.region}:${local.account_id}:workload-identity-directory/default/workload-identity/harness_${local.harness_name}-*",
|
|
185
305
|
]
|
|
186
306
|
},
|
|
187
|
-
# The service names the managed memory from the harness name plus a
|
|
188
|
-
# generated suffix, so this scopes to that prefix.
|
|
189
|
-
{
|
|
190
|
-
Sid = "AgentCoreManagedMemory"
|
|
191
|
-
Effect = "Allow"
|
|
192
|
-
Action = [
|
|
193
|
-
"bedrock-agentcore:CreateEvent",
|
|
194
|
-
"bedrock-agentcore:DeleteEvent",
|
|
195
|
-
"bedrock-agentcore:GetEvent",
|
|
196
|
-
"bedrock-agentcore:ListEvents",
|
|
197
|
-
"bedrock-agentcore:RetrieveMemoryRecords",
|
|
198
|
-
]
|
|
199
|
-
Resource = [
|
|
200
|
-
"arn:${local.partition}:bedrock-agentcore:${local.region}:${local.account_id}:memory/${local.harness_name}-*",
|
|
201
|
-
]
|
|
202
|
-
},
|
|
203
307
|
{
|
|
204
308
|
Sid = "AgentCoreBrowserDefault"
|
|
205
309
|
Effect = "Allow"
|
|
@@ -230,19 +334,70 @@ resource "aws_iam_role_policy" "execution_role" {
|
|
|
230
334
|
"arn:${local.partition}:bedrock-agentcore:${local.region}:aws:code-interpreter/*",
|
|
231
335
|
]
|
|
232
336
|
},
|
|
233
|
-
],
|
|
234
|
-
#
|
|
235
|
-
|
|
236
|
-
|
|
337
|
+
],
|
|
338
|
+
# In VPC mode the Harness pulls its managed container from a private ECR
|
|
339
|
+
# repository in the region rather than ECR Public, so it needs pull
|
|
340
|
+
# permissions on it. The repository is service-owned, hence the wildcard
|
|
341
|
+
# account.
|
|
342
|
+
var.enable_vpc ? [
|
|
343
|
+
{
|
|
344
|
+
Sid = "EcrManagedImagePull"
|
|
345
|
+
Effect = "Allow"
|
|
346
|
+
Action = [
|
|
347
|
+
"ecr:BatchGetImage",
|
|
348
|
+
"ecr:GetDownloadUrlForLayer",
|
|
349
|
+
"ecr:BatchCheckLayerAvailability",
|
|
350
|
+
]
|
|
351
|
+
Resource = ["arn:${local.partition}:ecr:${local.region}:*:repository/harness-*"]
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
#checkov:skip=CKV_AWS_355:EcrManagedImageToken requires a wildcard resource; ecr:GetAuthorizationToken has no resource-level permission
|
|
355
|
+
Sid = "EcrManagedImageToken"
|
|
356
|
+
Effect = "Allow"
|
|
357
|
+
Action = ["ecr:GetAuthorizationToken"]
|
|
358
|
+
Resource = ["*"]
|
|
359
|
+
},
|
|
360
|
+
] : [],
|
|
361
|
+
[
|
|
362
|
+
# Null Sid/Condition fields are dropped from the rendered policy.
|
|
363
|
+
for statement in var.additional_execution_role_policy_statements :
|
|
364
|
+
{ for key, value in statement : key => value if value != null }
|
|
237
365
|
])
|
|
238
366
|
})
|
|
239
367
|
}
|
|
240
368
|
|
|
369
|
+
# Security group for the Harness, used when running inside a VPC
|
|
370
|
+
resource "aws_security_group" "harness" {
|
|
371
|
+
count = var.enable_vpc ? 1 : 0
|
|
372
|
+
|
|
373
|
+
#checkov:skip=CKV2_AWS_5:Attached to the Harness via its network configuration; Checkov cannot resolve this reference
|
|
374
|
+
name_prefix = "${local.harness_name_prefix}-harness-"
|
|
375
|
+
description = "Security group for the ${local.harness_name_prefix} Harness"
|
|
376
|
+
vpc_id = var.vpc_id
|
|
377
|
+
tags = var.tags
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
resource "aws_vpc_security_group_egress_rule" "harness_https" {
|
|
381
|
+
count = var.enable_vpc ? 1 : 0
|
|
382
|
+
|
|
383
|
+
security_group_id = aws_security_group.harness[0].id
|
|
384
|
+
cidr_ipv4 = "0.0.0.0/0"
|
|
385
|
+
from_port = 443
|
|
386
|
+
to_port = 443
|
|
387
|
+
ip_protocol = "tcp"
|
|
388
|
+
description = "Allow outbound HTTPS to AWS service endpoints"
|
|
389
|
+
}
|
|
390
|
+
|
|
241
391
|
# Omitting authorizer_configuration uses IAM inbound authorization; add a
|
|
242
392
|
# custom_jwt_authorizer block to change that.
|
|
243
393
|
resource "aws_bedrockagentcore_harness" "this" {
|
|
244
394
|
harness_name = local.harness_name
|
|
245
|
-
execution_role_arn =
|
|
395
|
+
execution_role_arn = local.execution_role_arn
|
|
396
|
+
|
|
397
|
+
allowed_tools = var.allowed_tools
|
|
398
|
+
environment_variables = var.environment_variables
|
|
399
|
+
max_iterations = var.max_iterations
|
|
400
|
+
timeout_seconds = var.timeout_seconds
|
|
246
401
|
|
|
247
402
|
model {
|
|
248
403
|
bedrock_model_config {
|
|
@@ -255,9 +410,83 @@ resource "aws_bedrockagentcore_harness" "this" {
|
|
|
255
410
|
text = file("${path.module}/../../../../../../../<%- promptPathFromTerraform %>")
|
|
256
411
|
}
|
|
257
412
|
|
|
413
|
+
dynamic "memory" {
|
|
414
|
+
for_each = var.memory != null ? [var.memory] : []
|
|
415
|
+
content {
|
|
416
|
+
dynamic "managed_memory_configuration" {
|
|
417
|
+
for_each = memory.value.managed_memory_configuration != null ? [memory.value.managed_memory_configuration] : []
|
|
418
|
+
content {
|
|
419
|
+
strategies = managed_memory_configuration.value.strategies
|
|
420
|
+
event_expiry_duration = managed_memory_configuration.value.event_expiry_duration
|
|
421
|
+
encryption_key_arn = managed_memory_configuration.value.encryption_key_arn
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
dynamic "agentcore_memory_configuration" {
|
|
426
|
+
for_each = memory.value.agentcore_memory_configuration != null ? [memory.value.agentcore_memory_configuration] : []
|
|
427
|
+
content {
|
|
428
|
+
arn = agentcore_memory_configuration.value.arn
|
|
429
|
+
actor_id = agentcore_memory_configuration.value.actor_id
|
|
430
|
+
messages_count = agentcore_memory_configuration.value.messages_count
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
dynamic "disabled" {
|
|
435
|
+
for_each = memory.value.disabled ? [1] : []
|
|
436
|
+
content {}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
dynamic "environment" {
|
|
442
|
+
for_each = var.enable_vpc ? [1] : []
|
|
443
|
+
content {
|
|
444
|
+
agentcore_runtime_environment {
|
|
445
|
+
network_configuration {
|
|
446
|
+
network_mode = "VPC"
|
|
447
|
+
network_mode_config {
|
|
448
|
+
security_groups = [aws_security_group.harness[0].id]
|
|
449
|
+
subnets = var.subnet_ids
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
tags = var.tags
|
|
457
|
+
|
|
258
458
|
depends_on = [aws_iam_role_policy.execution_role]
|
|
259
459
|
}
|
|
260
460
|
|
|
461
|
+
# Scoped to the memory ARN the service assigns, which is only readable after the
|
|
462
|
+
# Harness exists, so this is a policy of its own rather than a baseline
|
|
463
|
+
# statement. Skipped when the Harness uses a role or memory the module did not
|
|
464
|
+
# create.
|
|
465
|
+
resource "aws_iam_role_policy" "managed_memory" {
|
|
466
|
+
count = var.create_execution_role && local.has_managed_memory ? 1 : 0
|
|
467
|
+
|
|
468
|
+
name = "${local.harness_name_prefix}-HarnessManagedMemoryPolicy"
|
|
469
|
+
role = aws_iam_role.execution_role[0].id
|
|
470
|
+
|
|
471
|
+
policy = jsonencode({
|
|
472
|
+
Version = "2012-10-17"
|
|
473
|
+
Statement = [{
|
|
474
|
+
Sid = "AgentCoreManagedMemory"
|
|
475
|
+
Effect = "Allow"
|
|
476
|
+
Action = [
|
|
477
|
+
"bedrock-agentcore:CreateEvent",
|
|
478
|
+
"bedrock-agentcore:DeleteEvent",
|
|
479
|
+
"bedrock-agentcore:GetEvent",
|
|
480
|
+
"bedrock-agentcore:ListEvents",
|
|
481
|
+
"bedrock-agentcore:RetrieveMemoryRecords",
|
|
482
|
+
]
|
|
483
|
+
Resource = [
|
|
484
|
+
aws_bedrockagentcore_harness.this.memory_actual[0].managed_memory_configuration[0].arn,
|
|
485
|
+
]
|
|
486
|
+
}]
|
|
487
|
+
})
|
|
488
|
+
}
|
|
489
|
+
|
|
261
490
|
module "add_harness_arn_to_runtime_config" {
|
|
262
491
|
source = "../../../core/runtime-config/entry"
|
|
263
492
|
|
|
@@ -277,6 +506,11 @@ output "harness_arn" {
|
|
|
277
506
|
}
|
|
278
507
|
|
|
279
508
|
output "execution_role_arn" {
|
|
280
|
-
description = "ARN of the IAM role assumed by the Harness"
|
|
281
|
-
value =
|
|
509
|
+
description = "ARN of the IAM role assumed by the Harness, whether generated or supplied via var.execution_role_arn"
|
|
510
|
+
value = local.execution_role_arn
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
output "security_group_id" {
|
|
514
|
+
description = "Security group ID of the Harness, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
|
|
515
|
+
value = var.enable_vpc ? aws_security_group.harness[0].id : null
|
|
282
516
|
}
|
|
@@ -6,6 +6,10 @@ terraform {
|
|
|
6
6
|
source = "hashicorp/aws"
|
|
7
7
|
version = "<%- awsProviderVersion %>"
|
|
8
8
|
}
|
|
9
|
+
external = {
|
|
10
|
+
source = "hashicorp/external"
|
|
11
|
+
version = "<%- externalProviderVersion %>"
|
|
12
|
+
}
|
|
9
13
|
null = {
|
|
10
14
|
source = "hashicorp/null"
|
|
11
15
|
version = "<%- nullProviderVersion %>"
|
|
@@ -39,6 +39,16 @@ import { PY_VERSIONS, terraformProviderVersions, withVersions } from "../version
|
|
|
39
39
|
when: generatedTerraform
|
|
40
40
|
}
|
|
41
41
|
];
|
|
42
|
+
/**
|
|
43
|
+
* Path segments a REST API operation may have in the generated Terraform.
|
|
44
|
+
*
|
|
45
|
+
* API Gateway REST APIs need a resource per path segment, and instances of a
|
|
46
|
+
* Terraform resource cannot reference one another
|
|
47
|
+
* (https://github.com/hashicorp/terraform/issues/26697), so the module declares
|
|
48
|
+
* one resource per level up to this depth. Deeper paths fail the plan with a
|
|
49
|
+
* message pointing at the fix. Empty levels create no resources, so the only
|
|
50
|
+
* cost of the headroom is the generated configuration itself.
|
|
51
|
+
*/ const MAX_REST_PATH_DEPTH = 16;
|
|
42
52
|
export const addApiGatewayInfra = async (tree, options, declaration)=>{
|
|
43
53
|
if (options.iac === 'cdk') {
|
|
44
54
|
await addApiGatewayCdkConstructs(tree, options, declaration);
|
|
@@ -105,6 +115,7 @@ export const addApiGatewayInfra = async (tree, options, declaration)=>{
|
|
|
105
115
|
// Generate app specific terraform module
|
|
106
116
|
generateFiles(tree, joinPathFragments(import.meta.dirname, 'files', 'terraform', 'app', 'apis', options.constructType), joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'app', 'apis'), {
|
|
107
117
|
...options,
|
|
118
|
+
maxRestPathDepth: MAX_REST_PATH_DEPTH,
|
|
108
119
|
...terraformProviderVersions()
|
|
109
120
|
}, {
|
|
110
121
|
overwriteStrategy: OverwriteStrategy.KeepExisting
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/utils/api-constructs/api-constructs.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addStarExport } from '../ast.js';\nimport {\n type DeclaredPyDependency,\n type DeclaredTsDependency,\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../dependencies.js';\nimport type { Iac } from '../iac.js';\nimport { esmVars } from '../module-format.js';\nimport { addDependencyToTargetIfNotPresent } from '../nx.js';\nimport {\n generatedInfrastructure,\n generatedTerraform,\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n SHARED_TERRAFORM_DIR,\n} from '../shared-constructs-constants.js';\nimport {\n type IPyDepVersion,\n type ITsDepVersion,\n PY_VERSIONS,\n terraformProviderVersions,\n withVersions,\n} from '../versions.js';\n\n/**\n * Dependencies a caller must declare to add API Gateway infrastructure.\n *\n * Gated on infrastructure having been generated: `addApiGatewayInfra` only runs\n * on that branch, so a project generated with `infra: 'none'` never receives\n * these.\n */\nexport const API_CONSTRUCTS_DEPENDENCIES = [\n { name: '@aws-sdk/client-api-gateway', when: generatedInfrastructure },\n { name: '@aws-sdk/client-iam', when: generatedInfrastructure },\n { name: '@trpc/server', when: generatedInfrastructure },\n] as const satisfies readonly DeclaredTsDependency<\n ITsDepVersion,\n IacMetadata\n>[];\n\n/**\n * Python version the generated Terraform pins in the account module's inline\n * `uv run --with` script. Nothing installs it, so it is declared for its version\n * alone, and only on the Terraform branch that writes the script.\n */\nexport const API_CONSTRUCTS_PY_DEPENDENCIES = [\n { name: 'boto3', when: generatedTerraform },\n] as const satisfies readonly DeclaredPyDependency<\n IPyDepVersion,\n IacMetadata\n>[];\n\ninterface BackendOptions {\n type: 'trpc' | 'fastapi' | 'smithy';\n integrationPattern: 'isolated' | 'shared';\n}\n\nexport interface TrpcBackendOptions extends BackendOptions {\n type: 'trpc';\n projectAlias: string;\n bundleOutputDir: string;\n authorizerBundleOutputDir?: string;\n}\n\nexport interface FastApiBackendOptions extends BackendOptions {\n type: 'fastapi';\n moduleName: string;\n bundleOutputDir: string;\n}\n\nexport interface SmithyBackendOptions extends BackendOptions {\n type: 'smithy';\n bundleOutputDir: string;\n authorizerBundleOutputDir?: string;\n}\n\nexport interface AddApiGatewayConstructOptions {\n apiProjectName: string;\n apiNameClassName: string;\n apiNameKebabCase: string;\n constructType: 'http' | 'rest';\n backend: TrpcBackendOptions | FastApiBackendOptions | SmithyBackendOptions;\n auth: 'iam' | 'cognito' | 'custom';\n}\n\nexport const addApiGatewayInfra = async <const D extends DependencyDeclaration>(\n tree: Tree,\n options: AddApiGatewayConstructOptions & { iac: Iac },\n declaration: D & MustDeclare<typeof API_CONSTRUCTS_DEPENDENCIES, D>,\n) => {\n if (options.iac === 'cdk') {\n await addApiGatewayCdkConstructs(tree, options, declaration);\n } else if (options.iac === 'terraform') {\n addApiGatewayTerraformModules(tree, options);\n } else {\n throw new Error(`Unsupported iac ${options.iac}`);\n }\n\n updateJson(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n options.iac === 'cdk' ? SHARED_CONSTRUCTS_DIR : SHARED_TERRAFORM_DIR,\n 'project.json',\n ),\n (config: ProjectConfiguration) => {\n addDependencyToTargetIfNotPresent(\n config,\n 'build',\n `${options.apiProjectName}:build`,\n );\n return config;\n },\n );\n};\n\n/**\n * Add an API CDK construct, and update the Runtime Config type to export its url\n */\nconst addApiGatewayCdkConstructs = async (\n tree: Tree,\n options: AddApiGatewayConstructOptions,\n declaration: DependencyDeclaration,\n) => {\n const generateCoreApiFile = (name: string) => {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'core',\n 'api',\n name,\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'core',\n 'api',\n ),\n { ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n };\n\n // Generate relevant core CDK construct and utilities\n generateCoreApiFile(options.constructType);\n generateCoreApiFile('utils');\n if (options.backend.type === 'trpc') {\n generateCoreApiFile('trpc');\n }\n\n // Declare the deps the generated core construct files import.\n const constructDeps: (typeof API_CONSTRUCTS_DEPENDENCIES)[number]['name'][] =\n [];\n if (options.constructType === 'rest') {\n // REST account construct configures the account via the AWS SDK.\n constructDeps.push('@aws-sdk/client-api-gateway', '@aws-sdk/client-iam');\n }\n if (options.backend.type === 'trpc') {\n // trpc-utils.ts types the router with @trpc/server.\n constructDeps.push('@trpc/server');\n }\n if (constructDeps.length > 0) {\n addDependenciesToPackageJson(\n tree,\n withVersions(\n forDependencies<typeof API_CONSTRUCTS_DEPENDENCIES>(declaration),\n constructDeps,\n ),\n {},\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'package.json'),\n );\n }\n\n // Generate app specific CDK construct\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'app',\n 'apis',\n options.constructType,\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'apis',\n ),\n { ...options, ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Export app specific CDK construct\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'apis',\n 'index.ts',\n ),\n `./${options.apiNameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n './apis/index.js',\n );\n};\n\n/**\n * Add an API terraform module, and update the Runtime Config type to export its url\n */\nconst addApiGatewayTerraformModules = (\n tree: Tree,\n options: AddApiGatewayConstructOptions,\n) => {\n // Generate core terraform module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'core',\n 'api',\n options.constructType,\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'core', 'api'),\n { boto3Version: PY_VERSIONS.boto3, ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate app specific terraform module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'apis',\n options.constructType,\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'app', 'apis'),\n { ...options, ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addStarExport","forDependencies","addDependenciesToPackageJson","esmVars","addDependencyToTargetIfNotPresent","generatedInfrastructure","generatedTerraform","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","SHARED_TERRAFORM_DIR","PY_VERSIONS","terraformProviderVersions","withVersions","API_CONSTRUCTS_DEPENDENCIES","name","when","API_CONSTRUCTS_PY_DEPENDENCIES","addApiGatewayInfra","tree","options","declaration","iac","addApiGatewayCdkConstructs","addApiGatewayTerraformModules","Error","config","apiProjectName","generateCoreApiFile","dirname","overwriteStrategy","KeepExisting","constructType","backend","type","constructDeps","push","length","apiNameKebabCase","boto3Version","boto3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/utils/api-constructs/api-constructs.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addStarExport } from '../ast.js';\nimport {\n type DeclaredPyDependency,\n type DeclaredTsDependency,\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../dependencies.js';\nimport type { Iac } from '../iac.js';\nimport { esmVars } from '../module-format.js';\nimport { addDependencyToTargetIfNotPresent } from '../nx.js';\nimport {\n generatedInfrastructure,\n generatedTerraform,\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n SHARED_TERRAFORM_DIR,\n} from '../shared-constructs-constants.js';\nimport {\n type IPyDepVersion,\n type ITsDepVersion,\n PY_VERSIONS,\n terraformProviderVersions,\n withVersions,\n} from '../versions.js';\n\n/**\n * Dependencies a caller must declare to add API Gateway infrastructure.\n *\n * Gated on infrastructure having been generated: `addApiGatewayInfra` only runs\n * on that branch, so a project generated with `infra: 'none'` never receives\n * these.\n */\nexport const API_CONSTRUCTS_DEPENDENCIES = [\n { name: '@aws-sdk/client-api-gateway', when: generatedInfrastructure },\n { name: '@aws-sdk/client-iam', when: generatedInfrastructure },\n { name: '@trpc/server', when: generatedInfrastructure },\n] as const satisfies readonly DeclaredTsDependency<\n ITsDepVersion,\n IacMetadata\n>[];\n\n/**\n * Python version the generated Terraform pins in the account module's inline\n * `uv run --with` script. Nothing installs it, so it is declared for its version\n * alone, and only on the Terraform branch that writes the script.\n */\nexport const API_CONSTRUCTS_PY_DEPENDENCIES = [\n { name: 'boto3', when: generatedTerraform },\n] as const satisfies readonly DeclaredPyDependency<\n IPyDepVersion,\n IacMetadata\n>[];\n\n/**\n * Path segments a REST API operation may have in the generated Terraform.\n *\n * API Gateway REST APIs need a resource per path segment, and instances of a\n * Terraform resource cannot reference one another\n * (https://github.com/hashicorp/terraform/issues/26697), so the module declares\n * one resource per level up to this depth. Deeper paths fail the plan with a\n * message pointing at the fix. Empty levels create no resources, so the only\n * cost of the headroom is the generated configuration itself.\n */\nconst MAX_REST_PATH_DEPTH = 16;\n\ninterface BackendOptions {\n type: 'trpc' | 'fastapi' | 'smithy';\n integrationPattern: 'isolated' | 'shared';\n}\n\nexport interface TrpcBackendOptions extends BackendOptions {\n type: 'trpc';\n projectAlias: string;\n bundleOutputDir: string;\n authorizerBundleOutputDir?: string;\n}\n\nexport interface FastApiBackendOptions extends BackendOptions {\n type: 'fastapi';\n moduleName: string;\n bundleOutputDir: string;\n}\n\nexport interface SmithyBackendOptions extends BackendOptions {\n type: 'smithy';\n bundleOutputDir: string;\n authorizerBundleOutputDir?: string;\n}\n\nexport interface AddApiGatewayConstructOptions {\n apiProjectName: string;\n apiNameClassName: string;\n apiNameKebabCase: string;\n constructType: 'http' | 'rest';\n backend: TrpcBackendOptions | FastApiBackendOptions | SmithyBackendOptions;\n auth: 'iam' | 'cognito' | 'custom';\n}\n\nexport const addApiGatewayInfra = async <const D extends DependencyDeclaration>(\n tree: Tree,\n options: AddApiGatewayConstructOptions & { iac: Iac },\n declaration: D & MustDeclare<typeof API_CONSTRUCTS_DEPENDENCIES, D>,\n) => {\n if (options.iac === 'cdk') {\n await addApiGatewayCdkConstructs(tree, options, declaration);\n } else if (options.iac === 'terraform') {\n addApiGatewayTerraformModules(tree, options);\n } else {\n throw new Error(`Unsupported iac ${options.iac}`);\n }\n\n updateJson(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n options.iac === 'cdk' ? SHARED_CONSTRUCTS_DIR : SHARED_TERRAFORM_DIR,\n 'project.json',\n ),\n (config: ProjectConfiguration) => {\n addDependencyToTargetIfNotPresent(\n config,\n 'build',\n `${options.apiProjectName}:build`,\n );\n return config;\n },\n );\n};\n\n/**\n * Add an API CDK construct, and update the Runtime Config type to export its url\n */\nconst addApiGatewayCdkConstructs = async (\n tree: Tree,\n options: AddApiGatewayConstructOptions,\n declaration: DependencyDeclaration,\n) => {\n const generateCoreApiFile = (name: string) => {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'core',\n 'api',\n name,\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'core',\n 'api',\n ),\n { ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n };\n\n // Generate relevant core CDK construct and utilities\n generateCoreApiFile(options.constructType);\n generateCoreApiFile('utils');\n if (options.backend.type === 'trpc') {\n generateCoreApiFile('trpc');\n }\n\n // Declare the deps the generated core construct files import.\n const constructDeps: (typeof API_CONSTRUCTS_DEPENDENCIES)[number]['name'][] =\n [];\n if (options.constructType === 'rest') {\n // REST account construct configures the account via the AWS SDK.\n constructDeps.push('@aws-sdk/client-api-gateway', '@aws-sdk/client-iam');\n }\n if (options.backend.type === 'trpc') {\n // trpc-utils.ts types the router with @trpc/server.\n constructDeps.push('@trpc/server');\n }\n if (constructDeps.length > 0) {\n addDependenciesToPackageJson(\n tree,\n withVersions(\n forDependencies<typeof API_CONSTRUCTS_DEPENDENCIES>(declaration),\n constructDeps,\n ),\n {},\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'package.json'),\n );\n }\n\n // Generate app specific CDK construct\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'app',\n 'apis',\n options.constructType,\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'apis',\n ),\n { ...options, ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Export app specific CDK construct\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'apis',\n 'index.ts',\n ),\n `./${options.apiNameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n './apis/index.js',\n );\n};\n\n/**\n * Add an API terraform module, and update the Runtime Config type to export its url\n */\nconst addApiGatewayTerraformModules = (\n tree: Tree,\n options: AddApiGatewayConstructOptions,\n) => {\n // Generate core terraform module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'core',\n 'api',\n options.constructType,\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'core', 'api'),\n { boto3Version: PY_VERSIONS.boto3, ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate app specific terraform module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'apis',\n options.constructType,\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'app', 'apis'),\n {\n ...options,\n maxRestPathDepth: MAX_REST_PATH_DEPTH,\n ...terraformProviderVersions(),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addStarExport","forDependencies","addDependenciesToPackageJson","esmVars","addDependencyToTargetIfNotPresent","generatedInfrastructure","generatedTerraform","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","SHARED_TERRAFORM_DIR","PY_VERSIONS","terraformProviderVersions","withVersions","API_CONSTRUCTS_DEPENDENCIES","name","when","API_CONSTRUCTS_PY_DEPENDENCIES","MAX_REST_PATH_DEPTH","addApiGatewayInfra","tree","options","declaration","iac","addApiGatewayCdkConstructs","addApiGatewayTerraformModules","Error","config","apiProjectName","generateCoreApiFile","dirname","overwriteStrategy","KeepExisting","constructType","backend","type","constructDeps","push","length","apiNameKebabCase","boto3Version","boto3","maxRestPathDepth"],"mappings":"AAAA;;;CAGC,GACD,SACEA,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,EAGjBC,UAAU,QACL,aAAa;AACpB,SAASC,aAAa,QAAQ,YAAY;AAC1C,SAIEC,eAAe,QAEV,8BAA8B;AACrC,SAASC,4BAA4B,QAAQ,qBAAqB;AAElE,SAASC,OAAO,QAAQ,sBAAsB;AAC9C,SAASC,iCAAiC,QAAQ,WAAW;AAC7D,SACEC,uBAAuB,EACvBC,kBAAkB,EAElBC,YAAY,EACZC,qBAAqB,EACrBC,oBAAoB,QACf,oCAAoC;AAC3C,SAGEC,WAAW,EACXC,yBAAyB,EACzBC,YAAY,QACP,iBAAiB;AAExB;;;;;;CAMC,GACD,OAAO,MAAMC,8BAA8B;IACzC;QAAEC,MAAM;QAA+BC,MAAMV;IAAwB;IACrE;QAAES,MAAM;QAAuBC,MAAMV;IAAwB;IAC7D;QAAES,MAAM;QAAgBC,MAAMV;IAAwB;CACvD,CAGG;AAEJ;;;;CAIC,GACD,OAAO,MAAMW,iCAAiC;IAC5C;QAAEF,MAAM;QAASC,MAAMT;IAAmB;CAC3C,CAGG;AAEJ;;;;;;;;;CASC,GACD,MAAMW,sBAAsB;AAmC5B,OAAO,MAAMC,qBAAqB,OAChCC,MACAC,SACAC;IAEA,IAAID,QAAQE,GAAG,KAAK,OAAO;QACzB,MAAMC,2BAA2BJ,MAAMC,SAASC;IAClD,OAAO,IAAID,QAAQE,GAAG,KAAK,aAAa;QACtCE,8BAA8BL,MAAMC;IACtC,OAAO;QACL,MAAM,IAAIK,MAAM,CAAC,gBAAgB,EAAEL,QAAQE,GAAG,EAAE;IAClD;IAEAvB,WACEoB,MACAtB,kBACEU,cACAa,QAAQE,GAAG,KAAK,QAAQd,wBAAwBC,sBAChD,iBAEF,CAACiB;QACCtB,kCACEsB,QACA,SACA,GAAGN,QAAQO,cAAc,CAAC,MAAM,CAAC;QAEnC,OAAOD;IACT;AAEJ,EAAE;AAEF;;CAEC,GACD,MAAMH,6BAA6B,OACjCJ,MACAC,SACAC;IAEA,MAAMO,sBAAsB,CAACd;QAC3BlB,cACEuB,MACAtB,kBACE,YAAYgC,OAAO,EACnB,SACA,OACA,QACA,OACAf,OAEFjB,kBACEU,cACAC,uBACA,OACA,QACA,QAEF;YAAE,GAAGL,QAAQgB,KAAK;QAAC,GACnB;YACEW,mBAAmBhC,kBAAkBiC,YAAY;QACnD;IAEJ;IAEA,qDAAqD;IACrDH,oBAAoBR,QAAQY,aAAa;IACzCJ,oBAAoB;IACpB,IAAIR,QAAQa,OAAO,CAACC,IAAI,KAAK,QAAQ;QACnCN,oBAAoB;IACtB;IAEA,8DAA8D;IAC9D,MAAMO,gBACJ,EAAE;IACJ,IAAIf,QAAQY,aAAa,KAAK,QAAQ;QACpC,iEAAiE;QACjEG,cAAcC,IAAI,CAAC,+BAA+B;IACpD;IACA,IAAIhB,QAAQa,OAAO,CAACC,IAAI,KAAK,QAAQ;QACnC,oDAAoD;QACpDC,cAAcC,IAAI,CAAC;IACrB;IACA,IAAID,cAAcE,MAAM,GAAG,GAAG;QAC5BnC,6BACEiB,MACAP,aACEX,gBAAoDoB,cACpDc,gBAEF,CAAC,GACDtC,kBAAkBU,cAAcC,uBAAuB;IAE3D;IAEA,sCAAsC;IACtCZ,cACEuB,MACAtB,kBACE,YAAYgC,OAAO,EACnB,SACA,OACA,OACA,QACAT,QAAQY,aAAa,GAEvBnC,kBACEU,cACAC,uBACA,OACA,OACA,SAEF;QAAE,GAAGY,OAAO;QAAE,GAAGjB,QAAQgB,KAAK;IAAC,GAC/B;QACEW,mBAAmBhC,kBAAkBiC,YAAY;IACnD;IAGF,oCAAoC;IACpC,MAAM/B,cACJmB,MACAtB,kBACEU,cACAC,uBACA,OACA,OACA,QACA,aAEF,CAAC,EAAE,EAAEY,QAAQkB,gBAAgB,CAAC,GAAG,CAAC;IAEpC,MAAMtC,cACJmB,MACAtB,kBACEU,cACAC,uBACA,OACA,OACA,aAEF;AAEJ;AAEA;;CAEC,GACD,MAAMgB,gCAAgC,CACpCL,MACAC;IAEA,iCAAiC;IACjCxB,cACEuB,MACAtB,kBACE,YAAYgC,OAAO,EACnB,SACA,aACA,QACA,OACAT,QAAQY,aAAa,GAEvBnC,kBAAkBU,cAAcE,sBAAsB,OAAO,QAAQ,QACrE;QAAE8B,cAAc7B,YAAY8B,KAAK;QAAE,GAAG7B,2BAA2B;IAAC,GAClE;QACEmB,mBAAmBhC,kBAAkBiC,YAAY;IACnD;IAGF,yCAAyC;IACzCnC,cACEuB,MACAtB,kBACE,YAAYgC,OAAO,EACnB,SACA,aACA,OACA,QACAT,QAAQY,aAAa,GAEvBnC,kBAAkBU,cAAcE,sBAAsB,OAAO,OAAO,SACpE;QACE,GAAGW,OAAO;QACVqB,kBAAkBxB;QAClB,GAAGN,2BAA2B;IAChC,GACA;QACEmB,mBAAmBhC,kBAAkBiC,YAAY;IACnD;AAEJ"}
|