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

@@ -0,0 +1,78 @@
1
+ """
2
+ AcmConfig - supports ACM (AWS Certificate Manager) settings for AWS CDK.
3
+ Maintainers: Eric Wilson
4
+ MIT License. See Project Root for license information.
5
+ """
6
+
7
+ from typing import Any, Dict, List, Optional
8
+
9
+
10
+ class AcmConfig:
11
+ """
12
+ ACM Configuration - supports AWS Certificate Manager settings.
13
+ Each property reads from the config dict and provides a sensible default if not set.
14
+ """
15
+
16
+ def __init__(self, config: dict = None, deployment=None) -> None:
17
+ self.__config = config or {}
18
+ self.__deployment = deployment
19
+
20
+ @property
21
+ def name(self) -> str:
22
+ """Certificate configuration name"""
23
+ return self.__config.get("name", "certificate")
24
+
25
+ @property
26
+ def domain_name(self) -> str:
27
+ """Primary domain name for the certificate"""
28
+ domain = self.__config.get("domain_name")
29
+ if not domain:
30
+ raise ValueError("domain_name is required for ACM certificate")
31
+ return domain
32
+
33
+ @property
34
+ def subject_alternative_names(self) -> List[str]:
35
+ """Subject alternative names (SANs) for the certificate"""
36
+ sans = self.__config.get("subject_alternative_names", [])
37
+ # Also check for alternate_names for backward compatibility
38
+ if not sans:
39
+ sans = self.__config.get("alternate_names", [])
40
+ return sans
41
+
42
+ @property
43
+ def hosted_zone_id(self) -> Optional[str]:
44
+ """Route53 hosted zone ID for DNS validation"""
45
+ return self.__config.get("hosted_zone_id")
46
+
47
+ @property
48
+ def hosted_zone_name(self) -> Optional[str]:
49
+ """Route53 hosted zone name (used for looking up zone)"""
50
+ return self.__config.get("hosted_zone_name")
51
+
52
+ @property
53
+ def validation_method(self) -> str:
54
+ """Certificate validation method (DNS or EMAIL)"""
55
+ return self.__config.get("validation_method", "DNS")
56
+
57
+ @property
58
+ def certificate_transparency_logging_preference(self) -> Optional[str]:
59
+ """Certificate transparency logging preference (ENABLED or DISABLED)"""
60
+ return self.__config.get("certificate_transparency_logging_preference")
61
+
62
+ @property
63
+ def ssm_exports(self) -> Dict[str, str]:
64
+ """SSM parameter paths to export certificate details"""
65
+ exports = self.__config.get("ssm_exports", {})
66
+
67
+ # Provide default SSM export path if not specified
68
+ if not exports and self.__deployment:
69
+ exports = {
70
+ "certificate_arn": f"/{self.__deployment.environment}/{self.__deployment.workload_name}/certificate/arn"
71
+ }
72
+
73
+ return exports
74
+
75
+ @property
76
+ def tags(self) -> Dict[str, str]:
77
+ """Tags to apply to the certificate"""
78
+ return self.__config.get("tags", {})
@@ -151,3 +151,17 @@ class LoadBalancerConfig(EnhancedBaseConfig):
151
151
  if "ssm" in self.__config and "imports" in self.__config["ssm"]:
152
152
  return self.__config["ssm"]["imports"]
153
153
  return self.__config.get("ssm_imports", {})
