cdk-factory 0.18.8__py3-none-any.whl → 0.18.10__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.

Files changed (24) hide show
  1. cdk_factory/configurations/deployment.py +12 -0
  2. cdk_factory/configurations/resources/acm.py +9 -2
  3. cdk_factory/configurations/resources/auto_scaling.py +2 -5
  4. cdk_factory/constructs/lambdas/policies/policy_docs.py +1 -1
  5. cdk_factory/interfaces/networked_stack_mixin.py +1 -1
  6. cdk_factory/interfaces/standardized_ssm_mixin.py +12 -10
  7. cdk_factory/stack_library/api_gateway/api_gateway_stack.py +2 -2
  8. cdk_factory/stack_library/auto_scaling/{auto_scaling_stack_standardized.py → auto_scaling_stack.py} +9 -4
  9. cdk_factory/stack_library/cognito/cognito_stack.py +2 -2
  10. cdk_factory/stack_library/dynamodb/dynamodb_stack.py +2 -2
  11. cdk_factory/stack_library/ecs/__init__.py +2 -4
  12. cdk_factory/stack_library/ecs/{ecs_cluster_stack_standardized.py → ecs_cluster_stack.py} +13 -31
  13. cdk_factory/stack_library/load_balancer/load_balancer_stack.py +40 -57
  14. cdk_factory/stack_library/rds/rds_stack.py +2 -2
  15. cdk_factory/stack_library/rum/rum_stack.py +3 -3
  16. cdk_factory/stack_library/vpc/{vpc_stack_standardized.py → vpc_stack.py} +14 -10
  17. cdk_factory/utilities/api_gateway_integration_utility.py +2 -2
  18. cdk_factory/utilities/environment_services.py +2 -2
  19. cdk_factory/version.py +1 -1
  20. {cdk_factory-0.18.8.dist-info → cdk_factory-0.18.10.dist-info}/METADATA +1 -1
  21. {cdk_factory-0.18.8.dist-info → cdk_factory-0.18.10.dist-info}/RECORD +24 -24
  22. {cdk_factory-0.18.8.dist-info → cdk_factory-0.18.10.dist-info}/WHEEL +0 -0
  23. {cdk_factory-0.18.8.dist-info → cdk_factory-0.18.10.dist-info}/entry_points.txt +0 -0
  24. {cdk_factory-0.18.8.dist-info → cdk_factory-0.18.10.dist-info}/licenses/LICENSE +0 -0
@@ -28,6 +28,18 @@ class DeploymentConfig:
28
28
  self.__load()
29
29
 
30
30
  def __load(self):
31
+ # Validate environment consistency
32
+ deployment_env = self.__deployment.get("environment")
33
+ workload_env = self.__workload.get("environment")
34
+
35
+ if deployment_env and workload_env and deployment_env != workload_env:
36
+ from aws_lambda_powertools import Logger
37
+ logger = Logger()
38
+ logger.warning(
39
+ f"Environment mismatch: deployment.environment='{deployment_env}' != workload.environment='{workload_env}'. "
40
+ f"Using workload.environment for consistency."
41
+ )
42
+
31
43
  self.__load_pipeline()
32
44
  self.__load_stacks()
33
45
 
@@ -59,15 +59,22 @@ class AcmConfig:
59
59
  """Certificate transparency logging preference (ENABLED or DISABLED)"""
60
60
  return self.__config.get("certificate_transparency_logging_preference")
61
61
 
62
+ @property
63
+ def ssm(self) -> Dict[str, Any]:
64
+ """SSM configuration for importing/exporting resources"""
65
+ return self.__config.get("ssm", {})
66
+
62
67
  @property
63
68
  def ssm_exports(self) -> Dict[str, str]:
64
69
  """SSM parameter paths to export certificate details"""
65
- exports = self.__config.get("ssm_exports", {})
70
+ exports = self.ssm.get("exports", {})
66
71
 
67
72
  # Provide default SSM export path if not specified
68
73
  if not exports and self.__deployment:
74
+ workload_env = self.__deployment.workload.get("environment", self.__deployment.environment)
75
+ workload_name = self.__deployment.workload.get("name", self.__deployment.workload_name)
69
76
  exports = {
70
- "certificate_arn": f"/{self.__deployment.environment}/{self.__deployment.workload_name}/certificate/arn"
77
+ "certificate_arn": f"/{workload_env}/{workload_name}/certificate/arn"
71
78
  }
72
79
 
73
80
  return exports
@@ -70,12 +70,9 @@ class AutoScalingConfig(EnhancedBaseConfig):
70
70
  return self.__config.get("termination_policies", ["DEFAULT"])
71
71
 
72
72
  @property
73
- def update_policy(self) -> Dict[str, Any]:
73
+ def update_policy(self) -> Optional[Dict[str, Any]]:
74
74
  """Update policy configuration"""
75
- return self.__config.get(
76
- "update_policy",
77
- {"min_instances_in_service": 1, "max_batch_size": 1, "pause_time": 300},
78
- )
75
+ return self.__config.get("update_policy")
79
76
 
80
77
  @property
81
78
  def user_data_commands(self) -> List[str]:
@@ -46,7 +46,7 @@ class ResourceResolver:
46
46
  ssm_config = lambda_dict.get("ssm", {})
47
47
 
48
48
  if ssm_config.get("enabled", False):
