cdk-factory 0.15.8__py3-none-any.whl → 0.15.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.

@@ -138,3 +138,11 @@ class RdsConfig(EnhancedBaseConfig):
138
138
  if "ssm" in self.__config and "imports" in self.__config["ssm"]:
139
139
  return self.__config["ssm"]["imports"]
140
140
  return self.__config.get("ssm_imports", {})
141
+
142
+ @property
143
+ def ssm_exports(self) -> Dict[str, str]:
144
+ """SSM parameter exports for the RDS instance"""
145
+ # Check both nested and flat structures for backwards compatibility
146
+ if "ssm" in self.__config and "exports" in self.__config["ssm"]:
147
+ return self.__config["ssm"]["exports"]
148
+ return self.__config.get("ssm_exports", {})
@@ -69,3 +69,16 @@ class SecurityGroupFullStackConfig:
69
69
  if "ssm" in self.__config and "imports" in self.__config["ssm"]:
70
70
  return self.__config["ssm"]["imports"]
71
71
  return self.__config.get("ssm_imports", {})
72
+
73
+ @property
74
+ def ssm_exports(self) -> Dict[str, str]:
75
+ """SSM parameter exports for the Security Group"""
76
+ # Check both nested and flat structures for backwards compatibility
77
+ if "ssm" in self.__config and "exports" in self.__config["ssm"]:
78
+ return self.__config["ssm"]["exports"]
79
+ return self.__config.get("ssm_exports", {})
80
+
81
+ @property
82
+ def security_groups(self) -> List[Dict[str, Any]]:
83
+ """List of security groups to create"""
84
+ return self.__config.get("security_groups", [])
@@ -82,6 +82,9 @@ class RdsStack(IStack, EnhancedSsmParameterMixin):
82
82
 
83
83
  # Add outputs
84
84
  self._add_outputs(db_name)
85
+
86
+ # Export to SSM Parameter Store
87
+ self._export_ssm_parameters(db_name)
85
88
 
86
89
  def _process_ssm_imports(self) -> None:
87
90
  """Process SSM imports from configuration"""
@@ -296,3 +299,60 @@ class RdsStack(IStack, EnhancedSsmParameterMixin):
296
299
  value=self.db_instance.secret.secret_arn,
297
300
  export_name=f"{self.deployment.build_resource_name(db_name)}-secret-arn",
298
301
  )
302
+
303
+ def _export_ssm_parameters(self, db_name: str) -> None:
304
+ """Export RDS connection info and credentials to SSM Parameter Store"""
305
+ ssm_exports = self.rds_config.ssm_exports
306
+
307
+ if not ssm_exports:
308
+ logger.debug("No SSM exports configured for RDS")
309
+ return
310
+
311
+ logger.info(f"Exporting {len(ssm_exports)} SSM parameters for RDS")
312
+
313
+ # Export database endpoint
314
+ if "db_endpoint" in ssm_exports:
315
+ self.export_ssm_parameter(
316
+ scope=self,
317
+ id="SsmExportDbEndpoint",
318
+ value=self.db_instance.db_instance_endpoint_address,
319
+ parameter_name=ssm_exports["db_endpoint"],
320
+ description=f"RDS endpoint for {db_name}",
321
+ )
322
+ logger.info(f"Exported SSM parameter: {ssm_exports['db_endpoint']}")
323
+
324
+ # Export database port
325
+ if "db_port" in ssm_exports:
326
+ self.export_ssm_parameter(
327
+ scope=self,
328
+ id="SsmExportDbPort",
329
+ value=self.db_instance.db_instance_endpoint_port,
330
+ parameter_name=ssm_exports["db_port"],
331
+ description=f"RDS port for {db_name}",
332
+ )
333
+ logger.info(f"Exported SSM parameter: {ssm_exports['db_port']}")
334
+
335
+ # Export database name
336
+ if "db_name" in ssm_exports and self.rds_config.database_name:
337
+ self.export_ssm_parameter(
338
+ scope=self,
339
+ id="SsmExportDbName",
340
+ value=self.rds_config.database_name,
341
+ parameter_name=ssm_exports["db_name"],
342
+ description=f"RDS database name for {db_name}",
343
+ )
344
+ logger.info(f"Exported SSM parameter: {ssm_exports['db_name']}")
345
+
346
+ # Export secret ARN (contains username and password)
347
+ if "db_secret_arn" in ssm_exports:
348
+ if hasattr(self.db_instance, "secret") and self.db_instance.secret:
349
+ self.export_ssm_parameter(
350
+ scope=self,
351
+ id="SsmExportDbSecretArn",
352
+ value=self.db_instance.secret.secret_arn,
353
+ parameter_name=ssm_exports["db_secret_arn"],
354
+ description=f"Secrets Manager ARN containing RDS credentials for {db_name}",
355
+ )
356
+ logger.info(f"Exported SSM parameter: {ssm_exports['db_secret_arn']}")
357
+ else:
358
+ logger.warning(f"Secret not found for RDS instance {db_name}, skipping secret ARN export")
@@ -225,6 +225,18 @@ class SecurityGroupsStack(IStack):
225
225
  export_name=f"{self.deployment.environment}-{self.workload.name}-WebMonitoringSecurityGroup",