154
+
155
+ @property
156
+ def ssm_exports(self) -> Dict[str, Any]:
157
+ """SSM parameter exports for the Load Balancer"""
158
+ # Check both nested and flat structures for backwards compatibility
159
+ if "ssm" in self.__config and "exports" in self.__config["ssm"]:
160
+ return self.__config["ssm"]["exports"]
161
+ return self.__config.get("ssm_exports", {})
162
+
163
+ @property
164
+ def ssm_parameters(self) -> Dict[str, Any]:
165
+ """SSM parameters for the Load Balancer (only exports, not imports)"""
166
+ # For LoadBalancer, only return exports to prevent trying to export imported values
167
+ return self.ssm_exports
@@ -0,0 +1,6 @@
1
+ """
2
+ ACM Stack Module
3
+ """
4
+ from .acm_stack import AcmStack
5
+
6
+ __all__ = ["AcmStack"]
@@ -0,0 +1,169 @@
1
+ """
2
+ ACM (AWS Certificate Manager) Stack Pattern for CDK-Factory
3
+ Maintainers: Eric Wilson
4
+ MIT License. See Project Root for the license information.
5
+ """
6
+
7
+ from typing import Dict, Any, List, Optional
8
+
9
+ import aws_cdk as cdk
10
+ from aws_cdk import aws_certificatemanager as acm
11
+ from aws_cdk import aws_route53 as route53
12
+ from aws_lambda_powertools import Logger
13
+ from constructs import Construct
14
+
15
+ from cdk_factory.configurations.deployment import DeploymentConfig
16
+ from cdk_factory.configurations.stack import StackConfig
17
+ from cdk_factory.configurations.resources.acm import AcmConfig
18
+ from cdk_factory.interfaces.istack import IStack
19
+ from cdk_factory.interfaces.enhanced_ssm_parameter_mixin import EnhancedSsmParameterMixin
20
+ from cdk_factory.stack.stack_module_registry import register_stack
21
+ from cdk_factory.workload.workload_factory import WorkloadConfig
22
+
23
+ logger = Logger(service="AcmStack")
24
+
25
+
26
+ @register_stack("acm_stack")
27
+ @register_stack("certificate_stack")
28
+ class AcmStack(IStack, EnhancedSsmParameterMixin):
29
+ """
30
+ Reusable stack for AWS Certificate Manager.
31
+ Supports creating ACM certificates with DNS validation via Route53.
32
+ """
33
+
34
+ def __init__(self, scope: Construct, id: str, **kwargs) -> None:
35
+ super().__init__(scope, id, **kwargs)
36
+ self.acm_config = None
37
+ self.stack_config = None
38
+ self.deployment = None
39
+ self.workload = None
40
+ self.certificate = None
41
+ self.hosted_zone = None
42
+
43
+ def build(
44
+ self,
45
+ stack_config: StackConfig,
46
+ deployment: DeploymentConfig,
47
+ workload: WorkloadConfig,
48
+ ) -> None:
49
+ """Build the ACM Certificate stack"""
50
+ self._build(stack_config, deployment, workload)
51
+
52
+ def _build(
53
+ self,
54
+ stack_config: StackConfig,
55
+ deployment: DeploymentConfig,
56
+ workload: WorkloadConfig,
57
+ ) -> None:
58
+ """Internal build method for the ACM Certificate stack"""
59
+ self.stack_config = stack_config
60
+ self.deployment = deployment
61
+ self.workload = workload
62
+ self.acm_config = AcmConfig(
63
+ stack_config.dictionary.get("certificate", {}), deployment
64
+ )
65
+
66
+ cert_name = deployment.build_resource_name(self.acm_config.name)
67
+
68
+ # Get or import hosted zone for DNS validation
69
+ if self.acm_config.hosted_zone_id:
70
+ self.hosted_zone = self._get_hosted_zone()
71
+
72
+ # Create the certificate
73
+ self.certificate = self._create_certificate(cert_name)
74
+
75
+ # Export certificate ARN to SSM
76
+ self._export_certificate_arn(cert_name)
77
+
78
+ # Add outputs
79
+ self._add_outputs(cert_name)
80
+
81
+ def _get_hosted_zone(self) -> route53.IHostedZone:
82
+ """Get the Route53 hosted zone for DNS validation"""
83
+ if self.acm_config.hosted_zone_id:
84
+ return route53.HostedZone.from_hosted_zone_attributes(
85
+ self,
86
+ "HostedZone",
87
+ hosted_zone_id=self.acm_config.hosted_zone_id,
88
+ zone_name=self.acm_config.domain_name,
89
+ )
90
+ else:
91
+ raise ValueError(
92
+ "hosted_zone_id is required for DNS validation. "
93
+ "Provide it in the certificate configuration."
94
+ )
95
+
96
+ def _create_certificate(self, cert_name: str) -> acm.Certificate:
97
+ """Create an ACM certificate with DNS validation"""
98
+
99
+ # Prepare certificate properties
100
+ cert_props = {
101
+ "domain_name": self.acm_config.domain_name,
102
+ }
103
+
104
+ # Add DNS validation if hosted zone is available
105
+ if self.hosted_zone:
106
+ cert_props["validation"] = acm.CertificateValidation.from_dns(
107
+ self.hosted_zone
108
+ )
109
+
110
+ # Add subject alternative names if provided
111
+ if self.acm_config.subject_alternative_names:
112
+ cert_props["subject_alternative_names"] = (
113
+ self.acm_config.subject_alternative_names
114
+ )
115
+
116
+ certificate = acm.Certificate(
117
+ self,
118
+ cert_name,
119
+ **cert_props
120
+ )
121
+
122
+ # Add tags
123
+ for key, value in self.acm_config.tags.items():
124
+ cdk.Tags.of(certificate).add(key, value)
125
+
126
+ logger.info(f"Created certificate for domain: {self.acm_config.domain_name}")
127
+
128
+ return certificate
129
+
130
+ def _export_certificate_arn(self, cert_name: str) -> None:
131
+ """Export certificate ARN to SSM Parameter Store"""
132
+ ssm_exports = self.acm_config.ssm_exports
133
+
134
+ if not ssm_exports:
135
+ logger.debug("No SSM exports configured for certificate")
136
+ return
137
+
138
+ # Export certificate ARN
139
+ if "certificate_arn" in ssm_exports:
140
+ param_name = ssm_exports["certificate_arn"]
141
+ if not param_name.startswith("/"):
142
+ param_name = f"/{param_name}"
143
+
144
+ self.export_ssm_parameter(
145
+ scope=self,
146
+ id=f"{cert_name}-cert-arn-param",
147
+ value=self.certificate.certificate_arn,
148
+ parameter_name=param_name,
149
+ description=f"Certificate ARN for {self.acm_config.domain_name}",
150
+ )
151
+ logger.info(f"Exported certificate ARN to SSM: {param_name}")
152
+
153
+ def _add_outputs(self, cert_name: str) -> None:
154
+ """Add CloudFormation outputs"""
155
+ cdk.CfnOutput(
156
+ self,
157
+ "CertificateArn",
158
+ value=self.certificate.certificate_arn,
159
+ description=f"Certificate ARN for {self.acm_config.domain_name}",
160
+ export_name=f"{cert_name}-arn",
161
+ )
162
+
163
+ cdk.CfnOutput(
164
+ self,
165
+ "DomainName",
166
+ value=self.acm_config.domain_name,
167
+ description="Primary domain name for the certificate",
168
+ export_name=f"{cert_name}-domain",
169
+ )
@@ -112,34 +112,46 @@ class LoadBalancerStack(IStack, EnhancedSsmParameterMixin):
112
112
  # Get subnets