49
- self._ssm_mixin.setup_standardized_ssm_integration(
49
+ self._ssm_mixin.setup_ssm_integration(
50
50
  scope=self.scope,
51
51
  config=lambda_dict,
52
52
  resource_type="lambda",
@@ -26,7 +26,7 @@ class NetworkedStackMixin(StandardizedSsmMixin, VPCProviderMixin):
26
26
  # SSM initialization is handled automatically by StandardizedSsmMixin.__init__
27
27
 
28
28
  def _build(self, stack_config, deployment, workload):
29
- self.setup_standardized_ssm_integration(scope=self, config=stack_config.dictionary, resource_type="my-resource", resource_name="my-name")
29
+ self.setup_ssm_integration(scope=self, config=stack_config.dictionary, resource_type="my-resource", resource_name="my-name")
30
30
  self.vpc = self.resolve_vpc(stack_config, deployment, workload)
31
31
  """
32
32
 
@@ -153,7 +153,7 @@ class StandardizedSsmMixin:
153
153
  normalized = normalized.strip('-')
154
154
  return normalized
155
155
 
156
- def setup_standardized_ssm_integration(
156
+ def setup_ssm_integration(
157
157
  self,
158
158
  scope: Construct,
159
159
  config: Any,
@@ -202,7 +202,7 @@ class StandardizedSsmMixin:
202
202
  logger.info(f"SSM imports: {len(self.ssm_config.get('imports', {}))}")
203
203
  logger.info(f"SSM exports: {len(self.ssm_config.get('exports', {}))}")
204
204
 
205
- def process_standardized_ssm_imports(self) -> None:
205
+ def process_ssm_imports(self) -> None:
206
206
  """
207
207
  Process SSM imports using standardized approach.
208
208
 
@@ -230,7 +230,7 @@ class StandardizedSsmMixin:
230
230
  logger.error(error_msg)
231
231
  raise ValueError(error_msg)
232
232
 
233
- def export_standardized_ssm_parameters(self, resource_values: Dict[str, Any]) -> Dict[str, str]:
233
+ def export_ssm_parameters(self, resource_values: Dict[str, Any]) -> Dict[str, str]:
234
234
  """
235
235
  Export SSM parameters using standardized approach.
236
236
 
@@ -338,16 +338,18 @@ class StandardizedSsmMixin:
338
338
  # Prepare template variables
339
339
  variables = {}
340
340
 
341
- if self.deployment:
341
+ # Always prioritize workload environment for consistency
342
+ if self.workload:
343
+ variables["ENVIRONMENT"] = self.workload.dictionary.get("environment", "test")
344
+ variables["WORKLOAD_NAME"] = self.workload.dictionary.get("name", "test-workload")
345
+ variables["AWS_REGION"] = os.getenv("AWS_REGION", "us-east-1")
346
+ elif self.deployment:
347
+ # Fallback to deployment only if workload not available
342
348
  variables["ENVIRONMENT"] = self.deployment.environment
343
349
  variables["WORKLOAD_NAME"] = self.deployment.workload_name
344
350
  variables["AWS_REGION"] = getattr(self.deployment, 'region', None) or os.getenv("AWS_REGION", "us-east-1")
345
- elif self.workload:
346
- variables["ENVIRONMENT"] = getattr(self.workload, 'environment', 'test')
347
- variables["WORKLOAD_NAME"] = getattr(self.workload, 'name', 'test-workload')
348
- variables["AWS_REGION"] = os.getenv("AWS_REGION", "us-east-1")
349
351
  else:
350
- # Fallback to environment variables
352
+ # Final fallback to environment variables
351
353
  variables["ENVIRONMENT"] = os.getenv("ENVIRONMENT", "test")
352
354
  variables["WORKLOAD_NAME"] = os.getenv("WORKLOAD_NAME", "test-workload")
353
355
  variables["AWS_REGION"] = os.getenv("AWS_REGION", "us-east-1")
@@ -398,7 +400,7 @@ class StandardizedSsmMixin:
398
400
  resource_type = segments[3]
399
401
 
400
402
  # Check for valid environment patterns
401
- if environment not in ["dev", "staging", "prod", "test"]:
403
+ if environment not in ["dev", "staging", "prod", "test", "alpha", "beta", "sandbox"]:
402
404
  logger.warning(f"{context}: Unusual environment segment: {environment}")
403
405
 
404
406
  # Check for valid resource type patterns
@@ -744,7 +744,7 @@ class ApiGatewayStack(IStack, StandardizedSsmMixin):
744
744
  # Setup enhanced SSM integration with proper resource type and name
745
745
  api_name = self.api_config.name or "api-gateway"
746
746
 
747
- self.setup_standardized_ssm_integration(
747
+ self.setup_ssm_integration(
748
748
  scope=self,
749
749
  config=self.stack_config.dictionary.get("api_gateway", {}),
750
750
  resource_type="api-gateway",
@@ -775,7 +775,7 @@ class ApiGatewayStack(IStack, StandardizedSsmMixin):
775
775
  resource_values["authorizer_id"] = authorizer.authorizer_id
776
776
 
777
777
  # Use enhanced SSM parameter export
778
- exported_params = self.export_standardized_ssm_parameters(resource_values)
778
+ exported_params = self.export_ssm_parameters(resource_values)
779
779
 
780
780
  if exported_params:
781
781
  logger.info(
@@ -92,7 +92,7 @@ class AutoScalingStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
92
92
  asg_name = deployment.build_resource_name(self.asg_config.name)
93
93
 
94
94
  # Setup standardized SSM integration
95
- self.setup_standardized_ssm_integration(
95
+ self.setup_ssm_integration(
96
96
  scope=self,
97
97
  config=self.asg_config,
98
98
  resource_type="auto_scaling",
@@ -102,7 +102,7 @@ class AutoScalingStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
102
102
  )
103
103
 
104
104
  # Process SSM imports using standardized method
105
- self.process_standardized_ssm_imports()
105
+ self.process_ssm_imports()
106
106
 
107
107
  # Get security groups using standardized approach
108
108
  self.security_groups = self._get_security_groups()
@@ -358,7 +358,11 @@ class AutoScalingStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
358
358
  elif self.asg_config.ami_type.upper() == "AMAZON-LINUX-2":
359
359
  machine_image = ec2.MachineImage.latest_amazon_linux2()
360
360
  elif self.asg_config.ami_type.upper() == "ECS_OPTIMIZED":
361
- machine_image = ec2.MachineImage.latest_amazon_linux2023()
361
+ # Use ECS-optimized AMI from SSM parameter
362
+ from aws_cdk import aws_ssm as ssm
363
+ machine_image = ec2.MachineImage.from_ssm_parameter(
364
+ parameter_name="/aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id"
365
+ )
362
366
  else:
363
367
  # Default to latest Amazon Linux
364
368
  machine_image = ec2.MachineImage.latest_amazon_linux2023()
@@ -483,6 +487,7 @@ class AutoScalingStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
483
487
  update_policy = self.asg_config.update_policy
484
488
 
485
489
  if not update_policy:
490
+ # No update policy configured, don't add one
486
491
  return
487
492
 
488
493
  # Get the underlying CloudFormation resource to add update policy
@@ -519,7 +524,7 @@ class AutoScalingStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
519
524
  }
520
525
 
521
526
  # Export using standardized SSM mixin
522
- exported_params = self.export_standardized_ssm_parameters(resource_values)
527
+ exported_params = self.export_ssm_parameters(resource_values)
523
528
 
524
529
  logger.info(f"Exported SSM parameters: {exported_params}")
525
530
 
@@ -564,7 +564,7 @@ class CognitoStack(IStack, StandardizedSsmMixin):
564
564
  # Setup enhanced SSM integration with proper resource type and name
565
565
  # Use "user-pool" as resource identifier for SSM paths, not the full pool name
566
566
 
567
- self.setup_standardized_ssm_integration(
567
+ self.setup_ssm_integration(
568
568
  scope=self,
569
569
  config=self.stack_config.dictionary.get("cognito", {}),
570
570
  resource_type="cognito",
@@ -591,7 +591,7 @@ class CognitoStack(IStack, StandardizedSsmMixin):
591
591
  # or retrieve via AWS Console/CLI if needed.
592
592
 
593
593
  # Use enhanced SSM parameter export
594
- exported_params = self.export_standardized_ssm_parameters(resource_values)
594
+ exported_params = self.export_ssm_parameters(resource_values)
595
595
 
596
596
  if exported_params:
597
597
  logger.info(f"Exported {len(exported_params)} Cognito parameters to SSM")
@@ -152,7 +152,7 @@ class DynamoDBStack(IStack, StandardizedSsmMixin):
152
152
  # Setup enhanced SSM integration with proper resource type and name
153
153
  # Use "app-table" as resource identifier for SSM paths, not the full table name
154
154
 
155
- self.setup_standardized_ssm_integration(
155
+ self.setup_ssm_integration(
156
156
  scope=self,
157
157
  config=self.stack_config.dictionary.get("dynamodb", {}),
158
158
  resource_type="dynamodb",
@@ -178,7 +178,7 @@ class DynamoDBStack(IStack, StandardizedSsmMixin):
178
178
  resource_values = {k: v for k, v in resource_values.items() if v is not None}
179
179
 
180
180
  # Use enhanced SSM parameter export
181
- exported_params = self.export_standardized_ssm_parameters(resource_values)
181
+ exported_params = self.export_ssm_parameters(resource_values)
182
182
 
183
183
  if exported_params:
184
184
  logger.info(f"Exported {len(exported_params)} DynamoDB parameters to SSM")
@@ -5,10 +5,8 @@ Contains ECS-related stack modules for creating and managing
5
5
  ECS clusters, services, and related resources.
6
6
  """
7
7
 
8
- from .ecs_cluster_stack_standardized import EcsClusterStack
9
- from .ecs_service_stack import EcsServiceStack
8
+ from .ecs_cluster_stack import EcsClusterStack
10
9
 
11
10
  __all__ = [
12
- "EcsClusterStack",
13
- "EcsServiceStack"
11
+ "EcsClusterStack"
14
12
  ]
@@ -86,17 +86,20 @@ class EcsClusterStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
86
86
  # Initialize VPC cache from mixin
87
87
  self._initialize_vpc_cache()
88
88
 
89
- # Load ECS cluster configuration
90
- self.ecs_config: EcsClusterConfig = EcsClusterConfig(
91
- stack_config.dictionary.get("ecs_cluster", {})
92
- )
89
+ # Load ECS cluster configuration with full stack config for SSM access
90
+ ecs_cluster_dict = stack_config.dictionary.get("ecs_cluster", {})
91
+ # Merge SSM config from root level into ECS config for VPC resolution
92
+ if "ssm" in stack_config.dictionary:
93
+ ecs_cluster_dict["ssm"] = stack_config.dictionary["ssm"]
94
+
95
+ self.ecs_config: EcsClusterConfig = EcsClusterConfig(ecs_cluster_dict)
93
96
 
94
97
  cluster_name = deployment.build_resource_name(self.ecs_config.name)
95
98
 
96
99
  logger.info(f"Creating ECS Cluster stack: {cluster_name}")
97
100
 
98
101
  # Setup standardized SSM integration
99
- self.setup_standardized_ssm_integration(
102
+ self.setup_ssm_integration(
100
103
  scope=self,
101
104
  config=self.ecs_config,
102
105
  resource_type="ecs_cluster",
@@ -106,7 +109,7 @@ class EcsClusterStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
106
109
  )
107
110
 
108
111
  # Process SSM imports using standardized method
109
- self.process_standardized_ssm_imports()
112
+ self.process_ssm_imports()
110
113
 
111
114
  # Create the ECS cluster
112
115
  self._create_ecs_cluster()
@@ -167,7 +170,8 @@ class EcsClusterStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
167
170
  """
168
171
  Get VPC using the centralized VPC provider mixin.
169
172
  """
170
- # Use the centralized VPC resolution from VPCProviderMixin
173
+
174
+ # Use the stack_config (not ecs_config) to ensure SSM imports are available
171
175
  return self.resolve_vpc(
172
176
  config=self.ecs_config,
173
177
  deployment=self.deployment,
@@ -302,33 +306,11 @@ class EcsClusterStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
302
306
  logger.info(f" {key}: {value}")
303
307
 
304
308
  try:
305
- exported_params = self.export_standardized_ssm_parameters(resource_values)
309
+ exported_params = self.export_ssm_parameters(resource_values)
306
310
  logger.info(f"Successfully exported SSM parameters: {exported_params}")
307
311
  except Exception as e:
308
312
  logger.error(f"Failed to export SSM parameters: {str(e)}")
309
313
  raise
310
314
 
311
- # Backward compatibility methods
312
- def process_ssm_imports(self, config: Any, deployment: DeploymentConfig, resource_type: str = "resource") -> None:
313
- """Backward compatibility method for existing modules."""
314
- # Extract SSM configuration from old format
315
- if hasattr(config, 'ssm_imports'):
316
- # Convert old ssm_imports format to new format
317
- old_imports = config.ssm_imports
318
- new_imports = {}
319
-
320
- for key, value in old_imports.items():
321
- # Resolve template variables using old method
322
- if isinstance(value, str) and not value.startswith('/'):
323
- value = f"/{deployment.environment}/{deployment.workload_name}/{value}"
324
- new_imports[key] = value
325
-
326
- # Update SSM config
327
- self.ssm_config = {"imports": new_imports}
328
-
329
- # Process imports using standardized method
330
- self.process_standardized_ssm_imports()
331
-
332
-
333
- # Backward compatibility alias
315
+ # Backward compatibility alias
334
316
  EcsClusterStackStandardized = EcsClusterStack
@@ -6,6 +6,8 @@ MIT License. See Project Root for the license information.
6
6
 
7
7
  from typing import Dict, Any, List, Optional
8
8
 
9
+ import base64
10
+ import hashlib
9
11
  import aws_cdk as cdk
10
12
  from aws_cdk import aws_elasticloadbalancingv2 as elbv2
11
13
  from aws_cdk import aws_ec2 as ec2
@@ -50,7 +52,7 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
50
52
  self._hosted_zone = None
51
53
  self._record_names = None
52
54
  # SSM imported values
53
- self.ssm_imported_values: Dict[str, str] = {}
55
+ self._ssm_imported_values: Dict[str, str] = {}
54
56
 
55
57
  def build(
56
58
  self,
@@ -78,7 +80,7 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
78
80
  lb_name = deployment.build_resource_name(self.lb_config.name)
79
81
 
80
82
  # Setup standardized SSM integration
81
- self.setup_standardized_ssm_integration(
83
+ self.setup_ssm_integration(
82
84
  scope=self,
83
85
  config=self.lb_config,
84
86
  resource_type="load_balancer",
@@ -88,7 +90,7 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
88
90
  )
89
91
 
90
92
  # Process SSM imports
91
- self.process_standardized_ssm_imports()
93
+ self.process_ssm_imports()
92
94
 
93
95
  self._prep_dns()
94
96
 
@@ -203,63 +205,13 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
203
205
  )
204
206
  return self._vpc
205
207
 
206
- def _process_ssm_imports(self) -> None:
207
- """
208
- Process SSM imports from configuration.
209
- Follows the same pattern as RDS and Security Group stacks.
210
- """
211
- from aws_cdk import aws_ssm as ssm
212
-
213
- ssm_imports = self.lb_config.ssm_imports
214
-
215
- if not ssm_imports:
216
- logger.debug("No SSM imports configured for Load Balancer")
217
- return
218
-
219
- logger.info(f"Processing {len(ssm_imports)} SSM imports for Load Balancer")
220
-
221
- for param_key, param_value in ssm_imports.items():
222
- try:
223
- # Handle list values (like security_groups)
224
- if isinstance(param_value, list):
225
- imported_list = []
226
- for idx, param_path in enumerate(param_value):
227
- if not param_path.startswith('/'):
228
- param_path = f"/{param_path}"
229
-
230
- construct_id = f"ssm-import-{param_key}-{idx}-{hash(param_path) % 10000}"
231
- param = ssm.StringParameter.from_string_parameter_name(
232
- self, construct_id, param_path
233
- )
234
- imported_list.append(param.string_value)
235
-
236
- self.ssm_imported_values[param_key] = imported_list
237
- logger.info(f"Imported SSM parameter list: {param_key} with {len(imported_list)} items")
238
- else:
239
- # Handle string values
240
- param_path = param_value
241
- if not param_path.startswith('/'):
242
- param_path = f"/{param_path}"
243
-
244
- construct_id = f"ssm-import-{param_key}-{hash(param_path) % 10000}"
245
- param = ssm.StringParameter.from_string_parameter_name(
246
- self, construct_id, param_path
247
- )
248
-
249
- self.ssm_imported_values[param_key] = param.string_value
250
- logger.info(f"Imported SSM parameter: {param_key} from {param_path}")
251
-
252
- except Exception as e:
253
- logger.error(f"Failed to import SSM parameter {param_key}: {e}")
254
- raise
255
-
256
208
  def _get_security_groups(self) -> List[ec2.ISecurityGroup]:
257
209
  """Get security groups for the Load Balancer"""
258
210
  security_groups = []
259
211
 
260
212
  # Check SSM imported values first
261
- if "security_groups" in self.ssm_imported_values:
262
- sg_ids = self.ssm_imported_values["security_groups"]
213
+ if "security_groups" in self._ssm_imported_values:
214
+ sg_ids = self._ssm_imported_values["security_groups"]
263
215
  if not isinstance(sg_ids, list):
264
216
  sg_ids = [sg_ids]
265
217
  else:
@@ -303,6 +255,32 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
303
255
  )
304
256
  return subnets
305
257
 
258
+ def _generate_target_group_name(self, lb_name: str, tg_name: str, max_length: int = 32) -> str:
259
+ """Generate a unique target group name that doesn't begin/end with hyphens"""
260
+ full_name = f"{lb_name}-{tg_name}"
261
+
262
+ if len(full_name) <= max_length:
263
+ # No truncation needed, just ensure no leading/trailing hyphens
264
+ return full_name.strip('-')
265
+
266
+ # Need to truncate - use hash suffix for uniqueness
267
+ # Reserve space for hash (typically 8 chars) and separator
268
+ hash_length = 8
269
+ separator_length = 1
270
+ max_name_length = max_length - hash_length - separator_length
271
+
272
+ # Take the prefix and ensure it doesn't end with hyphen
273
+ prefix = full_name[:max_name_length].rstrip('-')
274
+
275
+ # Generate hash of the full name for uniqueness
276
+ hash_bytes = hashlib.sha256(full_name.encode()).digest()
277
+ hash_suffix = base64.urlsafe_b64encode(hash_bytes).decode()[:hash_length]
278
+
279
+ # Ensure hash doesn't start with hyphen (replace any non-alphanumeric chars)
280
+ hash_suffix = ''.join(c for c in hash_suffix if c.isalnum())[:hash_length]
281
+
282
+ return f"{prefix}-{hash_suffix}"
283
+
306
284
  def _create_target_groups(self, lb_name: str) -> None:
307
285
  """Create target groups for the Load Balancer"""
308
286
 
@@ -310,6 +288,9 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
310
288
  tg_name = tg_config.get("name", f"tg-{idx}")
311
289
  tg_id = f"{lb_name}-{tg_name}"
312
290
 
291
+ # Generate a unique target group name that doesn't begin/end with hyphens
292
+ tg_name_sanitized = self._generate_target_group_name(lb_name, tg_name)
293
+
313
294
  # Configure health check
314
295
  health_check = self._configure_health_check(
315
296
  tg_config.get("health_check", {})
@@ -320,7 +301,7 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
320
301
  target_group = elbv2.ApplicationTargetGroup(
321
302
  self,
322
303
  tg_id,
323
- target_group_name=tg_id[:32], # Ensure name is within AWS limits
304
+ target_group_name=tg_name_sanitized,
324
305
  vpc=self.vpc,
325
306
  port=tg_config.get("port", 80),
326
307
  protocol=elbv2.ApplicationProtocol(
@@ -335,7 +316,7 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
335
316
  target_group = elbv2.NetworkTargetGroup(
336
317
  self,
337
318
  tg_id,
338
- target_group_name=tg_id[:32], # Ensure name is within AWS limits
319
+ target_group_name=tg_name_sanitized,
339
320
  vpc=self.vpc,
340
321
  port=tg_config.get("port", 80),
341
322
  protocol=elbv2.Protocol(tg_config.get("protocol", "TCP")),
@@ -345,6 +326,8 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
345
326
  health_check=health_check,
346
327
  )
347
328
 
329
+
330
+
348
331
  # Store target group for later use
349
332
  self.target_groups[tg_name] = target_group
350
333
 
@@ -70,7 +70,7 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
70
70
  db_name = deployment.build_resource_name(self.rds_config.name)
71
71
 
72
72
  # Setup standardized SSM integration
73
- self.setup_standardized_ssm_integration(
73
+ self.setup_ssm_integration(
74
74
  scope=self,
75
75
  config=self.rds_config,
76
76
  resource_type="rds",
@@ -80,7 +80,7 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
80
80
  )
81
81
 
82
82
  # Process SSM imports
83
- self.process_standardized_ssm_imports()
83
+ self.process_ssm_imports()
84
84
 
85
85
  # Get VPC and security groups
86
86
  self.security_groups = self._get_security_groups()
@@ -72,7 +72,7 @@ class RumStack(IStack, StandardizedSsmMixin):
72
72
  "cognito_identity_pool_id"
73
73
  ] = "/{{ORGANIZATION}}/{{ENVIRONMENT}}/cognito/user-pool/identity-pool-id"
74
74
 
75
- self.setup_standardized_ssm_integration(
75
+ self.setup_ssm_integration(
76
76
  scope=self,
77
77
  config=rum_config,
78
78
  resource_type="rum",
@@ -80,7 +80,7 @@ class RumStack(IStack, StandardizedSsmMixin):
80
80
  )
81
81
 
82
82
  # Process SSM imports using standardized method
83
- self.process_standardized_ssm_imports()
83
+ self.process_ssm_imports()
84
84
 
85
85
  # Import or create Cognito resources
86
86
  identity_pool_id, guest_role_arn = self._setup_cognito_integration()
@@ -341,7 +341,7 @@ class RumStack(IStack, StandardizedSsmMixin):
341
341
  resource_values["user_pool_id"] = self.user_pool.user_pool_id
342
342
 
343
343
  # Use enhanced SSM parameter export
344
- exported_params = self.export_standardized_ssm_parameters(resource_values)
344
+ exported_params = self.export_ssm_parameters(resource_values)
345
345
 
346
346
  if exported_params:
347
347
  logger.info(f"Exported {len(exported_params)} RUM parameters to SSM")
@@ -74,7 +74,7 @@ class VpcStack(IStack, StandardizedSsmMixin):
74
74
  vpc_name = deployment.build_resource_name(self.vpc_config.name)
75
75
 
76
76
  # Setup standardized SSM integration
77
- self.setup_standardized_ssm_integration(
77
+ self.setup_ssm_integration(
78
78
  scope=self,
79
79
  config=self.vpc_config,
80
80
  resource_type="vpc",
@@ -84,7 +84,7 @@ class VpcStack(IStack, StandardizedSsmMixin):
84
84
  )
85
85
 
86
86
  # Process SSM imports using standardized method
87
- self.process_standardized_ssm_imports()
87
+ self.process_ssm_imports()
88
88
 
89
89
  # Import any required resources from SSM
90
90
  imported_resources = self.get_all_ssm_imports()
@@ -245,12 +245,16 @@ class VpcStack(IStack, StandardizedSsmMixin):
245
245
  return
246
246
 
247
247
  # VPC outputs
248
+ # Use workload environment for consistency
249
+ workload_env = self.workload.dictionary.get("environment", self.deployment.environment)
250
+ workload_name = self.workload.dictionary.get("name", self.deployment.workload_name)
251
+
248
252
  cdk.CfnOutput(
249
253
  self,
250
254
  f"{vpc_name}-VpcId",
251
255
  value=self.vpc.vpc_id,
252
256
  description=f"VPC ID for {vpc_name}",
253
- export_name=f"{self.deployment.workload_name}-{self.deployment.environment}-vpc-id",
257
+ export_name=f"{workload_name}-{workload_env}-vpc-id",
254
258
  )
255
259
 
256
260
  # Subnet outputs
@@ -261,7 +265,7 @@ class VpcStack(IStack, StandardizedSsmMixin):
261
265
  f"{vpc_name}-PublicSubnetIds",
262
266
  value=",".join(public_subnet_ids),
263
267
  description=f"Public subnet IDs for {vpc_name}",
264
- export_name=f"{self.deployment.workload_name}-{self.deployment.environment}-public-subnet-ids",
268
+ export_name=f"{workload_name}-{workload_env}-public-subnet-ids",
265
269
  )
266
270
 
267
271
  private_subnet_ids = [subnet.subnet_id for subnet in self.vpc.private_subnets]
@@ -271,7 +275,7 @@ class VpcStack(IStack, StandardizedSsmMixin):
271
275
  f"{vpc_name}-PrivateSubnetIds",
272
276
  value=",".join(private_subnet_ids),
273
277
  description=f"Private subnet IDs for {vpc_name}",
274
- export_name=f"{self.deployment.workload_name}-{self.deployment.environment}-private-subnet-ids",
278
+ export_name=f"{workload_name}-{workload_env}-private-subnet-ids",
275
279
  )
276
280
 
277
281
  isolated_subnet_ids = [subnet.subnet_id for subnet in self.vpc.isolated_subnets]
@@ -281,7 +285,7 @@ class VpcStack(IStack, StandardizedSsmMixin):
281
285
  f"{vpc_name}-IsolatedSubnetIds",
282
286
  value=",".join(isolated_subnet_ids),
283
287
  description=f"Isolated subnet IDs for {vpc_name}",
284
- export_name=f"{self.deployment.workload_name}-{self.deployment.environment}-isolated-subnet-ids",
288
+ export_name=f"{workload_name}-{workload_env}-isolated-subnet-ids",
285
289
  )
286
290
 
287
291
  # Route table outputs - simplified to avoid route table access issues
@@ -327,7 +331,7 @@ class VpcStack(IStack, StandardizedSsmMixin):
327
331
  f"{vpc_name}-InternetGatewayId",
328
332
  value=self.vpc.internet_gateway_id,
329
333
  description=f"Internet Gateway ID for {vpc_name}",
330
- export_name=f"{self.deployment.workload_name}-{self.deployment.environment}-internet-gateway-id",
334
+ export_name=f"{workload_name}-{workload_env}-internet-gateway-id",
331
335
  )
332
336
 
333
337
  # NAT Gateway outputs - simplified to avoid None values
@@ -344,7 +348,7 @@ class VpcStack(IStack, StandardizedSsmMixin):
344
348
  f"{vpc_name}-NatGatewayIds",
345
349
  value=",".join(nat_gateway_ids),
346
350
  description=f"NAT Gateway IDs for {vpc_name}",
347
- export_name=f"{self.deployment.workload_name}-{self.deployment.environment}-nat-gateway-ids",
351
+ export_name=f"{workload_name}-{workload_env}-nat-gateway-ids",
348
352
  )
349
353
 
350
354
  def _export_ssm_parameters(self) -> None:
@@ -399,7 +403,7 @@ class VpcStack(IStack, StandardizedSsmMixin):
399
403
  resource_values["internet_gateway_id"] = self.vpc.internet_gateway_id
400
404
 
401
405
  # Export using standardized SSM mixin
402
- exported_params = self.export_standardized_ssm_parameters(resource_values)
406
+ exported_params = self.export_ssm_parameters(resource_values)
403
407
 
404
408
  logger.info(f"Exported SSM parameters: {exported_params}")
405
409
 
@@ -431,7 +435,7 @@ class VpcStack(IStack, StandardizedSsmMixin):
431
435
  # Backward compatibility methods
432
436
  def auto_export_resources(self, resource_values: Dict[str, Any], context: Dict[str, Any] = None) -> Dict[str, str]:
433
437
  """Backward compatibility method for existing modules."""
434
- return self.export_standardized_ssm_parameters(resource_values)
438
+ return self.export_ssm_parameters(resource_values)
435
439
 
436
440
  def auto_import_resources(self, context: Dict[str, Any] = None) -> Dict[str, Any]:
437
441
  """Backward compatibility method for existing modules."""
@@ -555,7 +555,7 @@ class ApiGatewayIntegrationUtility:
555
555
  api_gateway_config["ssm"]["imports"] = {}
556
556
  api_gateway_config["ssm"]["imports"]["user_pool_arn"] = "/{{ORGANIZATION}}/{{ENVIRONMENT}}/cognito/user-pool/arn"
557
557
 
558
- ssm_mixin.setup_standardized_ssm_integration(
558
+ ssm_mixin.setup_ssm_integration(
559
559
  scope=self.scope,
560
560
  config=api_gateway_config,
561
561
  resource_type="cognito",
@@ -882,7 +882,7 @@ class ApiGatewayIntegrationUtility:
882
882
 
883
883
  # Setup enhanced SSM integration for auto-import
884
884
  # Use consistent resource name for cross-stack compatibility
885
- ssm_mixin.setup_standardized_ssm_integration(
885
+ ssm_mixin.setup_ssm_integration(
886
886
  scope=self.scope,
887
887
  config=api_gateway_config,
888
888
  resource_type="api-gateway",
@@ -173,9 +173,9 @@ class EnvironmentServices:
173
173
  environment = {}
174
174
  # more verbose
175
175
  environment["WORKLOAD_NAME"] = deployment.workload.get("name", "NA")
176
- environment["ENVIRONMENT_NAME"] = deployment.environment
176
+ environment["ENVIRONMENT_NAME"] = deployment.workload.get("environment", deployment.environment)
177
177
  environment["DEPLOYMENT_NAME"] = deployment.name
178
- environment["ENVIRONMENT"] = deployment.environment
178
+ environment["ENVIRONMENT"] = deployment.workload.get("environment", deployment.environment)
179
179
  environment["PIPELINE"] = deployment.pipeline.get("name", "NA")
180
180
  environment["ACCOUNT"] = deployment.account
181
181
  environment["DEPLOYMENT"] = deployment.name
cdk_factory/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.18.8"
1
+ __version__ = "0.18.10"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdk_factory
3
- Version: 0.18.8
3
+ Version: 0.18.10
4
4
  Summary: CDK Factory. A QuickStarter and best practices setup for CDK projects
5
5
  Author-email: Eric Wilson <eric.wilson@geekcafe.com>
6
6
  License: MIT License
@@ -2,12 +2,12 @@ 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=1QsLfVflJ7LDBohVKW240lkDPJ_9R3E_k9Ha2MTVsY4,23
5
+ cdk_factory/version.py,sha256=qs3WrggMVflsO_9pl4SLatLeul5nQn6QxGPPc38-cww,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
9
9
  cdk_factory/configurations/cdk_config.py,sha256=-XOG2MSeMahZbUjWrARAkgU7tqbWsYcnV6a8bt063WM,8913
10
- cdk_factory/configurations/deployment.py,sha256=LO2gd1yv1nqlX_2MIjRXptylFybWiTKsMKZU0N58rSM,12110
10
+ cdk_factory/configurations/deployment.py,sha256=iQwmccdQGw66wRl-CjHfNPpQ_OyqNCMl3G2V7FUYnGE,12684
11
11
  cdk_factory/configurations/deployment_wave.py,sha256=TFX7CYgr5SmLyziEb-R_OTteFWtlMHB4pT53ekV3d1Y,233
12
12
  cdk_factory/configurations/devops.py,sha256=opeMenTgzWCNcrEyFX3SkTUvwFerLyjSd6xipvNVuog,2500
13
13
  cdk_factory/configurations/enhanced_base_config.py,sha256=LQQBn_99n41vkqvpU3NhY_baizCwPz2Di-V3iFBL6oE,6660
@@ -18,10 +18,10 @@ cdk_factory/configurations/pipeline_stage.py,sha256=hEjgaeaHYLRtkok5yBJwZg5zmPMP
18
18
  cdk_factory/configurations/stack.py,sha256=7whhC48dUYw7BBFV49zM1Q3AghTNkaiDfy4kKYDm_RQ,2217
19
19
  cdk_factory/configurations/workload.py,sha256=ht9sgnCn6b-u8eme5bEovwSuy1VMd4uqTZNJzX3v9Zo,9247
20
20
  cdk_factory/configurations/resources/_resources.py,sha256=tnXGn4kEC0JPQaTWB3QpAZG-2hIGBtugHTzuKn1OTvE,2548
21
- cdk_factory/configurations/resources/acm.py,sha256=2TY8VfoVxnDGVdqpd8v8TvQebLYBZ7J9HfaAhMvpRFE,2740
21
+ cdk_factory/configurations/resources/acm.py,sha256=HsHwiH15p0zTqRGDErn35kBEa3rkaRWTDJzVequR9oY,3062
22
22
  cdk_factory/configurations/resources/api_gateway.py,sha256=-k4hMGszIdQLb5DGmWBIPy49YGutp8zczafRh-Vob0I,4904
23
23
  cdk_factory/configurations/resources/apigateway_route_config.py,sha256=6ytn_nwKwlfpBtHL5sV6gxMpgAJ3p6QFGumMoW4CTHM,2351
24
- cdk_factory/configurations/resources/auto_scaling.py,sha256=-3CSmhWhkU9RkQb6yELoK_OES2UqLNQDxtVPFpZNCsA,6098
24
+ cdk_factory/configurations/resources/auto_scaling.py,sha256=jga8qmNY_Ctk5CWY43Bz_gMEFvN6rwKLkyAl9d5d-ko,6000
25
25
  cdk_factory/configurations/resources/cloudfront.py,sha256=YU4my1sQjLnf4DNBECS4GvPAxUG2FX_BszfO76mSbYw,3959
26
26
  cdk_factory/configurations/resources/cloudwatch_widget.py,sha256=EdEQSXUkDtoY_Mg_cJBWo1Hp84jSiK7U9tsd3k1VhKI,1271
27
27
  cdk_factory/configurations/resources/code_artifact.py,sha256=P2X2i6NEcePitEf2wkN6lFTjIbXasn0uzrlPOT0tEac,3253
@@ -57,7 +57,7 @@ cdk_factory/constructs/ecr/ecr_construct.py,sha256=jEimLwLvO5ERuFEn_L2q2pyPKgkdH
57
57
  cdk_factory/constructs/lambdas/lambda_function_construct.py,sha256=SQ5SEXn4kezVAzXuv_A_JB3o_svyBXOMi-htvfB9HQs,4516
58
58
  cdk_factory/constructs/lambdas/lambda_function_docker_construct.py,sha256=O8aiHpNQ59eE3qEttEHVxbvp06v4byXOeYCVTAOI_Cg,9993
59
59
  cdk_factory/constructs/lambdas/lambda_function_role_construct.py,sha256=nJoxKv-4CWugX-ZkAzoG8wrfSsHqXqiMZnGRqSyS4Po,1453
60
- cdk_factory/constructs/lambdas/policies/policy_docs.py,sha256=yVySM3QmY8xTIvR8d1O4f8Lyd43CPLknK8R874eXlxc,21138
60
+ cdk_factory/constructs/lambdas/policies/policy_docs.py,sha256=Zk6qJLnzu2dm9wt2-VF5xYzIwXtRJAa1hYDaDo-G1MI,21125
61
61
  cdk_factory/constructs/lambdas/policies/policy_statements.py,sha256=9DnSehsV8A_sBrSe4A--PQB6kii2HSnW4RnmhgVfon0,4164
62
62
  cdk_factory/constructs/s3_buckets/s3_bucket_construct.py,sha256=5DK5aVUAveJYBjmPby2lg55r1FQMduLMJSQ4N58rwmc,3252
63
63
  cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py,sha256=H-EJ2Q71LI5FPQ9thMkXDGRuwJdFc_2OzGIrWA98lxg,2517
@@ -65,8 +65,8 @@ cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py,sha2
65
65
  cdk_factory/constructs/sqs/policies/sqs_policies.py,sha256=4p0G8G-fqNKSr68I55fvqH-DkhIeXyGaFBKkICIJ-qM,1277
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
- cdk_factory/interfaces/networked_stack_mixin.py,sha256=69pJp4IE1n_tdHh2UZQ08O6ZW-v5P4uJJ_fleNaj6Nw,2897
69
- cdk_factory/interfaces/standardized_ssm_mixin.py,sha256=O9d0LQY3r9hP4onE8g1448BNnR899L3hDqIFO1rWWMI,24238
68
+ cdk_factory/interfaces/networked_stack_mixin.py,sha256=CtWT7Nhy73f0goQQG02jG7lsEucq5OrtZ0ltrp7XTFA,2884
69
+ cdk_factory/interfaces/standardized_ssm_mixin.py,sha256=Vzry6QWOYCJf5ZZeAJM9QKwj1L3-JWG9SUzB4Tsi1HM,24378
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
@@ -84,50 +84,50 @@ cdk_factory/stack_library/__init__.py,sha256=_v4kz9EYAjox6strrTK_4fb9GloJ2Kyhf63
84
84
  cdk_factory/stack_library/stack_base.py,sha256=Cu3qeqPQf33QaaXoxk_EaziNCIXcyspOo5AU3eX_wyM,5140
85
85
  cdk_factory/stack_library/acm/__init__.py,sha256=4FNRLykblcKZvq_wieYwvv9N_jgrZnJ7ECH9xKh-0Ls,81
86
86
  cdk_factory/stack_library/acm/acm_stack.py,sha256=QJ3GkT17PmWoGkfO5Um02hvrfyJ9HbiPMnclwDP7IbA,5846
87
- cdk_factory/stack_library/api_gateway/api_gateway_stack.py,sha256=_wbPBsgh7FHq9cnL44CiuffBj3XCO5ErQx_yclxFsVY,39669
87
+ cdk_factory/stack_library/api_gateway/api_gateway_stack.py,sha256=PvLdGvcopGpLP0FwpfUcfXNiTIfYLTXqrG-TniE38yc,39643
88
88
  cdk_factory/stack_library/auto_scaling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
- cdk_factory/stack_library/auto_scaling/auto_scaling_stack_standardized.py,sha256=X167Tj43TEIcacI9ZuOFWqyN3XlVcm_difLx0qE1Kvk,21743
89
+ cdk_factory/stack_library/auto_scaling/auto_scaling_stack.py,sha256=6QDVkv6Zz-qCbT6h2MU9Sp1diFXDEyjJNk1-xWMbMJg,21990
90
90
  cdk_factory/stack_library/aws_lambdas/lambda_stack.py,sha256=SFbBPvvCopbyiuYtq-O5sQkFCf94Wzua6aDUXiFDSB4,26161
91
91
  cdk_factory/stack_library/buckets/README.md,sha256=XkK3UNVtRLE7NtUvbhCOBBYUYi8hlrrSaI1s3GJVrqI,78
92
92
  cdk_factory/stack_library/buckets/bucket_stack.py,sha256=SLoZqSffAqmeBBEVUQg54D_8Ad5UKdkjEAmKAVgAqQo,1778
93
93
  cdk_factory/stack_library/cloudfront/__init__.py,sha256=Zfx50q4xIJ4ZEoVIzUBDTKbRE9DKDM6iyVIFhtQXvww,153
94
94
  cdk_factory/stack_library/cloudfront/cloudfront_stack.py,sha256=kBMWxHlB48aRcFGIX71mRso0tEuEaQxcTBr3YCJOr4s,30210
95
95
  cdk_factory/stack_library/code_artifact/code_artifact_stack.py,sha256=k831b_fAFoXSiwj5cencnCQzUSeuKIUyVCp6Ev_TMgI,6274
96
- cdk_factory/stack_library/cognito/cognito_stack.py,sha256=7l4fjmOwDmDWnewa1BD3gOwWcIG-dM_ajiAuv0xWMUw,25353
97
- cdk_factory/stack_library/dynamodb/dynamodb_stack.py,sha256=3_8lQP91GnBY77-61mtnUV0GTtBMrdwNLU927KfFc90,6769
96
+ cdk_factory/stack_library/cognito/cognito_stack.py,sha256=3tjKCNcIwXZn7fd4EDQdY6H9m6CnZohI4uTQ4TpacRQ,25327
97
+ cdk_factory/stack_library/dynamodb/dynamodb_stack.py,sha256=-_Ij1zXIxUuZIWgdevam_1vD3LEJ6pFs9U0hmw0KwIw,6743
98
98
  cdk_factory/stack_library/ecr/README.md,sha256=xw2wPx9WN03Y4BBwqvbi9lAFGNyaD1FUNpqxVJX14Oo,179
99
99
  cdk_factory/stack_library/ecr/ecr_stack.py,sha256=KLbd5WN5-ZiojsS5wJ4PX-tIL0cCylCSvXjO6sVrgWY,2102
100
- cdk_factory/stack_library/ecs/__init__.py,sha256=ebM8vVboNBplK0ua6bMSpNjewcFFkdvJ5wvVYEL1ONQ,302
101
- cdk_factory/stack_library/ecs/ecs_cluster_stack_standardized.py,sha256=-NK1U9vCFad8CcW6dOTguQgr0IBL_bhtg5cxyU2MR6U,12832
100
+ cdk_factory/stack_library/ecs/__init__.py,sha256=o5vGDtD_h-gVXb3-Ysr8xUNpEcMsnmMVgZv2Pupcdow,219
101
+ cdk_factory/stack_library/ecs/ecs_cluster_stack.py,sha256=sAPTLU5CAwMoLTW_pNy_cd0OtVkfDR7IxxsSq5AE0yo,12091
102
102
  cdk_factory/stack_library/ecs/ecs_service_stack.py,sha256=3en447kWBOqd0d_i2C8mRRBscO2GqN9-B2l_PW7kZuM,27409
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=ft5AxHy8__F90ZYDaoJwTjACGIfrn2Sd9Zr2CdHO7GE,16398
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=cQn1r8uyrxErNifIzd8GH0SgGIdpzFwiH7tlGaG-gus,30851
106
+ cdk_factory/stack_library/load_balancer/load_balancer_stack.py,sha256=o0sxQIayyvOVBIiBrNpY5GvENqnWiYQ16_rn2CGA6yk,29900
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
- cdk_factory/stack_library/rds/rds_stack.py,sha256=lgPtTHdHCRsUBkdTrCQ_-fdZB6Ymrnlei5LSRDHs808,15403
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
112
  cdk_factory/stack_library/route53/route53_stack.py,sha256=mPUJta6maUNlkXup7xKsqq7gefsRI1w_ulInE29wJs4,8387
113
113
  cdk_factory/stack_library/rum/__init__.py,sha256=gUrWQdzd4rZ2J0YzAQC8PsEGAS7QgyYjB2ZCUKWasy4,90
114
- cdk_factory/stack_library/rum/rum_stack.py,sha256=BEXsx_PsZOu2dR3Pmv1_flY51uRIeHP5l5rj96bOgPQ,14106
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
116
116
  cdk_factory/stack_library/security_group/security_group_full_stack.py,sha256=yvZ5QS9eDj_LkkwHY_Pcb37lOVPbGMfSdizZa1X6BEI,13561
117
117
  cdk_factory/stack_library/security_group/security_group_stack.py,sha256=Zv9FCEHvSBT1cM9bXOtyIUFwhRHKCSTgvaqOyhGj0wg,14456
118
118
  cdk_factory/stack_library/simple_queue_service/sqs_stack.py,sha256=jJksWrvrvgZUMM01RZ317DOIxqIJbkYYSYu38w0jHpc,6039
119
119
  cdk_factory/stack_library/vpc/__init__.py,sha256=7pIqP97Gf2AJbv9Ebp1WbQGHYhgEbWJ52L1MzeXBybA,42
120
- cdk_factory/stack_library/vpc/vpc_stack_standardized.py,sha256=aifwTPGbWoDsWBlsBkCIdsvz29blm4gaHMKxh4g1M2E,19441
120
+ cdk_factory/stack_library/vpc/vpc_stack.py,sha256=AUq5oAJa1OrtUIqPZlnco0jSBOyOQvV3tEspIe2ZAGc,19451
121
121
  cdk_factory/stack_library/websites/static_website_stack.py,sha256=jnB-u6x37w2tsheG7WrKBY50WIx1AnCKoVh7mbT4rZU,11254
122
122
  cdk_factory/stages/websites/static_website_stage.py,sha256=X4fpKXkhb0zIbSHx3QyddBhVSLBryb1vf1Cg2fMTqog,755
123
123
  cdk_factory/templates/README.md,sha256=ATBEjG6beYvbEAdLtZ_8xnxgFD5X0cgZoI_6pToqH90,2679
124
124
  cdk_factory/templates/app.py.template,sha256=aM60x0nNV80idtCL8jm1EddY63F5tDITYOlavg-BPMU,1069
125
125
  cdk_factory/templates/cdk.json.template,sha256=SuGz4Y6kCVMDRpJrA_AJlp0kwdENiJPVngIv1xP5bwI,3526
126
- cdk_factory/utilities/api_gateway_integration_utility.py,sha256=Kq4PC5fkVRFN9oSR2F2TLynzFunhhbeVDJhciJhtbPA,64236
126
+ cdk_factory/utilities/api_gateway_integration_utility.py,sha256=xw7qL8lKe7bYS2Kobgv-buy_PI5PunouH4XqcYWKRag,64210
127
127
  cdk_factory/utilities/commandline_args.py,sha256=0FiNEJFbWVN8Ct7r0VHnJEx7rhUlaRKT7R7HMNJBSTI,2216
128
128
  cdk_factory/utilities/configuration_loader.py,sha256=z0ZdGLNbTO4_yfluB9zUh_i_Poc9qj-7oRyjMRlNkN8,1522
129
129
  cdk_factory/utilities/docker_utilities.py,sha256=6ee9KEGsaRJWo6FqvdPtE3_L2Emp3Lc0vu2Ie3VoflI,8280
130
- cdk_factory/utilities/environment_services.py,sha256=Fb-RF1G8DgD5MCZ8LoFAve3QM9tEled_G6fv2JksPkc,9699
130
+ cdk_factory/utilities/environment_services.py,sha256=CTuF7MvpGfvuRouS3q-WZIyjALD5E7xr96HXgIawl90,9779
131
131
  cdk_factory/utilities/file_operations.py,sha256=fxqT0iyYZkb46lQr_XXadhFTca_1neVW0VRVkbyMmhA,9462
132
132
  cdk_factory/utilities/git_utilities.py,sha256=7Xac8PaThc7Lmk5jtDBHaJOj-fWRT017cgZmgXkVizM,3155
133
133
  cdk_factory/utilities/json_loading_utility.py,sha256=i6C1GJ1HhbTBJRmNP8nEM6OeMZYjE9_eaVL78HHLYSE,10818
@@ -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.8.dist-info/METADATA,sha256=iigCpCmt_s9_3YcxkHIsbKsb6SNeilg_BwFQuYIA7xU,2451
140
- cdk_factory-0.18.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
141
- cdk_factory-0.18.8.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
142
- cdk_factory-0.18.8.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
143
- cdk_factory-0.18.8.dist-info/RECORD,,
139
+ cdk_factory-0.18.10.dist-info/METADATA,sha256=VIh1LSd1zEokrgEhi9243N0wROwo39SexSu5oJV8pHI,2452
140
+ cdk_factory-0.18.10.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
141
+ cdk_factory-0.18.10.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
142
+ cdk_factory-0.18.10.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
143
+ cdk_factory-0.18.10.dist-info/RECORD,,