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.
- cdk_factory/configurations/resources/acm.py +78 -0
- cdk_factory/configurations/resources/load_balancer.py +14 -0
- cdk_factory/stack_library/acm/__init__.py +6 -0
- cdk_factory/stack_library/acm/acm_stack.py +169 -0
- cdk_factory/stack_library/load_balancer/load_balancer_stack.py +54 -24
- cdk_factory/stack_library/route53/route53_stack.py +6 -1
- cdk_factory/version.py +1 -1
- {cdk_factory-0.15.22.dist-info → cdk_factory-0.16.3.dist-info}/METADATA +1 -1
- {cdk_factory-0.15.22.dist-info → cdk_factory-0.16.3.dist-info}/RECORD +12 -9
- {cdk_factory-0.15.22.dist-info → cdk_factory-0.16.3.dist-info}/WHEEL +0 -0
- {cdk_factory-0.15.22.dist-info → cdk_factory-0.16.3.dist-info}/entry_points.txt +0 -0
- {cdk_factory-0.15.22.dist-info → cdk_factory-0.16.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -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,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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
load_balancer_name
|
|
121
|
-
vpc
|
|
122
|
-
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
|
|
129
|
-
idle_timeout
|
|
130
|
-
http2_enabled
|
|
131
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
432
|
-
|
|
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.
|
|
1
|
+
__version__ = "0.16.3"
|
|
@@ -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=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=
|
|
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=
|
|
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=
|
|
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.
|
|
133
|
-
cdk_factory-0.
|
|
134
|
-
cdk_factory-0.
|
|
135
|
-
cdk_factory-0.
|
|
136
|
-
cdk_factory-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|