cdk-factory 0.15.4__tar.gz → 0.15.7__tar.gz

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 (158) hide show
  1. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/PKG-INFO +1 -1
  2. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/pyproject.toml +1 -1
  3. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/ecs_service.py +4 -1
  4. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/load_balancer.py +8 -0
  5. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/rds.py +3 -0
  6. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/security_group_full_stack.py +3 -0
  7. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/lambdas/edge/ip_gate/handler.py +14 -4
  8. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/ecs/ecs_service_stack.py +76 -8
  9. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/load_balancer/load_balancer_stack.py +92 -4
  10. cdk_factory-0.15.7/src/cdk_factory/version.py +1 -0
  11. cdk_factory-0.15.4/src/cdk_factory/version.py +0 -1
  12. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/.gitignore +0 -0
  13. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/.windsurfrules +0 -0
  14. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/LICENSE +0 -0
  15. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/README.md +0 -0
  16. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/archive/README.md +0 -0
  17. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/archive/migrate_to_enhanced_ssm.py +0 -0
  18. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/examples/json-imports/README.md +0 -0
  19. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/examples/separate-api-gateway/README.md +0 -0
  20. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/examples/separate-api-gateway/api-gateway-stack.json +0 -0
  21. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/examples/separate-api-gateway/config.json +0 -0
  22. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/examples/separate-api-gateway/lambda-stack.json +0 -0
  23. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/mypy.ini +0 -0
  24. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/publish_to_pypi.py +0 -0
  25. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/publish_to_pypi.sh +0 -0
  26. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/pysetup.py +0 -0
  27. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/pysetup.sh +0 -0
  28. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/requirements.dev.txt +0 -0
  29. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/requirements.tests.txt +0 -0
  30. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/requirements.txt +0 -0
  31. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/run-checks.sh +0 -0
  32. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/run-tests-clean-venv.sh +0 -0
  33. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/run-tests.sh +0 -0
  34. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/scripts/cloudfront-cleanup.sh +0 -0
  35. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/__init__.py +0 -0
  36. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/app.py +0 -0
  37. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/builds/README.md +0 -0
  38. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/cdk.json +0 -0
  39. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/cli.py +0 -0
  40. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/commands/command_loader.py +0 -0
  41. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/base_config.py +0 -0
  42. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/cdk_config.py +0 -0
  43. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/deployment.py +0 -0
  44. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/deployment_wave.py +0 -0
  45. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/devops.py +0 -0
  46. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/enhanced_base_config.py +0 -0
  47. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/enhanced_ssm_config.py +0 -0
  48. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/management.py +0 -0
  49. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/pipeline.py +0 -0
  50. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/pipeline_stage.py +0 -0
  51. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/_resources.py +0 -0
  52. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/api_gateway.py +0 -0
  53. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/apigateway_route_config.py +0 -0
  54. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/auto_scaling.py +0 -0
  55. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/cloudfront.py +0 -0
  56. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/cloudwatch_widget.py +0 -0
  57. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/code_artifact.py +0 -0
  58. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/code_artifact_login.py +0 -0
  59. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/code_repository.py +0 -0
  60. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/cognito.py +0 -0
  61. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/docker.py +0 -0
  62. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/dynamodb.py +0 -0
  63. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/ecr.py +0 -0
  64. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/exisiting.py +0 -0
  65. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/lambda_edge.py +0 -0
  66. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/lambda_function.py +0 -0
  67. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/lambda_layers.py +0 -0
  68. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/lambda_triggers.py +0 -0
  69. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/monitoring.py +0 -0
  70. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/resource_mapping.py +0 -0
  71. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/resource_naming.py +0 -0
  72. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/resource_types.py +0 -0
  73. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/route53.py +0 -0
  74. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/route53_hosted_zone.py +0 -0
  75. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/rum.py +0 -0
  76. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/s3.py +0 -0
  77. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/security_group.py +0 -0
  78. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/sqs.py +0 -0
  79. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/resources/vpc.py +0 -0
  80. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/stack.py +0 -0
  81. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/configurations/workload.py +0 -0
  82. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py +0 -0
  83. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/ecr/ecr_construct.py +0 -0
  84. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/lambdas/lambda_function_construct.py +0 -0
  85. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/lambdas/lambda_function_docker_construct.py +0 -0
  86. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/lambdas/lambda_function_role_construct.py +0 -0
  87. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/lambdas/policies/policy_docs.py +0 -0
  88. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/lambdas/policies/policy_statements.py +0 -0
  89. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/s3_buckets/s3_bucket_construct.py +0 -0
  90. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py +0 -0
  91. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py +0 -0
  92. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/constructs/sqs/policies/sqs_policies.py +0 -0
  93. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/interfaces/enhanced_ssm_parameter_mixin.py +0 -0
  94. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/interfaces/istack.py +0 -0
  95. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/interfaces/live_ssm_resolver.py +0 -0
  96. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/interfaces/ssm_parameter_mixin.py +0 -0
  97. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/lambdas/health_handler.py +0 -0
  98. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/pipeline/path_utils.py +0 -0
  99. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/pipeline/pipeline_factory.py +0 -0
  100. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/pipeline/security/policies.py +0 -0
  101. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/pipeline/security/roles.py +0 -0
  102. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/pipeline/stage.py +0 -0
  103. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack/istack.py +0 -0
  104. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack/stack_factory.py +0 -0
  105. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack/stack_module_loader.py +0 -0
  106. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack/stack_module_registry.py +0 -0
  107. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack/stack_modules.py +0 -0
  108. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/__init__.py +0 -0
  109. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py +0 -0
  110. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/auto_scaling/__init__.py +0 -0
  111. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/auto_scaling/auto_scaling_stack.py +0 -0
  112. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/aws_lambdas/lambda_stack.py +0 -0
  113. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/buckets/README.md +0 -0
  114. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/buckets/bucket_stack.py +0 -0
  115. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/cloudfront/__init__.py +0 -0
  116. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/cloudfront/cloudfront_stack.py +0 -0
  117. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/code_artifact/code_artifact_stack.py +0 -0
  118. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/cognito/cognito_stack.py +0 -0
  119. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/dynamodb/dynamodb_stack.py +0 -0
  120. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/ecr/README.md +0 -0
  121. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/ecr/ecr_stack.py +0 -0
  122. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/ecs/__init__.py +0 -0
  123. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/lambda_edge/__init__.py +0 -0
  124. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py +0 -0
  125. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/load_balancer/__init__.py +0 -0
  126. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/monitoring/__init__.py +0 -0
  127. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/monitoring/monitoring_stack.py +0 -0
  128. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/rds/__init__.py +0 -0
  129. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/rds/rds_stack.py +0 -0
  130. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/route53/__init__.py +0 -0
  131. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/route53/route53_stack.py +0 -0
  132. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/rum/__init__.py +0 -0
  133. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/rum/rum_stack.py +0 -0
  134. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/security_group/__init__.py +0 -0
  135. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/security_group/security_group_full_stack.py +0 -0
  136. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/security_group/security_group_stack.py +0 -0
  137. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/simple_queue_service/sqs_stack.py +0 -0
  138. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/stack_base.py +0 -0
  139. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/vpc/__init__.py +0 -0
  140. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/vpc/vpc_stack.py +0 -0
  141. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stack_library/websites/static_website_stack.py +0 -0
  142. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/stages/websites/static_website_stage.py +0 -0
  143. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/templates/README.md +0 -0
  144. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/templates/app.py.template +0 -0
  145. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/templates/cdk.json.template +0 -0
  146. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/api_gateway_integration_utility.py +0 -0
  147. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/commandline_args.py +0 -0
  148. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/configuration_loader.py +0 -0
  149. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/docker_utilities.py +0 -0
  150. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/environment_services.py +0 -0
  151. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/file_operations.py +0 -0
  152. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/git_utilities.py +0 -0
  153. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/json_loading_utility.py +0 -0
  154. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/lambda_function_utilities.py +0 -0
  155. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utilities/os_execute.py +0 -0
  156. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/utils/api_gateway_utilities.py +0 -0
  157. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/cdk_factory/workload/workload_factory.py +0 -0
  158. {cdk_factory-0.15.4 → cdk_factory-0.15.7}/src/handlers/test/handler.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdk_factory