226
226
  )
227
227
 
228
+ # =========================================================
229
+ # SSM Parameter Store Exports
230
+ # =========================================================
231
+ self._export_ssm_parameters(
232
+ security_groups_map={
233
+ "alb": alb_sg,
234
+ "ecs": web_fleet_sg,
235
+ "rds": mysql_sg,
236
+ "monitoring": monitoring_sg,
237
+ }
238
+ )
239
+
228
240
  def _process_ssm_imports(self) -> None:
229
241
  """
230
242
  Process SSM imports from configuration.
@@ -287,3 +299,64 @@ class SecurityGroupsStack(IStack):
287
299
  raise ValueError("VPC ID is not defined in the configuration or SSM imports.")
288
300
 
289
301
  return self._vpc
302
+
303
+ def _export_ssm_parameters(self, security_groups_map: Dict[str, ec2.CfnSecurityGroup]) -> None:
304
+ """
305
+ Export security group IDs to SSM Parameter Store based on configuration.
306
+
307
+ Args:
308
+ security_groups_map: Dictionary mapping security group types to their CDK resources
309
+ """
310
+ # Get the security groups configuration list from the config
311
+ security_groups_config = self.sg_config.security_groups
312
+
313
+ if not security_groups_config:
314
+ logger.debug("No security groups configuration found for SSM exports")
315
+ return
316
+
317
+ logger.info(f"Processing SSM exports for {len(security_groups_config)} security groups")
318
+
319
+ # Process each security group configuration
320
+ for sg_config in security_groups_config:
321
+ # Get the security group name and SSM exports
322
+ sg_name = sg_config.get("name", "")
323
+ ssm_config = sg_config.get("ssm", {})
324
+ ssm_exports = ssm_config.get("exports", {})
325
+
326
+ if not ssm_exports:
327
+ logger.debug(f"No SSM exports configured for security group: {sg_name}")
328
+ continue
329
+
330
+ # Determine which security group this config refers to based on the name pattern
331
+ # The config uses patterns like "{{WORKLOAD_NAME}}-{{ENVIRONMENT}}-rds-sg"
332
+ sg_resource = None
333
+ sg_type = None
334
+
335
+ if "-rds-sg" in sg_name or "-rds" in sg_name:
336
+ sg_resource = security_groups_map.get("rds")
337
+ sg_type = "rds"
338
+ elif "-ecs-sg" in sg_name or "instances" in sg_name:
339
+ sg_resource = security_groups_map.get("ecs")
340
+ sg_type = "ecs"
341
+ elif "-alb-sg" in sg_name or "alb" in sg_name:
342
+ sg_resource = security_groups_map.get("alb")
343
+ sg_type = "alb"
344
+ elif "monitoring" in sg_name:
345
+ sg_resource = security_groups_map.get("monitoring")
346
+ sg_type = "monitoring"
347
+
348
+ if not sg_resource:
349
+ logger.warning(f"Could not map security group configuration to resource: {sg_name}")
350
+ continue
351
+
352
+ # Export the security group ID if configured
353
+ security_group_id_path = ssm_exports.get("security_group_id")
354
+ if security_group_id_path:
355
+ self.export_ssm_parameter(
356
+ scope=self,
357
+ id=f"SsmExport{sg_type.upper()}SecurityGroupId",
358
+ value=sg_resource.ref,
359
+ parameter_name=security_group_id_path,
360
+ description=f"Security Group ID for {sg_type} ({sg_name})",
361
+ )
362
+ logger.info(f"Exported SSM parameter: {security_group_id_path} for {sg_type} security group")
@@ -1425,7 +1425,9 @@ class ApiGatewayIntegrationUtility:
1425
1425
  f" 2. Add 'allow_public_override': true to explicitly allow public access\n"
1426
1426
  f" 3. Remove 'authorization_type': 'NONE' to use secure Cognito auth\n\n"
1427
1427
  f"🔒 This prevents accidental public endpoints when authentication is available.\n\n"
1428
- f"👉 ApiGatewayIntegrationUtility documentation for more details: https://github.com/your-repo/api-gateway-stack"
1428
+ f"👉 ApiGatewayIntegrationUtility documentation for more details: \n\n "
1429
+ "\t https://github.com/geekcafe/cdk-factory/blob/main/src/cdk_factory/utilities/api_gateway_integration_utility.py \n\n"
1430
+ "\t and https://github.com/geekcafe/cdk-factory/blob/main/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py"
1429
1431
  )
1430
1432
  raise ValueError(error_msg)
1431
1433
 
cdk_factory/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.15.8"
1
+ __version__ = "0.15.10"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdk_factory
3
- Version: 0.15.8
3
+ Version: 0.15.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,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=GqK-8KWAo4vp6jaQ3n26VDgMQlCxjp7WFrJNanI0RCs,23
5
+ cdk_factory/version.py,sha256=bVjzjoCZ4i8ekwD6vYFTiHHb51wVUtF_jW4KJEuwrAk,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=JKjhNsy0RCUZy1s8n5D_aXXI-upR9izaLtCTfKYiV9k,9624
@@ -38,7 +38,7 @@ cdk_factory/configurations/resources/lambda_layers.py,sha256=gVeP_-LC3Eq0lkPaG_J
38
38
  cdk_factory/configurations/resources/lambda_triggers.py,sha256=MD7cdMNKEulNBhtMLIFnWJuJ5R-yyIqa0LHUgbSQerA,834
39
39
  cdk_factory/configurations/resources/load_balancer.py,sha256=idpKdvkkCM7J9J2pNjMBOY1DNaFR1tk1tFjTg76bvrY,5267
40
40
  cdk_factory/configurations/resources/monitoring.py,sha256=zsfDMa7yph33Ql8iP7lIqqLAyixh-Mesi0imtZJFdcE,2310
41
- cdk_factory/configurations/resources/rds.py,sha256=fYyS9qlsdHCdGQ5jS3f-edQUvbNYX30T96gxEwlz9tM,4828
41
+ cdk_factory/configurations/resources/rds.py,sha256=is_odfCoe3kyiz8DpDxDayt1aVICJoNWuhuaHZ98qQo,5197
42
42
  cdk_factory/configurations/resources/resource_mapping.py,sha256=cwv3n63RJ6E59ErsmSTdkW4i-g8huhHtKI0ExbRhJxA,2182
43
43
  cdk_factory/configurations/resources/resource_naming.py,sha256=VE9S2cpzp11qqPL2z1sX79wXH0o1SntO2OG74nEmWC8,5508
44
44
  cdk_factory/configurations/resources/resource_types.py,sha256=1WQHyDoErb-M-tETZZzyLDtbq_jdC85-I403dM48pgE,2317
@@ -47,7 +47,7 @@ cdk_factory/configurations/resources/route53_hosted_zone.py,sha256=qjEYPCSxSOx5b
47
47
  cdk_factory/configurations/resources/rum.py,sha256=5aNLhyJEl97spby2gEV59RsMIQpUto2hGh1DeSyIp_I,5149
48
48
  cdk_factory/configurations/resources/s3.py,sha256=LBwTOZ4tOxNbgiu1fFGHOTyF5jlzeVphc_9VAqNw8zA,6042
49
49
  cdk_factory/configurations/resources/security_group.py,sha256=8kQtaaRVEn2aDm8XoC7QFh2mDOFbPbgobmssIuqU8MA,2259
50
- cdk_factory/configurations/resources/security_group_full_stack.py,sha256=3LHIJw4BEsagb0EMnc8C2_g4OQxUe0kQTn3XqQltUIE,2402
50
+ cdk_factory/configurations/resources/security_group_full_stack.py,sha256=OzcQF5UMqIVAtDAlGY1kf1IWxq2x_gmnwAUTIZ5ITzY,2947
51
51
  cdk_factory/configurations/resources/sqs.py,sha256=fAh2dqttJ6PX46enFRULuiLEu3TEj0Vb2xntAOgUpYE,4346
52
52
  cdk_factory/configurations/resources/vpc.py,sha256=sNn6w76bHFwmt6N76gZZhqpsuNB9860C1SZu6tebaXY,3835
53
53
  cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py,sha256=LHgjvTNghCMTpHh90VWl7AbE100Er-S9EgyEVt12J_c,25809
@@ -101,13 +101,13 @@ cdk_factory/stack_library/load_balancer/load_balancer_stack.py,sha256=SBB-Cknon7
101
101
  cdk_factory/stack_library/monitoring/__init__.py,sha256=k1G_KDx47Aw0UugaL99PN_TKlyLK4nkJVApCaAK7GJg,153
102
102
  cdk_factory/stack_library/monitoring/monitoring_stack.py,sha256=N_1YvEXE7fboH_S3kv_dSKZsufxMuPdFMjGzlNFpuSo,19283
103
103
  cdk_factory/stack_library/rds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
- cdk_factory/stack_library/rds/rds_stack.py,sha256=jvG3mcz5CQHv2NV-KwjGX8XgxtPiixRQTdBtaLb6sw4,12161
104
+ cdk_factory/stack_library/rds/rds_stack.py,sha256=wlKPRCvioz9e6mzMuUDGUBw0gcnCDBnTI0ZN2NVatUo,14822
105
105
  cdk_factory/stack_library/route53/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
106
  cdk_factory/stack_library/route53/route53_stack.py,sha256=R-6DW7gIjeg25uBT5ZMLNDiQUOSZMipc-Tw6f8POVvI,8081
107
107
  cdk_factory/stack_library/rum/__init__.py,sha256=gUrWQdzd4rZ2J0YzAQC8PsEGAS7QgyYjB2ZCUKWasy4,90
108
108
  cdk_factory/stack_library/rum/rum_stack.py,sha256=OvQ6tsjYcXS8adqU_Xh0A_VKdnPtQnij4cG67nNqSVo,13611
109
109
  cdk_factory/stack_library/security_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
- cdk_factory/stack_library/security_group/security_group_full_stack.py,sha256=zu-xrz2KuojJGoN4-sTzD14sT9DwYaJpgwFl3wPiNXw,10907
110
+ cdk_factory/stack_library/security_group/security_group_full_stack.py,sha256=je6MF6lriSaOMtIZ9hrcFagXObu5SItccpBr9Mp5TMo,14200
111
111
  cdk_factory/stack_library/security_group/security_group_stack.py,sha256=2zxd5ozgQ4GP0xi-Ni7SyChtEAOzC0nXeGz78DPXwPg,14445
112
112
  cdk_factory/stack_library/simple_queue_service/sqs_stack.py,sha256=jJksWrvrvgZUMM01RZ317DOIxqIJbkYYSYu38w0jHpc,6039
113
113
  cdk_factory/stack_library/vpc/__init__.py,sha256=7pIqP97Gf2AJbv9Ebp1WbQGHYhgEbWJ52L1MzeXBybA,42
@@ -117,7 +117,7 @@ cdk_factory/stages/websites/static_website_stage.py,sha256=X4fpKXkhb0zIbSHx3Qydd
117
117
  cdk_factory/templates/README.md,sha256=ATBEjG6beYvbEAdLtZ_8xnxgFD5X0cgZoI_6pToqH90,2679
118
118
  cdk_factory/templates/app.py.template,sha256=aM60x0nNV80idtCL8jm1EddY63F5tDITYOlavg-BPMU,1069
119
119
  cdk_factory/templates/cdk.json.template,sha256=SuGz4Y6kCVMDRpJrA_AJlp0kwdENiJPVngIv1xP5bwI,3526
120
- cdk_factory/utilities/api_gateway_integration_utility.py,sha256=yblKiMIHGXqKb7JK5IbzGM_TXjX9j893BMqgqBT44DE,63449
120
+ cdk_factory/utilities/api_gateway_integration_utility.py,sha256=Mpyq038ZvL8FafcOwqp2Jj0cNcD_nLfVyTBzMYaUskM,63683
121
121
  cdk_factory/utilities/commandline_args.py,sha256=0FiNEJFbWVN8Ct7r0VHnJEx7rhUlaRKT7R7HMNJBSTI,2216
122
122
  cdk_factory/utilities/configuration_loader.py,sha256=z0ZdGLNbTO4_yfluB9zUh_i_Poc9qj-7oRyjMRlNkN8,1522
123
123
  cdk_factory/utilities/docker_utilities.py,sha256=6ee9KEGsaRJWo6FqvdPtE3_L2Emp3Lc0vu2Ie3VoflI,8280
@@ -129,8 +129,8 @@ cdk_factory/utilities/lambda_function_utilities.py,sha256=S1GvBsY_q2cyUiaud3HORJ
129
129
  cdk_factory/utilities/os_execute.py,sha256=5Op0LY_8Y-pUm04y1k8MTpNrmQvcLmQHPQITEP7EuSU,1019
130
130
  cdk_factory/utils/api_gateway_utilities.py,sha256=If7Xu5s_UxmuV-kL3JkXxPLBdSVUKoLtohm0IUFoiV8,4378
131
131
  cdk_factory/workload/workload_factory.py,sha256=mM8GU_5mKq_0OyK060T3JrUSUiGAcKf0eqNlT9mfaws,6028
132
- cdk_factory-0.15.8.dist-info/METADATA,sha256=VLrMowBafHShClFp5_iVJYyrE7kB9uKb3OdAC2IlEvY,2451
133
- cdk_factory-0.15.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
134
- cdk_factory-0.15.8.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
135
- cdk_factory-0.15.8.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
136
- cdk_factory-0.15.8.dist-info/RECORD,,
132
+ cdk_factory-0.15.10.dist-info/METADATA,sha256=9N2bg9PHi8myWMfxSoxxXA40AuuFbQl10ouIscuHBMQ,2452
133
+ cdk_factory-0.15.10.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
134
+ cdk_factory-0.15.10.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
135
+ cdk_factory-0.15.10.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
136
+ cdk_factory-0.15.10.dist-info/RECORD,,