113
113
  subnets = self._get_subnets()
114
114
 
115
+ # Prepare vpc_subnets parameter
116
+ # If subnets is None, we'll handle it via escape hatch after creation
117
+ vpc_subnets_param = ec2.SubnetSelection(subnets=subnets) if subnets else None
118
+
115
119
  # Create the Load Balancer based on type
116
120
  if self.lb_config.type == "APPLICATION":
117
- load_balancer = elbv2.ApplicationLoadBalancer(
118
- self,
119
- lb_name,
120
- load_balancer_name=lb_name,
121
- vpc=self.vpc,
122
- internet_facing=self.lb_config.internet_facing,
123
- security_group=(
121
+ # When vpc_subnets is None and we have token-based subnet_ids,
122
+ # we need to create the ALB without vpc_subnets to avoid VPC subnet lookup errors
123
+ alb_props = {
124
+ "load_balancer_name": lb_name,
125
+ "vpc": self.vpc,
126
+ "internet_facing": self.lb_config.internet_facing,
127
+ "security_group": (
124
128
  security_groups[0]
125
129
  if security_groups and len(security_groups) > 0
126
130
  else None
127
131
  ),
128
- deletion_protection=self.lb_config.deletion_protection,
129
- idle_timeout=cdk.Duration.seconds(self.lb_config.idle_timeout),
130
- http2_enabled=self.lb_config.http2_enabled,
131
- vpc_subnets=ec2.SubnetSelection(subnets=subnets) if subnets else None,
132
- )
132
+ "deletion_protection": self.lb_config.deletion_protection,
133
+ "idle_timeout": cdk.Duration.seconds(self.lb_config.idle_timeout),
134
+ "http2_enabled": self.lb_config.http2_enabled,
135
+ }
136
+
137
+ # Only add vpc_subnets if we have concrete subnet objects
138
+ if vpc_subnets_param:
139
+ alb_props["vpc_subnets"] = vpc_subnets_param
140
+
141
+ load_balancer = elbv2.ApplicationLoadBalancer(self, lb_name, **alb_props)
133
142
  else: # NETWORK
134
- load_balancer = elbv2.NetworkLoadBalancer(
135
- self,
136
- lb_name,
137
- load_balancer_name=lb_name,
138
- vpc=self.vpc,
139
- internet_facing=self.lb_config.internet_facing,
140
- deletion_protection=self.lb_config.deletion_protection,
141
- vpc_subnets=ec2.SubnetSelection(subnets=subnets) if subnets else None,
142
- )
143
+ nlb_props = {
144
+ "load_balancer_name": lb_name,
145
+ "vpc": self.vpc,
146
+ "internet_facing": self.lb_config.internet_facing,
147
+ "deletion_protection": self.lb_config.deletion_protection,
148
+ }
149
+
150
+ # Only add vpc_subnets if we have concrete subnet objects
151
+ if vpc_subnets_param:
152
+ nlb_props["vpc_subnets"] = vpc_subnets_param
153
+
154
+ load_balancer = elbv2.NetworkLoadBalancer(self, lb_name, **nlb_props)
143
155
 
144
156
  # If subnets is None, check if we have SSM-imported subnet_ids as a token
145
157
  # We need to use Fn.Split to convert the comma-separated string to an array
@@ -173,9 +185,16 @@ class LoadBalancerStack(IStack, EnhancedSsmParameterMixin):
173
185
  # Build VPC attributes
174
186
  vpc_attrs = {
175
187
  "vpc_id": vpc_id,
176
- "availability_zones": ["us-east-1a", "us-east-1b"]
188
+ "availability_zones": ["us-east-1a", "us-east-1b"],
177
189
  }
178
190
 
191
+ # If we have subnet_ids from SSM, provide dummy public subnets
192
+ # The actual subnets will be set via CloudFormation escape hatch
193
+ if "subnet_ids" in self.ssm_imported_values:
194
+ # Provide dummy subnet IDs - these will be overridden by the escape hatch
195
+ # We need at least one dummy subnet per AZ to satisfy CDK's validation
196
+ vpc_attrs["public_subnet_ids"] = ["subnet-dummy1", "subnet-dummy2"]
197
+
179
198
  # Use from_vpc_attributes() instead of from_lookup() because SSM imports return tokens
180
199
  self._vpc = ec2.Vpc.from_vpc_attributes(self, "VPC", **vpc_attrs)
181
200
  elif self.lb_config.vpc_id:
@@ -428,8 +447,19 @@ class LoadBalancerStack(IStack, EnhancedSsmParameterMixin):
428
447
  def _get_certificates(self) -> List[elbv2.ListenerCertificate]:
429
448
  """Get certificates for HTTPS listeners"""
430
449
  certificates = []
431
- for cert_arn in self.lb_config.certificate_arns:
432
- certificates.append(elbv2.ListenerCertificate.from_arn(cert_arn))
450
+
451
+ # Check SSM imported values first (takes priority)
452
+ if "certificate_arns" in self.ssm_imported_values:
453
+ cert_arns = self.ssm_imported_values["certificate_arns"]
454
+ if not isinstance(cert_arns, list):
455
+ cert_arns = [cert_arns]
456
+ for cert_arn in cert_arns:
457
+ certificates.append(elbv2.ListenerCertificate.from_arn(cert_arn))
458
+ logger.info(f"Using {len(cert_arns)} certificate(s) from SSM")
459
+ else:
460
+ # Fall back to config values
461
+ for cert_arn in self.lb_config.certificate_arns:
462
+ certificates.append(elbv2.ListenerCertificate.from_arn(cert_arn))
433
463
 
434
464
  if self.ssl_certificate:
435
465
  certificates.append(
@@ -58,8 +58,13 @@ class Route53Stack(IStack, EnhancedSsmParameterMixin):
58
58
  # Get or create hosted zone
59
59
  self.hosted_zone = self._get_or_create_hosted_zone()
60
60
 
61
- # Create certificate if needed
61
+ # Create certificate if needed (DEPRECATED - use dedicated ACM stack)
62
62
  if self.route53_config.create_certificate:
63
+ logger.warning(
64
+ "Creating certificates in Route53Stack is deprecated. "
65
+ "Please use the dedicated 'acm_stack' module for certificate management. "
66
+ "This feature will be maintained for backward compatibility."
67
+ )
63
68
  self.certificate = self._create_certificate()
64
69
 
65
70
  # Create DNS records
cdk_factory/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.15.22"
1
+ __version__ = "0.16.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdk_factory
3
- Version: 0.15.22
3
+ Version: 0.16.3
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,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=shv1DnYQStFbMP5tTfMYOU43hXngTdA0D45wB2TtIY4,24
5
+ cdk_factory/version.py,sha256=VI_bTBU6ZbRZpVhA2ix956hkRwHW57V59GEZJkhU-vc,23
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=JKjhNsy0RCUZy1s8n5D_aXXI-upR9izaLtCTfKYiV9k,9624
@@ -18,6 +18,7 @@ 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=sM-B6UKOdOn5_H-eWmW03J9oa8YZZmO0bvQ69wbCM0Q,7756
20
20
  cdk_factory/configurations/resources/_resources.py,sha256=tnXGn4kEC0JPQaTWB3QpAZG-2hIGBtugHTzuKn1OTvE,2548
21
+ cdk_factory/configurations/resources/acm.py,sha256=2TY8VfoVxnDGVdqpd8v8TvQebLYBZ7J9HfaAhMvpRFE,2740
21
22
  cdk_factory/configurations/resources/api_gateway.py,sha256=-k4hMGszIdQLb5DGmWBIPy49YGutp8zczafRh-Vob0I,4904
22
23
  cdk_factory/configurations/resources/apigateway_route_config.py,sha256=6ytn_nwKwlfpBtHL5sV6gxMpgAJ3p6QFGumMoW4CTHM,2351
23
24
  cdk_factory/configurations/resources/auto_scaling.py,sha256=rY-lZBZIS3bq0Lzf4IGbmMxhgiD_tknjjTZhh4Z6yFI,5922
@@ -36,7 +37,7 @@ cdk_factory/configurations/resources/lambda_edge.py,sha256=MjmiwDkys4aoRvDQhH3MT
36
37
  cdk_factory/configurations/resources/lambda_function.py,sha256=VENZ9-ABJ5mjcN8J8wdLH4KHDYr1kWO0iFDH0B2mJXA,14659
37
38
  cdk_factory/configurations/resources/lambda_layers.py,sha256=gVeP_-LC3Eq0lkPaG_JfFUwboM5evRPr99SfKj53m7A,633
38
39
  cdk_factory/configurations/resources/lambda_triggers.py,sha256=MD7cdMNKEulNBhtMLIFnWJuJ5R-yyIqa0LHUgbSQerA,834
39
- cdk_factory/configurations/resources/load_balancer.py,sha256=idpKdvkkCM7J9J2pNjMBOY1DNaFR1tk1tFjTg76bvrY,5267
40
+ cdk_factory/configurations/resources/load_balancer.py,sha256=CNmE4uqOgyI0amZy2EDvDF5_Feiw5kcCmbkY1HI5u_s,5911
40
41
  cdk_factory/configurations/resources/monitoring.py,sha256=zsfDMa7yph33Ql8iP7lIqqLAyixh-Mesi0imtZJFdcE,2310
41
42
  cdk_factory/configurations/resources/rds.py,sha256=ZPNQhsOOxE_cg9CeFIhjKLyQYzMURg_3wb8Ckc2tAtw,15724
42
43
  cdk_factory/configurations/resources/resource_mapping.py,sha256=cwv3n63RJ6E59ErsmSTdkW4i-g8huhHtKI0ExbRhJxA,2182
@@ -79,6 +80,8 @@ cdk_factory/stack/stack_module_registry.py,sha256=J14-A75VZESzRQa8p-Fepdap7Z8T7m
79
80
  cdk_factory/stack/stack_modules.py,sha256=kgEK-j0smZPozVwTCfM1g1V17EyTBT0TXAQZq4vZz0o,784
80
81
  cdk_factory/stack_library/__init__.py,sha256=5Y9TpIe8ZK1688G60PGcuP-hM0RvYEY_3Hl2qJCJJrw,581
81
82
  cdk_factory/stack_library/stack_base.py,sha256=tTleSFmlf26DuKVF_ytftf8P7IVWb5iex8cYfYupfvQ,4940
83
+ cdk_factory/stack_library/acm/__init__.py,sha256=4FNRLykblcKZvq_wieYwvv9N_jgrZnJ7ECH9xKh-0Ls,81
84
+ cdk_factory/stack_library/acm/acm_stack.py,sha256=hflRXyOSjqGeJxBx87EV3Z3MJ5HEX2rnrjJ_E9wwhH8,5862
82
85
  cdk_factory/stack_library/api_gateway/api_gateway_stack.py,sha256=l6J5uurBQqbhj9JuvQitV9PiIHS5kqa-dFWifCeA3GM,39347
83
86
  cdk_factory/stack_library/auto_scaling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
87
  cdk_factory/stack_library/auto_scaling/auto_scaling_stack.py,sha256=XPTPGF-W8ARvzW8UYd4yPJ7xFUw-2BrdxQOYk9I-v3g,23490
@@ -97,13 +100,13 @@ cdk_factory/stack_library/ecs/ecs_service_stack.py,sha256=c6K3BjlXyldr8ikvEhfC9C
97
100
  cdk_factory/stack_library/lambda_edge/__init__.py,sha256=ByBJ_CWdc4UtTmFBZH-6pzBMNkjkdtE65AmnB0Fs6lM,156
98
101
  cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py,sha256=CdId_1kcZmYr1lLI9AD3-KqtE6voC3641PIloJmWiNI,16414
99
102
  cdk_factory/stack_library/load_balancer/__init__.py,sha256=wZpKw2OecLJGdF5mPayCYAEhu2H3c2gJFFIxwXftGDU,52
100
- cdk_factory/stack_library/load_balancer/load_balancer_stack.py,sha256=fgp2s3DjP1fIRZT2PaxQVPrL4MGILML3ovcreEdmFlo,29651
103
+ cdk_factory/stack_library/load_balancer/load_balancer_stack.py,sha256=Mw8r3919-gXYVrWhXUNxopsyeF57y1N9JfPb4TPOR4Q,31305
101
104
  cdk_factory/stack_library/monitoring/__init__.py,sha256=k1G_KDx47Aw0UugaL99PN_TKlyLK4nkJVApCaAK7GJg,153
102
105
  cdk_factory/stack_library/monitoring/monitoring_stack.py,sha256=N_1YvEXE7fboH_S3kv_dSKZsufxMuPdFMjGzlNFpuSo,19283
103
106
  cdk_factory/stack_library/rds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
107
  cdk_factory/stack_library/rds/rds_stack.py,sha256=otT4qCl_GExUgl4xHWrcGksnJeg2Ps6luZxbpCXQYcI,15048
105
108
  cdk_factory/stack_library/route53/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
- cdk_factory/stack_library/route53/route53_stack.py,sha256=R-6DW7gIjeg25uBT5ZMLNDiQUOSZMipc-Tw6f8POVvI,8081
109
+ cdk_factory/stack_library/route53/route53_stack.py,sha256=hW-iKXdw862cYg4o-OL7X4CnKxzXdrzPgfQ8KdxTMnE,8403
107
110
  cdk_factory/stack_library/rum/__init__.py,sha256=gUrWQdzd4rZ2J0YzAQC8PsEGAS7QgyYjB2ZCUKWasy4,90
108
111
  cdk_factory/stack_library/rum/rum_stack.py,sha256=OvQ6tsjYcXS8adqU_Xh0A_VKdnPtQnij4cG67nNqSVo,13611
109
112
  cdk_factory/stack_library/security_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -129,8 +132,8 @@ cdk_factory/utilities/lambda_function_utilities.py,sha256=S1GvBsY_q2cyUiaud3HORJ
129
132
  cdk_factory/utilities/os_execute.py,sha256=5Op0LY_8Y-pUm04y1k8MTpNrmQvcLmQHPQITEP7EuSU,1019
130
133
  cdk_factory/utils/api_gateway_utilities.py,sha256=If7Xu5s_UxmuV-kL3JkXxPLBdSVUKoLtohm0IUFoiV8,4378
131
134
  cdk_factory/workload/workload_factory.py,sha256=yDI3cRhVI5ELNDcJPLpk9UY54Uind1xQoV3spzT4z7E,6068
132
- cdk_factory-0.15.22.dist-info/METADATA,sha256=MIXVvmQIOmO3HcrhZrF7Cj9c9t-og0x9Av89UN4qfWo,2452
133
- cdk_factory-0.15.22.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
134
- cdk_factory-0.15.22.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
135
- cdk_factory-0.15.22.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
136
- cdk_factory-0.15.22.dist-info/RECORD,,
135
+ cdk_factory-0.16.3.dist-info/METADATA,sha256=ZcxvwT_8nNbqBmdht6NiCo7XSgmh6cFLZPt51K3UU7w,2451
136
+ cdk_factory-0.16.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
137
+ cdk_factory-0.16.3.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
138
+ cdk_factory-0.16.3.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
139
+ cdk_factory-0.16.3.dist-info/RECORD,,