3
- Version: 0.15.4
3
+ Version: 0.15.7
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
@@ -33,7 +33,7 @@ markers = [
33
33
  [project]
34
34
 
35
35
  name = "cdk_factory"
36
- version = "0.15.4"
36
+ version = "0.15.7"
37
37
  authors = [
38
38
  { name="Eric Wilson", email="eric.wilson@geekcafe.com" }
39
39
  ]
@@ -129,8 +129,11 @@ class EcsServiceConfig:
129
129
  return self._config.get("ssm_exports", {})
130
130
 
131
131
  @property
132
- def ssm_imports(self) -> Dict[str, str]:
132
+ def ssm_imports(self) -> Dict[str, Any]:
133
133
  """SSM parameter imports"""
134
+ # Check both nested and flat structures for backwards compatibility
135
+ if "ssm" in self._config and "imports" in self._config["ssm"]:
136
+ return self._config["ssm"]["imports"]
134
137
  return self._config.get("ssm_imports", {})
135
138
 
136
139
  @property
@@ -143,3 +143,11 @@ class LoadBalancerConfig(EnhancedBaseConfig):
143
143
  return self.__config.get("ip_whitelist", {}).get(
144
144
  "block_response", default_response
145
145
  )
146
+
147
+ @property
148
+ def ssm_imports(self) -> Dict[str, Any]:
149
+ """SSM parameter imports for the Load Balancer"""
150
+ # Check both nested and flat structures for backwards compatibility
151
+ if "ssm" in self.__config and "imports" in self.__config["ssm"]:
152
+ return self.__config["ssm"]["imports"]
153
+ return self.__config.get("ssm_imports", {})
@@ -134,4 +134,7 @@ class RdsConfig(EnhancedBaseConfig):
134
134
  @property
135
135
  def ssm_imports(self) -> Dict[str, str]:
136
136
  """SSM parameter imports for the RDS instance"""
137
+ # Check both nested and flat structures for backwards compatibility
138
+ if "ssm" in self.__config and "imports" in self.__config["ssm"]:
139
+ return self.__config["ssm"]["imports"]
137
140
  return self.__config.get("ssm_imports", {})
@@ -65,4 +65,7 @@ class SecurityGroupFullStackConfig:
65
65
  @property
66
66
  def ssm_imports(self) -> Dict[str, str]:
67
67
  """SSM parameter imports for the Security Group"""
68
+ # Check both nested and flat structures for backwards compatibility
69
+ if "ssm" in self.__config and "imports" in self.__config["ssm"]:
70
+ return self.__config["ssm"]["imports"]
68
71
  return self.__config.get("ssm_imports", {})
@@ -15,7 +15,7 @@ from functools import lru_cache
15
15
  ssm = None
16
16
 
17
17
  @lru_cache(maxsize=128)
18
- def get_ssm_parameter(parameter_name: str, region: str = 'us-east-1') -> str:
18
+ def get_ssm_parameter(parameter_name: str, region: str = 'us-east-1', default: str = None) -> str:
19
19
  """
20
20
  Fetch SSM parameter with caching.
21
21
  Lambda@Edge cannot use environment variables, so we fetch from SSM.
@@ -25,9 +25,10 @@ def get_ssm_parameter(parameter_name: str, region: str = 'us-east-1') -> str:
25
25
  Args:
26
26
  parameter_name: Name of the SSM parameter
27
27
  region: AWS region (default us-east-1)
28
+ default: Default value to return if parameter not found (optional)
28
29
 
29
30
  Returns:
30
- Parameter value, or empty string if value is 'NONE'
31
+ Parameter value, default value if parameter not found, or empty string if value is 'NONE'
31
32
  """
32
33
  global ssm
33
34
  if ssm is None:
@@ -43,8 +44,17 @@ def get_ssm_parameter(parameter_name: str, region: str = 'us-east-1') -> str:
43
44
  return ''
44
45
 
45
46
  return value
47
+ except ssm.exceptions.ParameterNotFound:
48
+ if default is not None:
49
+ print(f"SSM parameter {parameter_name} not found, using default: {default}")
50
+ return default
51
+ print(f"SSM parameter {parameter_name} not found and no default provided")
52
+ raise
46
53
  except Exception as e:
47
54
  print(f"Error fetching SSM parameter {parameter_name}: {str(e)}")
55
+ if default is not None:
56
+ print(f"Returning default value due to error: {default}")
57
+ return default
48
58
  raise
49
59
 
50
60
 
@@ -180,8 +190,8 @@ def lambda_handler(event, context):
180
190
 
181
191
  # IP not allowed - either redirect or proxy maintenance page
182
192
  # Check response mode from SSM (default: redirect for backward compatibility)
183
- response_mode_param = f"/{function_name}/response-mode"
184
- response_mode = get_ssm_parameter(response_mode_param, default='redirect')
193
+ response_mode_param = f"/{env}/{function_name}/response-mode"
194
+ response_mode = get_ssm_parameter(response_mode_param, 'us-east-1', default='redirect')
185
195
 
186
196
  if response_mode == 'proxy':
187
197
  # Proxy mode: Fetch and return maintenance content (keeps URL the same)
@@ -49,6 +49,8 @@ class EcsServiceStack(IStack, EnhancedSsmParameterMixin):
49
49
  self.service: Optional[ecs.FargateService] = None
50
50
  self.task_definition: Optional[ecs.FargateTaskDefinition] = None
51
51
  self._vpc: Optional[ec2.IVpc] = None
52
+ # SSM imported values
53
+ self.ssm_imported_values: Dict[str, Any] = {}
52
54
 
53
55
  def build(
54
56
  self,
@@ -77,6 +79,9 @@ class EcsServiceStack(IStack, EnhancedSsmParameterMixin):
77
79
 
78
80
  service_name = deployment.build_resource_name(self.ecs_config.name)
79
81
 
82
+ # Process SSM imports first
83
+ self._process_ssm_imports()
84
+
80
85
  # Load VPC
81
86
  self._load_vpc()
82
87
 
@@ -98,16 +103,79 @@ class EcsServiceStack(IStack, EnhancedSsmParameterMixin):
98
103
 
99
104
  def _load_vpc(self) -> None:
100
105
  """Load VPC from configuration"""
101
- vpc_id = self.ecs_config.vpc_id or self.workload.vpc_id
106
+ # Check SSM imported values first
107
+ if "vpc_id" in self.ssm_imported_values:
108
+ vpc_id = self.ssm_imported_values["vpc_id"]
109
+
110
+ # Build VPC attributes
111
+ vpc_attrs = {
112
+ "vpc_id": vpc_id,
113
+ "availability_zones": ["us-east-1a", "us-east-1b"]
114
+ }
115
+
116
+ # Use from_vpc_attributes() for SSM tokens
117
+ self._vpc = ec2.Vpc.from_vpc_attributes(self, "VPC", **vpc_attrs)
118
+ else:
119
+ vpc_id = self.ecs_config.vpc_id or self.workload.vpc_id
120
+
121
+ if not vpc_id:
122
+ raise ValueError("VPC ID is required for ECS service")
123
+
124
+ self._vpc = ec2.Vpc.from_lookup(
125
+ self,
126
+ "VPC",
127
+ vpc_id=vpc_id
128
+ )
129
+
130
+ def _process_ssm_imports(self) -> None:
131
+ """
132
+ Process SSM imports from configuration.
133
+ Follows the same pattern as RDS, Load Balancer, and Security Group stacks.
134
+ """
135
+ from aws_cdk import aws_ssm as ssm
102
136
 
103
- if not vpc_id:
104
- raise ValueError("VPC ID is required for ECS service")
137
+ ssm_imports = self.ecs_config.ssm_imports
105
138
 
106
- self._vpc = ec2.Vpc.from_lookup(
107
- self,
108
- "VPC",
109
- vpc_id=vpc_id
110
- )
139
+ if not ssm_imports:
140
+ logger.debug("No SSM imports configured for ECS Service")
141
+ return
142
+
143
+ logger.info(f"Processing {len(ssm_imports)} SSM imports for ECS Service")
144
+
145
+ for param_key, param_value in ssm_imports.items():
146
+ try:
147
+ # Handle list values (like security_group_ids)
148
+ if isinstance(param_value, list):
149
+ imported_list = []
150
+ for idx, param_path in enumerate(param_value):
151
+ if not param_path.startswith('/'):
152
+ param_path = f"/{param_path}"
153
+
154
+ construct_id = f"ssm-import-{param_key}-{idx}-{hash(param_path) % 10000}"
155
+ param = ssm.StringParameter.from_string_parameter_name(
156
+ self, construct_id, param_path
157
+ )
158
+ imported_list.append(param.string_value)
159
+
160
+ self.ssm_imported_values[param_key] = imported_list
161
+ logger.info(f"Imported SSM parameter list: {param_key} with {len(imported_list)} items")
162
+ else:
163
+ # Handle string values
164
+ param_path = param_value
165
+ if not param_path.startswith('/'):
166
+ param_path = f"/{param_path}"
167
+
168
+ construct_id = f"ssm-import-{param_key}-{hash(param_path) % 10000}"
169
+ param = ssm.StringParameter.from_string_parameter_name(
170
+ self, construct_id, param_path
171
+ )
172
+
173
+ self.ssm_imported_values[param_key] = param.string_value
174
+ logger.info(f"Imported SSM parameter: {param_key} from {param_path}")
175
+
176
+ except Exception as e:
177
+ logger.error(f"Failed to import SSM parameter {param_key}: {e}")
178
+ raise
111
179
 
112
180
  def _create_or_load_cluster(self) -> None:
113
181
  """Create a new ECS cluster or load an existing one"""
@@ -48,6 +48,8 @@ class LoadBalancerStack(IStack, EnhancedSsmParameterMixin):
48
48
  self._vpc = None
49
49
  self._hosted_zone = None
50
50
  self._record_names = None
51
+ # SSM imported values
52
+ self.ssm_imported_values: Dict[str, str] = {}
51
53
 
52
54
  def build(
53
55
  self,
@@ -74,6 +76,9 @@ class LoadBalancerStack(IStack, EnhancedSsmParameterMixin):
74
76
  )
75
77
  lb_name = deployment.build_resource_name(self.lb_config.name)
76
78
 
79
+ # Process SSM imports first
80
+ self._process_ssm_imports()
81
+
77
82
  self._prep_dns()
78
83
 
79
84
  # set up SSL certificate if configured
@@ -148,6 +153,18 @@ class LoadBalancerStack(IStack, EnhancedSsmParameterMixin):
148
153
  if self._vpc:
149
154
  return self._vpc
150
155
 
156
+ # Check SSM imported values first (tokens from SSM parameters)
157
+ if "vpc_id" in self.ssm_imported_values:
158
+ vpc_id = self.ssm_imported_values["vpc_id"]
159
+
160
+ # Build VPC attributes
161
+ vpc_attrs = {
162
+ "vpc_id": vpc_id,
163
+ "availability_zones": ["us-east-1a", "us-east-1b"]
164
+ }
165
+
166
+ # Use from_vpc_attributes() instead of from_lookup() because SSM imports return tokens
167
+ self._vpc = ec2.Vpc.from_vpc_attributes(self, "VPC", **vpc_attrs)
151
168
  elif self.lb_config.vpc_id:
152
169
  self._vpc = ec2.Vpc.from_lookup(self, "VPC", vpc_id=self.lb_config.vpc_id)
153
170
  elif self.workload.vpc_id:
@@ -162,13 +179,72 @@ class LoadBalancerStack(IStack, EnhancedSsmParameterMixin):
162
179
 
163
180
  return self._vpc
164
181
 
182
+ def _process_ssm_imports(self) -> None:
183
+ """
184
+ Process SSM imports from configuration.
185
+ Follows the same pattern as RDS and Security Group stacks.
186
+ """
187
+ from aws_cdk import aws_ssm as ssm
188
+
189
+ ssm_imports = self.lb_config.ssm_imports
190
+
191
+ if not ssm_imports:
192
+ logger.debug("No SSM imports configured for Load Balancer")
193
+ return
194
+
195
+ logger.info(f"Processing {len(ssm_imports)} SSM imports for Load Balancer")
196
+
197
+ for param_key, param_value in ssm_imports.items():
198
+ try:
199
+ # Handle list values (like security_groups)
200
+ if isinstance(param_value, list):
201
+ imported_list = []
202
+ for idx, param_path in enumerate(param_value):
203
+ if not param_path.startswith('/'):
204
+ param_path = f"/{param_path}"
205
+
206
+ construct_id = f"ssm-import-{param_key}-{idx}-{hash(param_path) % 10000}"
207
+ param = ssm.StringParameter.from_string_parameter_name(
208
+ self, construct_id, param_path
209
+ )
210
+ imported_list.append(param.string_value)
211
+
212
+ self.ssm_imported_values[param_key] = imported_list
213
+ logger.info(f"Imported SSM parameter list: {param_key} with {len(imported_list)} items")
214
+ else:
215
+ # Handle string values
216
+ param_path = param_value
217
+ if not param_path.startswith('/'):
218
+ param_path = f"/{param_path}"
219
+
220
+ construct_id = f"ssm-import-{param_key}-{hash(param_path) % 10000}"
221
+ param = ssm.StringParameter.from_string_parameter_name(
222
+ self, construct_id, param_path
223
+ )
224
+
225
+ self.ssm_imported_values[param_key] = param.string_value
226
+ logger.info(f"Imported SSM parameter: {param_key} from {param_path}")
227
+
228
+ except Exception as e:
229
+ logger.error(f"Failed to import SSM parameter {param_key}: {e}")
230
+ raise
231
+
165
232
  def _get_security_groups(self) -> List[ec2.ISecurityGroup]:
166
233
  """Get security groups for the Load Balancer"""
167
234
  security_groups = []
168
- for sg_id in self.lb_config.security_groups:
235
+
236
+ # Check SSM imported values first
237
+ if "security_groups" in self.ssm_imported_values:
238
+ sg_ids = self.ssm_imported_values["security_groups"]
239
+ if not isinstance(sg_ids, list):
240
+ sg_ids = [sg_ids]
241
+ else:
242
+ sg_ids = self.lb_config.security_groups
243
+
244
+ for idx, sg_id in enumerate(sg_ids):
169
245
  security_groups.append(
170
246
  ec2.SecurityGroup.from_security_group_id(
171
- self, f"SecurityGroup-{sg_id}", sg_id
247
+ self, f"SecurityGroup-{idx}", sg_id
172
248
  )
173
249
  )
174
250
  return security_groups
@@ -176,9 +252,21 @@ class LoadBalancerStack(IStack, EnhancedSsmParameterMixin):
176
252
  def _get_subnets(self) -> List[ec2.ISubnet]:
177
253
  """Get subnets for the Load Balancer"""
178
254
  subnets = []
179
- for subnet_id in self.lb_config.subnets:
255
+
256
+ # Check SSM imported values first
257
+ if "subnet_ids" in self.ssm_imported_values:
258
+ subnet_ids = self.ssm_imported_values["subnet_ids"]
259
+ # SSM returns comma-separated string for StringList, need to split
260
+ if isinstance(subnet_ids, str):
261
+ subnet_ids = [s.strip() for s in subnet_ids.split(',')]
262
+ elif not isinstance(subnet_ids, list):
263
+ subnet_ids = [subnet_ids]
264
+ else:
265
+ subnet_ids = self.lb_config.subnets
266
+
267
+ for idx, subnet_id in enumerate(subnet_ids):
180
268
  subnets.append(
181
- ec2.Subnet.from_subnet_id(self, f"Subnet-{subnet_id}", subnet_id)
269
+ ec2.Subnet.from_subnet_id(self, f"Subnet-{idx}", subnet_id)
182
270
  )
183
271
  return subnets
184
272
 
@@ -0,0 +1 @@
1
+ __version__ = "0.15.7"
@@ -1 +0,0 @@
1
- __version__ = "0.15.4"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes