cdk-factory 0.18.5__tar.gz → 0.18.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 (167) hide show
  1. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/PKG-INFO +1 -1
  2. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/pyproject.toml +1 -1
  3. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/standardized_ssm_mixin.py +39 -35
  4. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/auto_scaling/auto_scaling_stack_standardized.py +5 -26
  5. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/load_balancer/load_balancer_stack.py +47 -29
  6. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/rds/rds_stack.py +64 -47
  7. cdk_factory-0.18.7/src/cdk_factory/version.py +1 -0
  8. cdk_factory-0.18.5/src/cdk_factory/stack_library/auto_scaling/auto_scaling_old.py +0 -721
  9. cdk_factory-0.18.5/src/cdk_factory/version.py +0 -1
  10. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/.gitignore +0 -0
  11. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/.windsurfrules +0 -0
  12. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/LICENSE +0 -0
  13. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/README.md +0 -0
  14. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/REFACTORING_PLAN.md +0 -0
  15. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/archive/README.md +0 -0
  16. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/archive/migrate_to_enhanced_ssm.py +0 -0
  17. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/examples/json-imports/README.md +0 -0
  18. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/examples/separate-api-gateway/README.md +0 -0
  19. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/examples/separate-api-gateway/api-gateway-stack.json +0 -0
  20. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/examples/separate-api-gateway/config.json +0 -0
  21. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/examples/separate-api-gateway/lambda-stack.json +0 -0
  22. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/mypy.ini +0 -0
  23. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/publish_to_pypi.py +0 -0
  24. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/publish_to_pypi.sh +0 -0
  25. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/pysetup.py +0 -0
  26. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/pysetup.sh +0 -0
  27. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/requirements.dev.txt +0 -0
  28. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/requirements.tests.txt +0 -0
  29. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/requirements.txt +0 -0
  30. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/run-checks.sh +0 -0
  31. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/run-tests-clean-venv.sh +0 -0
  32. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/run-tests.sh +0 -0
  33. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/scripts/cloudfront-cleanup.sh +0 -0
  34. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/__init__.py +0 -0
  35. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/app.py +0 -0
  36. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/builds/README.md +0 -0
  37. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/cdk.json +0 -0
  38. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/cli.py +0 -0
  39. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/commands/command_loader.py +0 -0
  40. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/base_config.py +0 -0
  41. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/cdk_config.py +0 -0
  42. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/deployment.py +0 -0
  43. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/deployment_wave.py +0 -0
  44. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/devops.py +0 -0
  45. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/enhanced_base_config.py +0 -0
  46. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/enhanced_ssm_config.py +0 -0
  47. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/management.py +0 -0
  48. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/pipeline.py +0 -0
  49. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/pipeline_stage.py +0 -0
  50. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/_resources.py +0 -0
  51. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/acm.py +0 -0
  52. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/api_gateway.py +0 -0
  53. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/apigateway_route_config.py +0 -0
  54. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/auto_scaling.py +0 -0
  55. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/cloudfront.py +0 -0
  56. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/cloudwatch_widget.py +0 -0
  57. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/code_artifact.py +0 -0
  58. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/code_artifact_login.py +0 -0
  59. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/code_repository.py +0 -0
  60. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/cognito.py +0 -0
  61. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/docker.py +0 -0
  62. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/dynamodb.py +0 -0
  63. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/ecr.py +0 -0
  64. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/ecs_cluster.py +0 -0
  65. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/ecs_service.py +0 -0
  66. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/exisiting.py +0 -0
  67. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/lambda_edge.py +0 -0
  68. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/lambda_function.py +0 -0
  69. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/lambda_layers.py +0 -0
  70. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/lambda_triggers.py +0 -0
  71. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/load_balancer.py +0 -0
  72. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/monitoring.py +0 -0
  73. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/rds.py +0 -0
  74. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/resource_mapping.py +0 -0
  75. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/resource_naming.py +0 -0
  76. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/resource_types.py +0 -0
  77. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/route53.py +0 -0
  78. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/route53_hosted_zone.py +0 -0
  79. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/rum.py +0 -0
  80. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/s3.py +0 -0
  81. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/security_group.py +0 -0
  82. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/security_group_full_stack.py +0 -0
  83. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/sqs.py +0 -0
  84. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/vpc.py +0 -0
  85. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/stack.py +0 -0
  86. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/configurations/workload.py +0 -0
  87. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py +0 -0
  88. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/ecr/ecr_construct.py +0 -0
  89. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/lambda_function_construct.py +0 -0
  90. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/lambda_function_docker_construct.py +0 -0
  91. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/lambda_function_role_construct.py +0 -0
  92. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/policies/policy_docs.py +0 -0
  93. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/policies/policy_statements.py +0 -0
  94. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/s3_buckets/s3_bucket_construct.py +0 -0
  95. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py +0 -0
  96. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py +0 -0
  97. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/constructs/sqs/policies/sqs_policies.py +0 -0
  98. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/istack.py +0 -0
  99. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/live_ssm_resolver.py +0 -0
  100. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/networked_stack_mixin.py +0 -0
  101. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/vpc_provider_mixin.py +0 -0
  102. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/lambdas/edge/ip_gate/handler.py +0 -0
  103. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/lambdas/health_handler.py +0 -0
  104. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/path_utils.py +0 -0
  105. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/pipeline_factory.py +0 -0
  106. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/security/policies.py +0 -0
  107. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/security/roles.py +0 -0
  108. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/stage.py +0 -0
  109. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack/istack.py +0 -0
  110. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack/stack_factory.py +0 -0
  111. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack/stack_module_loader.py +0 -0
  112. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack/stack_module_registry.py +0 -0
  113. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack/stack_modules.py +0 -0
  114. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/__init__.py +0 -0
  115. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/acm/__init__.py +0 -0
  116. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/acm/acm_stack.py +0 -0
  117. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py +0 -0
  118. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/auto_scaling/__init__.py +0 -0
  119. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/aws_lambdas/lambda_stack.py +0 -0
  120. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/buckets/README.md +0 -0
  121. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/buckets/bucket_stack.py +0 -0
  122. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/cloudfront/__init__.py +0 -0
  123. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/cloudfront/cloudfront_stack.py +0 -0
  124. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/code_artifact/code_artifact_stack.py +0 -0
  125. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/cognito/cognito_stack.py +0 -0
  126. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/dynamodb/dynamodb_stack.py +0 -0
  127. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecr/README.md +0 -0
  128. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecr/ecr_stack.py +0 -0
  129. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecs/__init__.py +0 -0
  130. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecs/ecs_cluster_stack_standardized.py +0 -0
  131. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecs/ecs_service_stack.py +0 -0
  132. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/lambda_edge/__init__.py +0 -0
  133. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py +0 -0
  134. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/load_balancer/__init__.py +0 -0
  135. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/monitoring/__init__.py +0 -0
  136. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/monitoring/monitoring_stack.py +0 -0
  137. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/rds/__init__.py +0 -0
  138. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/route53/__init__.py +0 -0
  139. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/route53/route53_stack.py +0 -0
  140. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/rum/__init__.py +0 -0
  141. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/rum/rum_stack.py +0 -0
  142. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/security_group/__init__.py +0 -0
  143. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/security_group/security_group_full_stack.py +0 -0
  144. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/security_group/security_group_stack.py +0 -0
  145. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/simple_queue_service/sqs_stack.py +0 -0
  146. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/stack_base.py +0 -0
  147. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/vpc/__init__.py +0 -0
  148. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/vpc/vpc_stack_standardized.py +0 -0
  149. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/websites/static_website_stack.py +0 -0
  150. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/stages/websites/static_website_stage.py +0 -0
  151. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/templates/README.md +0 -0
  152. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/templates/app.py.template +0 -0
  153. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/templates/cdk.json.template +0 -0
  154. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/api_gateway_integration_utility.py +0 -0
  155. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/commandline_args.py +0 -0
  156. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/configuration_loader.py +0 -0
  157. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/docker_utilities.py +0 -0
  158. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/environment_services.py +0 -0
  159. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/file_operations.py +0 -0
  160. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/git_utilities.py +0 -0
  161. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/json_loading_utility.py +0 -0
  162. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/lambda_function_utilities.py +0 -0
  163. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utilities/os_execute.py +0 -0
  164. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/utils/api_gateway_utilities.py +0 -0
  165. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/validation/config_validator.py +0 -0
  166. {cdk_factory-0.18.5 → cdk_factory-0.18.7}/src/cdk_factory/workload/workload_factory.py +0 -0
  167. {cdk_factory-0.18.5 → cdk_factory-0.18.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.18.5
3
+ Version: 0.18.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.18.5"
36
+ version = "0.18.7"
37
37
  authors = [
38
38
  { name="Eric Wilson", email="eric.wilson@geekcafe.com" }
39
39
  ]
@@ -531,6 +531,44 @@ class StandardizedSsmMixin:
531
531
  return self._ssm_exported_values.copy()
532
532
 
533
533
 
534
+ def get_subnet_ids(self, config) -> List[str]:
535
+ """
536
+ Helper function to parse subnet IDs from SSM imports.
537
+
538
+ This common pattern handles:
539
+ 1. Comma-separated subnet ID strings from SSM
540
+ 2. List of subnet IDs from SSM
541
+ 3. Fallback to config attributes
542
+
543
+ Args:
544
+ config: Configuration object that might have subnet_ids attribute
545
+
546
+ Returns:
547
+ List of subnet IDs (empty list if not found or invalid format)
548
+ """
549
+ # Use the standardized SSM imports
550
+ ssm_imports = self.get_all_ssm_imports()
551
+ if "subnet_ids" in ssm_imports:
552
+ subnet_ids = ssm_imports["subnet_ids"]
553
+
554
+ # Handle comma-separated string or list
555
+ if isinstance(subnet_ids, str):
556
+ # Split comma-separated string
557
+ parsed_ids = [sid.strip() for sid in subnet_ids.split(',') if sid.strip()]
558
+ return parsed_ids
559
+ elif isinstance(subnet_ids, list):
560
+ return subnet_ids
561
+ else:
562
+ logger.warning(f"Unexpected subnet_ids type: {type(subnet_ids)}")
563
+ return []
564
+
565
+ # Fallback: Check config attributes
566
+ elif hasattr(config, 'subnet_ids') and config.subnet_ids:
567
+ return config.subnet_ids
568
+
569
+ else:
570
+ logger.warning("No subnet IDs found, using default behavior")
571
+ return []
534
572
 
535
573
  class ValidationResult:
536
574
  """Result of configuration validation."""
@@ -614,38 +652,4 @@ class SsmStandardValidator:
614
652
  return errors
615
653
 
616
654
 
617
- def parse_subnet_ids_from_ssm(self, subnet_ids_key: str = "subnet_ids") -> List[str]:
618
- """
619
- Helper function to parse subnet IDs from SSM imports.
620
-
621
- This common pattern handles:
622
- 1. Comma-separated subnet ID strings from SSM
623
- 2. List of subnet IDs from SSM
624
- 3. CDK Token resolution for deployment-time values
625
-
626
- Args:
627
- subnet_ids_key: The key used for subnet IDs in SSM imports (default: "subnet_ids")
628
-
629
- Returns:
630
- List of subnet IDs (empty list if not found or invalid format)
631
- """
632
- ssm_imports = self.get_all_ssm_imports()
633
-
634
- if subnet_ids_key not in ssm_imports:
635
- logger.warning(f"No subnet IDs found in SSM imports with key: {subnet_ids_key}")
636
- return []
637
-
638
- subnet_ids = ssm_imports[subnet_ids_key]
639
-
640
- # Handle comma-separated string or list
641
- if isinstance(subnet_ids, str):
642
- # Split comma-separated string
643
- parsed_ids = [sid.strip() for sid in subnet_ids.split(',') if sid.strip()]
644
- logger.info(f"Parsed {len(parsed_ids)} subnet IDs from comma-separated string")
645
- return parsed_ids
646
- elif isinstance(subnet_ids, list):
647
- logger.info(f"Using {len(subnet_ids)} subnet IDs from list")
648
- return subnet_ids
649
- else:
650
- logger.warning(f"Unexpected subnet_ids type: {type(subnet_ids)}")
651
- return []
655
+
@@ -211,33 +211,12 @@ class AutoScalingStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
211
211
  Get subnet IDs using standardized SSM approach.
212
212
  """
213
213
  # Primary method: Use standardized SSM imports
214
- ssm_imports = self._get_ssm_imports()
215
-
216
- if "subnet_ids" in ssm_imports:
217
- subnet_ids = ssm_imports["subnet_ids"]
218
-
219
- # Handle comma-separated string or list
220
- if isinstance(subnet_ids, str):
221
- # Split comma-separated string
222
- parsed_ids = [sid.strip() for sid in subnet_ids.split(',') if sid.strip()]
223
- return parsed_ids
224
- elif isinstance(subnet_ids, list):
225
- return subnet_ids
226
- else:
227
- logger.warning(f"Unexpected subnet_ids type: {type(subnet_ids)}")
228
- return []
229
-
230
- # Fallback: Use VPC provider mixin (backward compatibility)
231
- elif hasattr(self, '_get_subnets_from_provider'):
232
- return self._get_subnets_from_provider()
233
-
234
- # Final fallback: Direct configuration
235
- elif hasattr(self.asg_config, 'subnet_ids') and self.asg_config.subnet_ids:
236
- return self.asg_config.subnet_ids
214
+ # ssm_imports = self._get_ssm_imports()
215
+
216
+ subnet_ids = self.get_subnet_ids(self.asg_config)
237
217
 
238
- else:
239
- logger.warning("No subnet IDs found, using default behavior")
240
- return []
218
+ return subnet_ids
219
+
241
220
 
242
221
  def _create_instance_role(self, asg_name: str) -> iam.Role:
243
222
  """Create IAM role for EC2 instances"""
@@ -77,8 +77,18 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
77
77
  )
78
78
  lb_name = deployment.build_resource_name(self.lb_config.name)
79
79
 
80
- # Process SSM imports first
81
- self._process_ssm_imports()
80
+ # Setup standardized SSM integration
81
+ self.setup_standardized_ssm_integration(
82
+ scope=self,
83
+ config=self.lb_config,
84
+ resource_type="load_balancer",
85
+ resource_name=self.lb_config.name,
86
+ deployment=deployment,
87
+ workload=workload
88
+ )
89
+
90
+ # Process SSM imports
91
+ self.process_standardized_ssm_imports()
82
92
 
83
93
  self._prep_dns()
84
94
 
@@ -156,16 +166,22 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
156
166
 
157
167
  # If subnets is None, check if we have SSM-imported subnet_ids as a token
158
168
  # We need to use Fn.Split to convert the comma-separated string to an array
159
- if subnets is None and "subnet_ids" in self.ssm_imported_values:
160
- subnet_ids_value = self.ssm_imported_values["subnet_ids"]
161
- if cdk.Token.is_unresolved(subnet_ids_value):
162
- logger.info("Using Fn.Split to convert comma-separated subnet IDs token to array")
163
- # Use CloudFormation escape hatch to set Subnets property with Fn.Split
164
- cfn_lb = load_balancer.node.default_child
165
- cfn_lb.add_property_override(
166
- "Subnets",
167
- cdk.Fn.split(",", subnet_ids_value)
168
- )
169
+ if subnets is None:
170
+ subnet_ids = self.get_subnet_ids(self.lb_config)
171
+ if subnet_ids:
172
+ # For CloudFormation token resolution, we still need Fn.split
173
+ # but we use the helper to determine if subnet IDs are available
174
+ ssm_imports = self.get_all_ssm_imports()
175
+ if "subnet_ids" in ssm_imports:
176
+ subnet_ids_value = ssm_imports["subnet_ids"]
177
+ if cdk.Token.is_unresolved(subnet_ids_value):
178
+ logger.info("Using Fn.Split to convert comma-separated subnet IDs token to array")
179
+ # Use CloudFormation escape hatch to set Subnets property with Fn.Split
180
+ cfn_lb = load_balancer.node.default_child
181
+ cfn_lb.add_property_override(
182
+ "Subnets",
183
+ cdk.Fn.split(",", subnet_ids_value)
184
+ )
169
185
 
170
186
  # Add tags
171
187
  for key, value in self.lb_config.tags.items():
@@ -261,9 +277,16 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
261
277
  """Get subnets for the Load Balancer"""
262
278
  subnets = []
263
279
 
264
- # Check SSM imported values first
265
- if "subnet_ids" in self.ssm_imported_values:
266
- subnet_ids_value = self.ssm_imported_values["subnet_ids"]
280
+ # Use the standardized helper function to get subnet IDs
281
+ subnet_ids = self.get_subnet_ids(self.lb_config)
282
+
283
+ if not subnet_ids:
284
+ return None
285
+
286
+ # Check if we have unresolved tokens from SSM
287
+ ssm_imports = self.get_all_ssm_imports()
288
+ if "subnet_ids" in ssm_imports:
289
+ subnet_ids_value = ssm_imports["subnet_ids"]
267
290
 
268
291
  # Check if this is a CDK token (unresolved SSM parameter)
269
292
  if cdk.Token.is_unresolved(subnet_ids_value):
@@ -272,19 +295,8 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
272
295
  # The ALB construct will handle the token-based subnet IDs
273
296
  logger.info("Subnet IDs are unresolved tokens, will use vpc_subnets with token resolution")
274
297
  return None
275
- elif isinstance(subnet_ids_value, str):
276
- # If it's a resolved string, split it
277
- subnet_ids = [s.strip() for s in subnet_ids_value.split(',')]
278
- elif isinstance(subnet_ids_value, list):
279
- subnet_ids = subnet_ids_value
280
- else:
281
- subnet_ids = [subnet_ids_value]
282
- else:
283
- subnet_ids = self.lb_config.subnets
284
-
285
- if not subnet_ids:
286
- return None
287
298
 
299
+ # Convert subnet IDs to subnet objects
288
300
  for idx, subnet_id in enumerate(subnet_ids):
289
301
  subnets.append(
290
302
  ec2.Subnet.from_subnet_id(self, f"Subnet-{idx}", subnet_id)
@@ -373,6 +385,11 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
373
385
  if protocol.upper() == "HTTPS":
374
386
  certificates = self._get_certificates()
375
387
 
388
+ if not certificates and protocol.upper() == "HTTPS":
389
+ message = "No certificates found for HTTPS listener. Please attach a certificate or create a certificate stack."
390
+ logger.warning(message)
391
+ raise ValueError(message)
392
+
376
393
  listener = elbv2.ApplicationListener(
377
394
  self,
378
395
  listener_id,
@@ -425,8 +442,9 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
425
442
  certificates = []
426
443
 
427
444
  # Check SSM imported values first (takes priority)
428
- if "certificate_arns" in self.ssm_imported_values:
429
- cert_arns = self.ssm_imported_values["certificate_arns"]
445
+ ssm_imports = self.get_all_ssm_imports()
446
+ if "certificate_arns" in ssm_imports:
447
+ cert_arns = ssm_imports["certificate_arns"]
430
448
  if not isinstance(cert_arns, list):
431
449
  cert_arns = [cert_arns]
432
450
  for cert_arn in cert_arns:
@@ -69,8 +69,18 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
69
69
  self.rds_config = RdsConfig(stack_config.dictionary.get("rds", {}), deployment)
70
70
  db_name = deployment.build_resource_name(self.rds_config.name)
71
71
 
72
- # Process SSM imports first
73
- self._process_ssm_imports()
72
+ # Setup standardized SSM integration
73
+ self.setup_standardized_ssm_integration(
74
+ scope=self,
75
+ config=self.rds_config,
76
+ resource_type="rds",
77
+ resource_name=self.rds_config.name,
78
+ deployment=deployment,
79
+ workload=workload
80
+ )
81
+
82
+ # Process SSM imports
83
+ self.process_standardized_ssm_imports()
74
84
 
75
85
  # Get VPC and security groups
76
86
  self.security_groups = self._get_security_groups()
@@ -87,40 +97,13 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
87
97
  # Export to SSM Parameter Store
88
98
  self._export_ssm_parameters(db_name)
89
99
 
90
- def _process_ssm_imports(self) -> None:
91
- """Process SSM imports from configuration"""
92
- ssm_imports = self.rds_config.ssm_imports
93
-
94
- if not ssm_imports:
95
- logger.debug("No SSM imports configured for RDS")
96
- return
97
-
98
- logger.info(f"Processing {len(ssm_imports)} SSM imports for RDS")
99
-
100
- for param_key, param_path in ssm_imports.items():
101
- try:
102
- if not param_path.startswith('/'):
103
- param_path = f"/{param_path}"
104
-
105
- construct_id = f"ssm-import-{param_key}-{hash(param_path) % 10000}"
106
- param = ssm.StringParameter.from_string_parameter_name(
107
- self, construct_id, param_path
108
- )
109
-
110
- self.ssm_imported_values[param_key] = param.string_value
111
- logger.info(f"Imported SSM parameter: {param_key} from {param_path}")
112
-
113
- except Exception as e:
114
- logger.error(f"Failed to import SSM parameter {param_key} from {param_path}: {e}")
115
- raise
116
-
117
100
  @property
118
101
  def vpc(self) -> ec2.IVpc:
119
102
  """Get the VPC for the RDS instance using centralized VPC provider mixin."""
120
- if self._vpc:
103
+ if hasattr(self, '_vpc') and self._vpc:
121
104
  return self._vpc
122
105
 
123
- # Use the centralized VPC resolution from VPCProviderMixin
106
+ # Resolve VPC using the centralized VPC provider mixin
124
107
  self._vpc = self.resolve_vpc(
125
108
  config=self.rds_config,
126
109
  deployment=self.deployment,
@@ -133,8 +116,9 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
133
116
  security_groups = []
134
117
 
135
118
  # Check SSM imports first for security group ID
136
- if "security_group_rds_id" in self.ssm_imported_values:
137
- sg_id = self.ssm_imported_values["security_group_rds_id"]
119
+ ssm_imports = self.get_all_ssm_imports()
120
+ if "security_group_rds_id" in ssm_imports:
121
+ sg_id = ssm_imports["security_group_rds_id"]
138
122
  security_groups.append(
139
123
  ec2.SecurityGroup.from_security_group_id(
140
124
  self, "RDSSecurityGroup", sg_id
@@ -151,27 +135,60 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
151
135
 
152
136
  return security_groups
153
137
 
138
+ def _get_subnet_selection(self) -> ec2.SubnetSelection:
139
+ """
140
+ Get subnet selection based on available subnet types in the VPC.
141
+
142
+ RDS instances require private subnets for security, but we'll fall back
143
+ to available subnets if the preferred types aren't available.
144
+ """
145
+ vpc = self.vpc
146
+
147
+ # Check for isolated subnets first (most secure for RDS)
148
+ if vpc.isolated_subnets:
149
+ logger.info("Using isolated subnets for RDS instance")
150
+ return ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_ISOLATED)
151
+
152
+ # Check for private subnets next
153
+ elif vpc.private_subnets:
154
+ logger.info("Using private subnets for RDS instance")
155
+ return ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS)
156
+
157
+ # Fall back to public subnets (not recommended for production)
158
+ elif vpc.public_subnets:
159
+ logger.warning("Using public subnets for RDS instance - not recommended for production")
160
+ return ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC)
161
+
162
+ else:
163
+ raise ValueError("No subnets available in VPC for RDS instance")
164
+
154
165
  def _create_db_instance(self, db_name: str) -> rds.DatabaseInstance:
155
166
  """Create a new RDS instance"""
156
167
  # Configure subnet group
157
168
  # If we have subnet IDs from SSM, create a DB subnet group explicitly
158
169
  db_subnet_group = None
159
- if "subnet_ids" in self.ssm_imported_values:
160
- subnet_ids_str = self.ssm_imported_values["subnet_ids"]
161
- # Split the comma-separated token into a list
162
- subnet_ids_list = cdk.Fn.split(",", subnet_ids_str)
163
-
164
- # Create DB subnet group with the token-based subnet list
165
- db_subnet_group = rds.CfnDBSubnetGroup(
166
- self,
167
- "DBSubnetGroup",
168
- db_subnet_group_description=f"Subnet group for {db_name}",
169
- subnet_ids=subnet_ids_list,
170
- db_subnet_group_name=f"{db_name}-subnet-group"
171
- )
170
+ subnet_ids = self.get_subnet_ids(self.rds_config)
171
+
172
+ if subnet_ids:
173
+ # For CloudFormation token resolution, we need to get the raw SSM value
174
+ # Use the standardized SSM imports
175
+ ssm_imports = self.get_all_ssm_imports()
176
+ if "subnet_ids" in ssm_imports:
177
+ subnet_ids_str = ssm_imports["subnet_ids"]
178
+ # Split the comma-separated token into a list for CloudFormation
179
+ subnet_ids_list = cdk.Fn.split(",", subnet_ids_str)
180
+
181
+ # Create DB subnet group with the token-based subnet list
182
+ db_subnet_group = rds.CfnDBSubnetGroup(
183
+ self,
184
+ "DBSubnetGroup",
185
+ db_subnet_group_description=f"Subnet group for {db_name}",
186
+ subnet_ids=subnet_ids_list,
187
+ db_subnet_group_name=f"{db_name}-subnet-group"
188
+ )
172
189
 
173
190
  # Configure subnet selection for VPC (when not using SSM imports)
174
- subnets = None if db_subnet_group else ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_ISOLATED)
191
+ subnets = None if db_subnet_group else self._get_subnet_selection()
175
192
 
176
193
  # Configure engine
177
194
  engine_version = None
@@ -0,0 +1 @@
1
+ __version__ = "0.18.7"