cdk-factory 0.18.14__py3-none-any.whl → 0.18.19__py3-none-any.whl
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.
Potentially problematic release.
This version of cdk-factory might be problematic. Click here for more details.
- cdk_factory/configurations/resources/route53.py +5 -0
- cdk_factory/interfaces/standardized_ssm_mixin.py +27 -0
- cdk_factory/stack_library/load_balancer/load_balancer_stack.py +41 -34
- cdk_factory/stack_library/route53/route53_stack.py +243 -4
- cdk_factory/version.py +1 -1
- {cdk_factory-0.18.14.dist-info → cdk_factory-0.18.19.dist-info}/METADATA +1 -1
- {cdk_factory-0.18.14.dist-info → cdk_factory-0.18.19.dist-info}/RECORD +10 -10
- {cdk_factory-0.18.14.dist-info → cdk_factory-0.18.19.dist-info}/WHEEL +0 -0
- {cdk_factory-0.18.14.dist-info → cdk_factory-0.18.19.dist-info}/entry_points.txt +0 -0
- {cdk_factory-0.18.14.dist-info → cdk_factory-0.18.19.dist-info}/licenses/LICENSE +0 -0
|
@@ -106,3 +106,8 @@ class Route53Config:
|
|
|
106
106
|
def tags(self) -> Dict[str, str]:
|
|
107
107
|
"""Tags to apply to the Route53 resources"""
|
|
108
108
|
return self.__config.get("tags", {})
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def records(self) -> List[Dict[str, Any]]:
|
|
112
|
+
"""Records to create"""
|
|
113
|
+
return self.__config.get("records", [])
|
|
@@ -119,6 +119,7 @@ class StandardizedSsmMixin:
|
|
|
119
119
|
"""Export multiple resource values to SSM Parameter Store."""
|
|
120
120
|
params = {}
|
|
121
121
|
|
|
122
|
+
invalid_export_keys = []
|
|
122
123
|
# Only export parameters that are explicitly configured in ssm_exports
|
|
123
124
|
if not hasattr(config, 'ssm_exports') or not config.ssm_exports:
|
|
124
125
|
logger.debug("No SSM exports configured")
|
|
@@ -138,8 +139,17 @@ class StandardizedSsmMixin:
|
|
|
138
139
|
)
|
|
139
140
|
params[key] = param
|
|
140
141
|
else:
|
|
142
|
+
invalid_export_keys.append(key)
|
|
141
143
|
logger.warning(f"SSM export configured for '{key}' but no value found in resource_values")
|
|
142
144
|
|
|
145
|
+
if invalid_export_keys:
|
|
146
|
+
message = f"Export SSM Error\n🚨 SSM exports configured for '{invalid_export_keys}' but no values found in resource_values"
|
|
147
|
+
available_keys = list(resource_values.keys())
|
|
148
|
+
message = f"{message}\n✅ Available keys: {available_keys}"
|
|
149
|
+
message = f"{message}\n👉 Please update to the correct key or remove from the export list."
|
|
150
|
+
logger.warning(message)
|
|
151
|
+
raise ValueError(message)
|
|
152
|
+
|
|
143
153
|
return params
|
|
144
154
|
|
|
145
155
|
def normalize_resource_name(self, name: str, for_export: bool = False) -> str:
|
|
@@ -269,6 +279,23 @@ class StandardizedSsmMixin:
|
|
|
269
279
|
|
|
270
280
|
return exported_params
|
|
271
281
|
|
|
282
|
+
def resolve_ssm_value(self, scope: Construct, value: str, unique_id: str)-> str:
|
|
283
|
+
if isinstance(value, str) and value.startswith("{{ssm:") and value.endswith("}}"):
|
|
284
|
+
# Extract SSM parameter path
|
|
285
|
+
ssm_param_path = value[6:-2] # Remove {{ssm: and }}
|
|
286
|
+
|
|
287
|
+
# Import SSM parameter - this creates a token that resolves at deployment time
|
|
288
|
+
param = ssm.StringParameter.from_string_parameter_name(
|
|
289
|
+
scope=scope,
|
|
290
|
+
id=f"{unique_id}-env-{hash(ssm_param_path) % 10000}",
|
|
291
|
+
string_parameter_name=ssm_param_path
|
|
292
|
+
)
|
|
293
|
+
resolved_value = param.string_value
|
|
294
|
+
logger.info(f"Resolved SSM parameter {ssm_param_path}")
|
|
295
|
+
return resolved_value
|
|
296
|
+
else:
|
|
297
|
+
return value
|
|
298
|
+
|
|
272
299
|
def _resolve_ssm_import(self, import_value: Union[str, List[str]], import_key: str) -> Union[str, List[str]]:
|
|
273
300
|
"""
|
|
274
301
|
Resolve SSM import value with proper error handling and validation.
|
|
@@ -456,44 +456,42 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
|
|
|
456
456
|
# Configure conditions
|
|
457
457
|
conditions = []
|
|
458
458
|
|
|
459
|
-
#
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
http_headers = rule_config.get("http_headers", {})
|
|
471
|
-
for header_name, header_values in http_headers.items():
|
|
472
|
-
conditions.append(
|
|
473
|
-
elbv2.ListenerCondition.http_header(header_name, header_values)
|
|
474
|
-
)
|
|
475
|
-
|
|
476
|
-
# Query strings
|
|
477
|
-
query_strings = rule_config.get("query_strings", [])
|
|
478
|
-
if query_strings:
|
|
479
|
-
query_string_conditions = []
|
|
480
|
-
for qs in query_strings:
|
|
481
|
-
query_string_conditions.append(
|
|
482
|
-
elbv2.QueryStringCondition(
|
|
483
|
-
key=qs.get("key"), value=qs.get("value")
|
|
459
|
+
# Parse AWS ALB conditions format
|
|
460
|
+
aws_conditions = rule_config.get("conditions", [])
|
|
461
|
+
for condition in aws_conditions:
|
|
462
|
+
field = condition.get("field")
|
|
463
|
+
if field == "http-header" and "http_header_config" in condition:
|
|
464
|
+
header_config = condition["http_header_config"]
|
|
465
|
+
header_name = header_config.get("header_name")
|
|
466
|
+
header_values = header_config.get("values", [])
|
|
467
|
+
if header_name and header_values:
|
|
468
|
+
conditions.append(
|
|
469
|
+
elbv2.ListenerCondition.http_header(header_name, header_values)
|
|
484
470
|
)
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
471
|
+
elif field == "path-pattern" and "values" in condition:
|
|
472
|
+
path_patterns = condition.get("values", [])
|
|
473
|
+
if path_patterns:
|
|
474
|
+
conditions.append(elbv2.ListenerCondition.path_patterns(path_patterns))
|
|
475
|
+
elif field == "host-header" and "values" in condition:
|
|
476
|
+
host_headers = condition.get("values", [])
|
|
477
|
+
if host_headers:
|
|
478
|
+
conditions.append(elbv2.ListenerCondition.host_headers(host_headers))
|
|
489
479
|
|
|
490
480
|
# Configure actions
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
)
|
|
481
|
+
target_group = None
|
|
482
|
+
|
|
483
|
+
# Parse AWS ALB actions format
|
|
484
|
+
aws_actions = rule_config.get("actions", [])
|
|
485
|
+
for action in aws_actions:
|
|
486
|
+
if action.get("type") == "forward":
|
|
487
|
+
target_group_name = action.get("target_group")
|
|
488
|
+
target_group = (
|
|
489
|
+
self.target_groups.get(target_group_name) if target_group_name else None
|
|
490
|
+
)
|
|
491
|
+
break # Use first forward action
|
|
495
492
|
|
|
496
|
-
|
|
493
|
+
# Validate that we have both conditions and target group before creating rule
|
|
494
|
+
if target_group and conditions:
|
|
497
495
|
# Create rule with forward action
|
|
498
496
|
elbv2.ApplicationListenerRule(
|
|
499
497
|
self,
|
|
@@ -503,6 +501,15 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
|
|
|
503
501
|
conditions=conditions,
|
|
504
502
|
target_groups=[target_group],
|
|
505
503
|
)
|
|
504
|
+
elif not conditions:
|
|
505
|
+
logger.warning(
|
|
506
|
+
f"Skipping listener rule '{rule_id}' - no conditions defined. "
|
|
507
|
+
f"CDK requires at least one condition for every rule."
|
|
508
|
+
)
|
|
509
|
+
elif not target_group:
|
|
510
|
+
logger.warning(
|
|
511
|
+
f"Skipping listener rule '{rule_id}' - no valid target group found."
|
|
512
|
+
)
|
|
506
513
|
|
|
507
514
|
def _add_ip_whitelist_rules(
|
|
508
515
|
self,
|
|
@@ -7,10 +7,15 @@ MIT License. See Project Root for the license information.
|
|
|
7
7
|
from typing import Dict, Any, List, Optional
|
|
8
8
|
|
|
9
9
|
import aws_cdk as cdk
|
|
10
|
-
from aws_cdk import
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
from aws_cdk import (
|
|
11
|
+
aws_route53 as route53,
|
|
12
|
+
aws_route53_targets as targets,
|
|
13
|
+
aws_certificatemanager as acm,
|
|
14
|
+
aws_elasticloadbalancingv2 as elbv2,
|
|
15
|
+
aws_cloudfront as cloudfront,
|
|
16
|
+
Duration,
|
|
17
|
+
CfnOutput,
|
|
18
|
+
)
|
|
14
19
|
from aws_lambda_powertools import Logger
|
|
15
20
|
from constructs import Construct
|
|
16
21
|
|
|
@@ -35,6 +40,7 @@ class Route53Stack(IStack, StandardizedSsmMixin):
|
|
|
35
40
|
|
|
36
41
|
def __init__(self, scope: Construct, id: str, **kwargs) -> None:
|
|
37
42
|
super().__init__(scope, id, **kwargs)
|
|
43
|
+
|
|
38
44
|
self.route53_config = None
|
|
39
45
|
self.stack_config = None
|
|
40
46
|
self.deployment = None
|
|
@@ -42,6 +48,7 @@ class Route53Stack(IStack, StandardizedSsmMixin):
|
|
|
42
48
|
self.hosted_zone = None
|
|
43
49
|
self.certificate = None
|
|
44
50
|
self.records = {}
|
|
51
|
+
self._distribution_cache = {} # Cache for reusing distributions
|
|
45
52
|
|
|
46
53
|
def build(self, stack_config: StackConfig, deployment: DeploymentConfig, workload: WorkloadConfig) -> None:
|
|
47
54
|
"""Build the Route53 stack"""
|
|
@@ -112,6 +119,232 @@ class Route53Stack(IStack, StandardizedSsmMixin):
|
|
|
112
119
|
return certificate
|
|
113
120
|
|
|
114
121
|
def _create_dns_records(self) -> None:
|
|
122
|
+
self._create_dns_records_old()
|
|
123
|
+
self._create_dns_records_new()
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _get_or_create_cloudfront_distribution(self, distribution_domain: str, distribution_id: str) -> cloudfront.Distribution:
|
|
127
|
+
"""Get or create a CloudFront distribution, reusing if already created"""
|
|
128
|
+
# Create a unique cache key from distribution domain and ID
|
|
129
|
+
cache_key = f"{distribution_domain}-{distribution_id}"
|
|
130
|
+
|
|
131
|
+
if cache_key not in self._distribution_cache:
|
|
132
|
+
# Create the distribution construct with a unique ID
|
|
133
|
+
unique_id = f"CF-{distribution_domain.replace('.', '-').replace('*', 'wildcard')}-{hash(cache_key) % 10000}"
|
|
134
|
+
distribution = cloudfront.Distribution.from_distribution_attributes(
|
|
135
|
+
self, unique_id,
|
|
136
|
+
domain_name=distribution_domain,
|
|
137
|
+
distribution_id=distribution_id
|
|
138
|
+
)
|
|
139
|
+
self._distribution_cache[cache_key] = distribution
|
|
140
|
+
logger.info(f"Created CloudFront distribution construct for {distribution_domain}")
|
|
141
|
+
|
|
142
|
+
return self._distribution_cache[cache_key]
|
|
143
|
+
|
|
144
|
+
def _create_dns_records_new(self) -> None:
|
|
145
|
+
"""Create DNS records based on configuration - generic implementation"""
|
|
146
|
+
|
|
147
|
+
missing_configurations = []
|
|
148
|
+
|
|
149
|
+
for record in self.route53_config.records:
|
|
150
|
+
record_name = record.get("name", "")
|
|
151
|
+
record_type = record.get("type", "")
|
|
152
|
+
|
|
153
|
+
if not record_name or not record_type:
|
|
154
|
+
message = f"Record missing name or type: {record}"
|
|
155
|
+
logger.warning(message)
|
|
156
|
+
missing_configurations.append(message)
|
|
157
|
+
continue
|
|
158
|
+
|
|
159
|
+
# Handle alias records
|
|
160
|
+
if "alias" in record:
|
|
161
|
+
alias_config = record["alias"]
|
|
162
|
+
target_type = alias_config.get("target_type", "")
|
|
163
|
+
target_value = alias_config.get("target_value", "")
|
|
164
|
+
hosted_zone_id = alias_config.get("hosted_zone_id", "")
|
|
165
|
+
|
|
166
|
+
unique_id = f"{record_name}-{record_type}"
|
|
167
|
+
# Handle SSM parameter references in target_value
|
|
168
|
+
target_value = self.resolve_ssm_value(self, target_value, unique_id=unique_id)
|
|
169
|
+
|
|
170
|
+
if not target_type or not target_value:
|
|
171
|
+
message = f"Alias record missing target_type or target_value: {record}"
|
|
172
|
+
logger.warning(message)
|
|
173
|
+
missing_configurations.append(message)
|
|
174
|
+
continue
|
|
175
|
+
|
|
176
|
+
# Create appropriate target based on type
|
|
177
|
+
alias_target = None
|
|
178
|
+
if target_type == "cloudfront":
|
|
179
|
+
# CloudFront distribution target
|
|
180
|
+
distribution_domain = target_value
|
|
181
|
+
distribution_id = alias_config.get("distribution_id", "")
|
|
182
|
+
if not distribution_id:
|
|
183
|
+
message = f"Alias record missing distribution_id: {record}"
|
|
184
|
+
logger.warning(message)
|
|
185
|
+
missing_configurations.append(message)
|
|
186
|
+
continue
|
|
187
|
+
|
|
188
|
+
# Get or create the distribution (reuses if already created)
|
|
189
|
+
distribution = self._get_or_create_cloudfront_distribution(distribution_domain, distribution_id)
|
|
190
|
+
alias_target = route53.RecordTarget.from_alias(
|
|
191
|
+
targets.CloudFrontTarget(distribution)
|
|
192
|
+
)
|
|
193
|
+
elif target_type == "loadbalancer" or target_type == "alb":
|
|
194
|
+
# Load Balancer target
|
|
195
|
+
alias_target = route53.RecordTarget.from_alias(
|
|
196
|
+
targets.LoadBalancerTarget(
|
|
197
|
+
elbv2.ApplicationLoadBalancer.from_load_balancer_attributes(
|
|
198
|
+
self, f"ALB-{record_name}",
|
|
199
|
+
load_balancer_dns_name=target_value,
|
|
200
|
+
load_balancer_canonical_hosted_zone_id=hosted_zone_id
|
|
201
|
+
)
|
|
202
|
+
)
|
|
203
|
+
)
|
|
204
|
+
elif target_type == "elbv2":
|
|
205
|
+
# Generic ELBv2 target
|
|
206
|
+
alias_target = route53.RecordTarget.from_alias(
|
|
207
|
+
targets.LoadBalancerTarget(
|
|
208
|
+
elbv2.ApplicationLoadBalancer.from_load_balancer_attributes(
|
|
209
|
+
self, f"ELB-{record_name}",
|
|
210
|
+
load_balancer_dns_name=target_value,
|
|
211
|
+
load_balancer_canonical_hosted_zone_id=hosted_zone_id
|
|
212
|
+
)
|
|
213
|
+
)
|
|
214
|
+
)
|
|
215
|
+
else:
|
|
216
|
+
message = f"Unsupported alias target type: {target_type}"
|
|
217
|
+
logger.warning(message)
|
|
218
|
+
missing_configurations.append(message)
|
|
219
|
+
continue
|
|
220
|
+
|
|
221
|
+
# Create the alias record
|
|
222
|
+
route53.ARecord(
|
|
223
|
+
self,
|
|
224
|
+
f"AliasRecord-{record_name}-{record_type}",
|
|
225
|
+
zone=self.hosted_zone,
|
|
226
|
+
record_name=record_name,
|
|
227
|
+
target=alias_target,
|
|
228
|
+
ttl=cdk.Duration.seconds(record.get("ttl", 300))
|
|
229
|
+
) if record_type == "A" else route53.AaaaRecord(
|
|
230
|
+
self,
|
|
231
|
+
f"AliasRecord-{record_name}-{record_type}",
|
|
232
|
+
zone=self.hosted_zone,
|
|
233
|
+
record_name=record_name,
|
|
234
|
+
target=alias_target,
|
|
235
|
+
ttl=cdk.Duration.seconds(record.get("ttl", 300))
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# Handle standard records with values
|
|
239
|
+
elif "values" in record:
|
|
240
|
+
values = record["values"]
|
|
241
|
+
if not isinstance(values, list):
|
|
242
|
+
values = [values]
|
|
243
|
+
|
|
244
|
+
# Handle SSM parameter references in values
|
|
245
|
+
processed_values = []
|
|
246
|
+
for value in values:
|
|
247
|
+
if "{{ssm:" in str(value) and "}}" in str(value):
|
|
248
|
+
# Extract SSM parameter path from template like {{ssm:/path/to/parameter}}
|
|
249
|
+
ssm_path = str(value).split("{{ssm:")[1].split("}}")[0]
|
|
250
|
+
resolved_value = self.get_ssm_imported_value(ssm_path)
|
|
251
|
+
processed_values.append(resolved_value)
|
|
252
|
+
else:
|
|
253
|
+
processed_values.append(value)
|
|
254
|
+
|
|
255
|
+
values = processed_values
|
|
256
|
+
ttl = record.get("ttl", 300)
|
|
257
|
+
|
|
258
|
+
# Create standard record based on type
|
|
259
|
+
if record_type == "A":
|
|
260
|
+
route53.ARecord(
|
|
261
|
+
self,
|
|
262
|
+
f"Record-{record_name}",
|
|
263
|
+
zone=self.hosted_zone,
|
|
264
|
+
record_name=record_name,
|
|
265
|
+
target=route53.RecordTarget.from_ip_addresses(*values),
|
|
266
|
+
ttl=cdk.Duration.seconds(ttl)
|
|
267
|
+
)
|
|
268
|
+
elif record_type == "AAAA":
|
|
269
|
+
route53.AaaaRecord(
|
|
270
|
+
self,
|
|
271
|
+
f"Record-{record_name}",
|
|
272
|
+
zone=self.hosted_zone,
|
|
273
|
+
record_name=record_name,
|
|
274
|
+
target=route53.RecordTarget.from_ip_addresses(*values),
|
|
275
|
+
ttl=cdk.Duration.seconds(ttl)
|
|
276
|
+
)
|
|
277
|
+
elif record_type == "CNAME":
|
|
278
|
+
route53.CnameRecord(
|
|
279
|
+
self,
|
|
280
|
+
f"Record-{record_name}",
|
|
281
|
+
zone=self.hosted_zone,
|
|
282
|
+
record_name=record_name,
|
|
283
|
+
domain_name=values[0], # CNAME only supports single value
|
|
284
|
+
ttl=cdk.Duration.seconds(ttl)
|
|
285
|
+
)
|
|
286
|
+
elif record_type == "MX":
|
|
287
|
+
# MX records need special handling for preference values
|
|
288
|
+
mx_targets = []
|
|
289
|
+
for value in values:
|
|
290
|
+
if isinstance(value, str) and " " in value:
|
|
291
|
+
preference, domain = value.split(" ", 1)
|
|
292
|
+
mx_targets.append(route53.MxRecordValue(
|
|
293
|
+
domain_name=domain.strip(),
|
|
294
|
+
preference=int(preference.strip())
|
|
295
|
+
))
|
|
296
|
+
else:
|
|
297
|
+
logger.warning(f"Invalid MX record format: {value}")
|
|
298
|
+
|
|
299
|
+
if mx_targets:
|
|
300
|
+
route53.MxRecord(
|
|
301
|
+
self,
|
|
302
|
+
f"Record-{record_name}",
|
|
303
|
+
zone=self.hosted_zone,
|
|
304
|
+
record_name=record_name,
|
|
305
|
+
values=mx_targets,
|
|
306
|
+
ttl=cdk.Duration.seconds(ttl)
|
|
307
|
+
)
|
|
308
|
+
elif record_type == "TXT":
|
|
309
|
+
route53.TxtRecord(
|
|
310
|
+
self,
|
|
311
|
+
f"Record-{record_name}",
|
|
312
|
+
zone=self.hosted_zone,
|
|
313
|
+
record_name=record_name,
|
|
314
|
+
values=values,
|
|
315
|
+
ttl=cdk.Duration.seconds(ttl)
|
|
316
|
+
)
|
|
317
|
+
elif record_type == "NS":
|
|
318
|
+
route53.NsRecord(
|
|
319
|
+
self,
|
|
320
|
+
f"Record-{record_name}",
|
|
321
|
+
zone=self.hosted_zone,
|
|
322
|
+
record_name=record_name,
|
|
323
|
+
values=values,
|
|
324
|
+
ttl=cdk.Duration.seconds(ttl)
|
|
325
|
+
)
|
|
326
|
+
else:
|
|
327
|
+
message = f"Unsupported record type: {record_type}"
|
|
328
|
+
logger.warning(message)
|
|
329
|
+
missing_configurations.append(message)
|
|
330
|
+
continue
|
|
331
|
+
|
|
332
|
+
else:
|
|
333
|
+
message = f"Record missing 'alias' or 'values' configuration: {record}"
|
|
334
|
+
logger.warning(message)
|
|
335
|
+
missing_configurations.append(message)
|
|
336
|
+
continue
|
|
337
|
+
|
|
338
|
+
if missing_configurations and len(missing_configurations) > 0:
|
|
339
|
+
# print all missing configurations
|
|
340
|
+
print("Missing configurations:")
|
|
341
|
+
for message in missing_configurations:
|
|
342
|
+
print(message)
|
|
343
|
+
|
|
344
|
+
messages = "\n".join(missing_configurations)
|
|
345
|
+
raise ValueError(f"Missing Configurations:\n{messages}")
|
|
346
|
+
|
|
347
|
+
def _create_dns_records_old(self) -> None:
|
|
115
348
|
"""Create DNS records based on configuration"""
|
|
116
349
|
# Create alias records
|
|
117
350
|
for alias_record in self.route53_config.aliases:
|
|
@@ -119,6 +352,12 @@ class Route53Stack(IStack, StandardizedSsmMixin):
|
|
|
119
352
|
target_type = alias_record.get("target_type", "")
|
|
120
353
|
target_value = alias_record.get("target_value", "")
|
|
121
354
|
|
|
355
|
+
# target value needs to handle SSM parameters
|
|
356
|
+
if "{{ssm:" in target_value and "}}" in target_value:
|
|
357
|
+
# Extract SSM parameter path from template like {{ssm:/path/to/parameter}}
|
|
358
|
+
ssm_path = target_value.split("{{ssm:")[1].split("}}")[0]
|
|
359
|
+
target_value = self.get_ssm_imported_value(ssm_path)
|
|
360
|
+
|
|
122
361
|
if not record_name or not target_type or not target_value:
|
|
123
362
|
continue
|
|
124
363
|
|
cdk_factory/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.18.
|
|
1
|
+
__version__ = "0.18.19"
|
|
@@ -2,7 +2,7 @@ cdk_factory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
2
2
|
cdk_factory/app.py,sha256=RnX0-pwdTAPAdKJK_j13Zl8anf9zYKBwboR0KA8K8xM,10346
|
|
3
3
|
cdk_factory/cdk.json,sha256=SKZKhJ2PBpFH78j-F8S3VDYW-lf76--Q2I3ON-ZIQfw,3106
|
|
4
4
|
cdk_factory/cli.py,sha256=FGbCTS5dYCNsfp-etshzvFlGDCjC28r6rtzYbe7KoHI,6407
|
|
5
|
-
cdk_factory/version.py,sha256
|
|
5
|
+
cdk_factory/version.py,sha256=uiLHk2KTGw3AhvUxFYieCKErlp7FSK2qsHhYB3akgoI,24
|
|
6
6
|
cdk_factory/builds/README.md,sha256=9BBWd7bXpyKdMU_g2UljhQwrC9i5O_Tvkb6oPvndoZk,90
|
|
7
7
|
cdk_factory/commands/command_loader.py,sha256=QbLquuP_AdxtlxlDy-2IWCQ6D-7qa58aphnDPtp_uTs,3744
|
|
8
8
|
cdk_factory/configurations/base_config.py,sha256=eJ3Pl3GWk1jVr_bYQaaWlw4_-ZiFGaiXllI_fOOX1i0,9323
|
|
@@ -44,7 +44,7 @@ cdk_factory/configurations/resources/rds.py,sha256=ap2sbrcPsesfaPSluzyomGgT70_PU
|
|
|
44
44
|
cdk_factory/configurations/resources/resource_mapping.py,sha256=cwv3n63RJ6E59ErsmSTdkW4i-g8huhHtKI0ExbRhJxA,2182
|
|
45
45
|
cdk_factory/configurations/resources/resource_naming.py,sha256=VE9S2cpzp11qqPL2z1sX79wXH0o1SntO2OG74nEmWC8,5508
|
|
46
46
|
cdk_factory/configurations/resources/resource_types.py,sha256=1WQHyDoErb-M-tETZZzyLDtbq_jdC85-I403dM48pgE,2317
|
|
47
|
-
cdk_factory/configurations/resources/route53.py,sha256=
|
|
47
|
+
cdk_factory/configurations/resources/route53.py,sha256=u63kw9cLBdOQrvxnULmopFqiArIYNvoWhrILNWvhD7w,3599
|
|
48
48
|
cdk_factory/configurations/resources/route53_hosted_zone.py,sha256=qjEYPCSxSOx5blr9EULv892ezxkCs--yrLa1ngWbyXM,880
|
|
49
49
|
cdk_factory/configurations/resources/rum.py,sha256=KgC2Mxhtr5XrICVXdgOXmxYp0GKu9lBs7izfG-Re9Ck,5294
|
|
50
50
|
cdk_factory/configurations/resources/s3.py,sha256=kLY0XNCfErNYnOwekefFJxEJ_AKPifA-wSaaNczDp94,6036
|
|
@@ -66,7 +66,7 @@ cdk_factory/constructs/sqs/policies/sqs_policies.py,sha256=4p0G8G-fqNKSr68I55fvq
|
|
|
66
66
|
cdk_factory/interfaces/istack.py,sha256=3xqGw5kNTt_KeLHdMxI7rIR0YORqcWQOqsacmDlTAv0,1167
|
|
67
67
|
cdk_factory/interfaces/live_ssm_resolver.py,sha256=3FIr9a02SXqZmbFs3RT0WxczWEQR_CF7QSt7kWbDrVE,8163
|
|
68
68
|
cdk_factory/interfaces/networked_stack_mixin.py,sha256=CtWT7Nhy73f0goQQG02jG7lsEucq5OrtZ0ltrp7XTFA,2884
|
|
69
|
-
cdk_factory/interfaces/standardized_ssm_mixin.py,sha256=
|
|
69
|
+
cdk_factory/interfaces/standardized_ssm_mixin.py,sha256=kbl8fTDSBBSUARnKjruYB7KEgsw1Xns7g6fI5Jh8Vio,25763
|
|
70
70
|
cdk_factory/interfaces/vpc_provider_mixin.py,sha256=Kj0mmZd54NINprixJLs8zL-WWiSd0AQBtGdwNg8cz14,8207
|
|
71
71
|
cdk_factory/lambdas/health_handler.py,sha256=dd40ykKMxWCFEIyp2ZdQvAGNjw_ylI9CSm1N24Hp2ME,196
|
|
72
72
|
cdk_factory/lambdas/edge/ip_gate/handler.py,sha256=gUevgX462mqGYddtQIyJ1-Jk3oXhFmbmd46jlqjai9E,10657
|
|
@@ -103,13 +103,13 @@ cdk_factory/stack_library/ecs/ecs_service_stack.py,sha256=NWBSB-0GTWa0rHDO2o2KTI
|
|
|
103
103
|
cdk_factory/stack_library/lambda_edge/__init__.py,sha256=ByBJ_CWdc4UtTmFBZH-6pzBMNkjkdtE65AmnB0Fs6lM,156
|
|
104
104
|
cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py,sha256=C_h2Xb2_zaCGiw5otbeSozOLNbxaciMLo8FX_TQOAlw,16409
|
|
105
105
|
cdk_factory/stack_library/load_balancer/__init__.py,sha256=wZpKw2OecLJGdF5mPayCYAEhu2H3c2gJFFIxwXftGDU,52
|
|
106
|
-
cdk_factory/stack_library/load_balancer/load_balancer_stack.py,sha256=
|
|
106
|
+
cdk_factory/stack_library/load_balancer/load_balancer_stack.py,sha256=iiSxjuQOflF6_GLBS1xoK14fK2r47tpaI03EMvmE8V8,30693
|
|
107
107
|
cdk_factory/stack_library/monitoring/__init__.py,sha256=k1G_KDx47Aw0UugaL99PN_TKlyLK4nkJVApCaAK7GJg,153
|
|
108
108
|
cdk_factory/stack_library/monitoring/monitoring_stack.py,sha256=N_1YvEXE7fboH_S3kv_dSKZsufxMuPdFMjGzlNFpuSo,19283
|
|
109
109
|
cdk_factory/stack_library/rds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
110
110
|
cdk_factory/stack_library/rds/rds_stack.py,sha256=5dk_SUMkbnSalD2AKI0c-LrKbaHB4OOgq6DmRa4QMbM,15377
|
|
111
111
|
cdk_factory/stack_library/route53/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
112
|
-
cdk_factory/stack_library/route53/route53_stack.py,sha256=
|
|
112
|
+
cdk_factory/stack_library/route53/route53_stack.py,sha256=4OeJxBTchcXHZznUQ6IIMuFmbsWtOoR0cIfDIIdHs8o,19624
|
|
113
113
|
cdk_factory/stack_library/rum/__init__.py,sha256=gUrWQdzd4rZ2J0YzAQC8PsEGAS7QgyYjB2ZCUKWasy4,90
|
|
114
114
|
cdk_factory/stack_library/rum/rum_stack.py,sha256=c67m0Jbyx8hx9TTx9TBBhZMDqtSK7QCqKx_Ec1t8LgY,14067
|
|
115
115
|
cdk_factory/stack_library/security_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -136,8 +136,8 @@ cdk_factory/utilities/os_execute.py,sha256=5Op0LY_8Y-pUm04y1k8MTpNrmQvcLmQHPQITE
|
|
|
136
136
|
cdk_factory/utils/api_gateway_utilities.py,sha256=If7Xu5s_UxmuV-kL3JkXxPLBdSVUKoLtohm0IUFoiV8,4378
|
|
137
137
|
cdk_factory/validation/config_validator.py,sha256=Pb0TkLiPFzUplBOgMorhRCVm08vEzZhRU5xXCDTa5CA,17602
|
|
138
138
|
cdk_factory/workload/workload_factory.py,sha256=yDI3cRhVI5ELNDcJPLpk9UY54Uind1xQoV3spzT4z7E,6068
|
|
139
|
-
cdk_factory-0.18.
|
|
140
|
-
cdk_factory-0.18.
|
|
141
|
-
cdk_factory-0.18.
|
|
142
|
-
cdk_factory-0.18.
|
|
143
|
-
cdk_factory-0.18.
|
|
139
|
+
cdk_factory-0.18.19.dist-info/METADATA,sha256=EG4aSnWY4A6-_gB8s4Q2EKPtRqhz3p-NjPbUMqcbJ8M,2452
|
|
140
|
+
cdk_factory-0.18.19.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
141
|
+
cdk_factory-0.18.19.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
|
|
142
|
+
cdk_factory-0.18.19.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
|
|
143
|
+
cdk_factory-0.18.19.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|