cdk-factory 0.18.4__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.4 → cdk_factory-0.18.7}/PKG-INFO +1 -1
  2. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/pyproject.toml +1 -1
  3. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/standardized_ssm_mixin.py +43 -0
  4. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/auto_scaling/auto_scaling_stack_standardized.py +17 -23
  5. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/load_balancer/load_balancer_stack.py +47 -29
  6. {cdk_factory-0.18.4 → 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.4/src/cdk_factory/stack_library/auto_scaling/auto_scaling_old.py +0 -721
  9. cdk_factory-0.18.4/src/cdk_factory/version.py +0 -1
  10. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/.gitignore +0 -0
  11. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/.windsurfrules +0 -0
  12. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/LICENSE +0 -0
  13. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/README.md +0 -0
  14. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/REFACTORING_PLAN.md +0 -0
  15. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/archive/README.md +0 -0
  16. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/archive/migrate_to_enhanced_ssm.py +0 -0
  17. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/examples/json-imports/README.md +0 -0
  18. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/examples/separate-api-gateway/README.md +0 -0
  19. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/examples/separate-api-gateway/api-gateway-stack.json +0 -0
  20. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/examples/separate-api-gateway/config.json +0 -0
  21. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/examples/separate-api-gateway/lambda-stack.json +0 -0
  22. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/mypy.ini +0 -0
  23. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/publish_to_pypi.py +0 -0
  24. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/publish_to_pypi.sh +0 -0
  25. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/pysetup.py +0 -0
  26. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/pysetup.sh +0 -0
  27. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/requirements.dev.txt +0 -0
  28. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/requirements.tests.txt +0 -0
  29. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/requirements.txt +0 -0
  30. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/run-checks.sh +0 -0
  31. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/run-tests-clean-venv.sh +0 -0
  32. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/run-tests.sh +0 -0
  33. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/scripts/cloudfront-cleanup.sh +0 -0
  34. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/__init__.py +0 -0
  35. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/app.py +0 -0
  36. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/builds/README.md +0 -0
  37. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/cdk.json +0 -0
  38. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/cli.py +0 -0
  39. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/commands/command_loader.py +0 -0
  40. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/base_config.py +0 -0
  41. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/cdk_config.py +0 -0
  42. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/deployment.py +0 -0
  43. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/deployment_wave.py +0 -0
  44. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/devops.py +0 -0
  45. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/enhanced_base_config.py +0 -0
  46. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/enhanced_ssm_config.py +0 -0
  47. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/management.py +0 -0
  48. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/pipeline.py +0 -0
  49. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/pipeline_stage.py +0 -0
  50. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/_resources.py +0 -0
  51. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/acm.py +0 -0
  52. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/api_gateway.py +0 -0
  53. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/apigateway_route_config.py +0 -0
  54. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/auto_scaling.py +0 -0
  55. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/cloudfront.py +0 -0
  56. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/cloudwatch_widget.py +0 -0
  57. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/code_artifact.py +0 -0
  58. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/code_artifact_login.py +0 -0
  59. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/code_repository.py +0 -0
  60. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/cognito.py +0 -0
  61. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/docker.py +0 -0
  62. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/dynamodb.py +0 -0
  63. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/ecr.py +0 -0
  64. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/ecs_cluster.py +0 -0
  65. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/ecs_service.py +0 -0
  66. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/exisiting.py +0 -0
  67. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/lambda_edge.py +0 -0
  68. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/lambda_function.py +0 -0
  69. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/lambda_layers.py +0 -0
  70. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/lambda_triggers.py +0 -0
  71. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/load_balancer.py +0 -0
  72. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/monitoring.py +0 -0
  73. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/rds.py +0 -0
  74. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/resource_mapping.py +0 -0
  75. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/resource_naming.py +0 -0
  76. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/resource_types.py +0 -0
  77. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/route53.py +0 -0
  78. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/route53_hosted_zone.py +0 -0
  79. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/rum.py +0 -0
  80. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/s3.py +0 -0
  81. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/security_group.py +0 -0
  82. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/security_group_full_stack.py +0 -0
  83. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/sqs.py +0 -0
  84. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/resources/vpc.py +0 -0
  85. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/stack.py +0 -0
  86. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/configurations/workload.py +0 -0
  87. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py +0 -0
  88. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/ecr/ecr_construct.py +0 -0
  89. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/lambda_function_construct.py +0 -0
  90. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/lambda_function_docker_construct.py +0 -0
  91. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/lambda_function_role_construct.py +0 -0
  92. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/policies/policy_docs.py +0 -0
  93. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/lambdas/policies/policy_statements.py +0 -0
  94. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/s3_buckets/s3_bucket_construct.py +0 -0
  95. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py +0 -0
  96. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py +0 -0
  97. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/constructs/sqs/policies/sqs_policies.py +0 -0
  98. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/istack.py +0 -0
  99. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/live_ssm_resolver.py +0 -0
  100. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/networked_stack_mixin.py +0 -0
  101. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/interfaces/vpc_provider_mixin.py +0 -0
  102. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/lambdas/edge/ip_gate/handler.py +0 -0
  103. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/lambdas/health_handler.py +0 -0
  104. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/path_utils.py +0 -0
  105. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/pipeline_factory.py +0 -0
  106. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/security/policies.py +0 -0
  107. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/security/roles.py +0 -0
  108. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/pipeline/stage.py +0 -0
  109. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack/istack.py +0 -0
  110. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack/stack_factory.py +0 -0
  111. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack/stack_module_loader.py +0 -0
  112. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack/stack_module_registry.py +0 -0
  113. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack/stack_modules.py +0 -0
  114. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/__init__.py +0 -0
  115. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/acm/__init__.py +0 -0
  116. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/acm/acm_stack.py +0 -0
  117. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py +0 -0
  118. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/auto_scaling/__init__.py +0 -0
  119. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/aws_lambdas/lambda_stack.py +0 -0
  120. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/buckets/README.md +0 -0
  121. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/buckets/bucket_stack.py +0 -0
  122. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/cloudfront/__init__.py +0 -0
  123. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/cloudfront/cloudfront_stack.py +0 -0
  124. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/code_artifact/code_artifact_stack.py +0 -0
  125. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/cognito/cognito_stack.py +0 -0
  126. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/dynamodb/dynamodb_stack.py +0 -0
  127. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecr/README.md +0 -0
  128. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecr/ecr_stack.py +0 -0
  129. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecs/__init__.py +0 -0
  130. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecs/ecs_cluster_stack_standardized.py +0 -0
  131. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/ecs/ecs_service_stack.py +0 -0
  132. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/lambda_edge/__init__.py +0 -0
  133. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py +0 -0
  134. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/load_balancer/__init__.py +0 -0
  135. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/monitoring/__init__.py +0 -0
  136. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/monitoring/monitoring_stack.py +0 -0
  137. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/rds/__init__.py +0 -0
  138. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/route53/__init__.py +0 -0
  139. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/route53/route53_stack.py +0 -0
  140. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/rum/__init__.py +0 -0
  141. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/rum/rum_stack.py +0 -0
  142. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/security_group/__init__.py +0 -0
  143. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/security_group/security_group_full_stack.py +0 -0
  144. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/security_group/security_group_stack.py +0 -0
  145. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/simple_queue_service/sqs_stack.py +0 -0
  146. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/stack_base.py +0 -0
  147. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/vpc/__init__.py +0 -0
  148. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/vpc/vpc_stack_standardized.py +0 -0
  149. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stack_library/websites/static_website_stack.py +0 -0
  150. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/stages/websites/static_website_stage.py +0 -0
  151. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/templates/README.md +0 -0
  152. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/templates/app.py.template +0 -0
  153. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/templates/cdk.json.template +0 -0
  154. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/api_gateway_integration_utility.py +0 -0
  155. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/commandline_args.py +0 -0
  156. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/configuration_loader.py +0 -0
  157. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/docker_utilities.py +0 -0
  158. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/environment_services.py +0 -0
  159. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/file_operations.py +0 -0
  160. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/git_utilities.py +0 -0
  161. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/json_loading_utility.py +0 -0
  162. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/lambda_function_utilities.py +0 -0
  163. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utilities/os_execute.py +0 -0
  164. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/utils/api_gateway_utilities.py +0 -0
  165. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/validation/config_validator.py +0 -0
  166. {cdk_factory-0.18.4 → cdk_factory-0.18.7}/src/cdk_factory/workload/workload_factory.py +0 -0
  167. {cdk_factory-0.18.4 → 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.4
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.4"
36
+ version = "0.18.7"
37
37
  authors = [
38
38
  { name="Eric Wilson", email="eric.wilson@geekcafe.com" }
39
39
  ]
@@ -24,6 +24,8 @@ import os
24
24
  import re
25
25
  from typing import Dict, Any, Optional, List, Union
26
26
  from aws_cdk import aws_ssm as ssm
27
+ from aws_cdk import aws_ec2 as ec2
28
+ from aws_cdk import aws_ecs as ecs
27
29
  from constructs import Construct
28
30
  from aws_lambda_powertools import Logger
29
31
  from cdk_factory.configurations.deployment import DeploymentConfig
@@ -529,6 +531,44 @@ class StandardizedSsmMixin:
529
531
  return self._ssm_exported_values.copy()
530
532
 
531
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 []
532
572
 
533
573
  class ValidationResult:
534
574
  """Result of configuration validation."""
@@ -610,3 +650,6 @@ class SsmStandardValidator:
610
650
  errors.append(f"{context}: SSM path should use template variables: {path}")
611
651
 
612
652
  return errors
653
+
654
+
655
+
@@ -211,21 +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
- if "subnet_ids" in ssm_imports:
216
- return ssm_imports["subnet_ids"]
217
-
218
- # Fallback: Use VPC provider mixin (backward compatibility)
219
- elif hasattr(self, '_get_subnets_from_provider'):
220
- return self._get_subnets_from_provider()
221
-
222
- # Final fallback: Direct configuration
223
- elif hasattr(self.asg_config, 'subnet_ids') and self.asg_config.subnet_ids:
224
- return self.asg_config.subnet_ids
214
+ # ssm_imports = self._get_ssm_imports()
215
+
216
+ subnet_ids = self.get_subnet_ids(self.asg_config)
225
217
 
226
- else:
227
- logger.warning("No subnet IDs found, using default behavior")
228
- return []
218
+ return subnet_ids
219
+
229
220
 
230
221
  def _create_instance_role(self, asg_name: str) -> iam.Role:
231
222
  """Create IAM role for EC2 instances"""
@@ -497,18 +488,21 @@ class AutoScalingStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
497
488
  # Get the underlying CloudFormation resource to add update policy
498
489
  cfn_asg = self.auto_scaling_group.node.default_child
499
490
 
500
- # Get existing update policy or create new one
501
- existing_policy = getattr(cfn_asg, 'update_policy', {})
491
+ # Get CDK's default policy first (if any)
492
+ default_policy = getattr(cfn_asg, 'update_policy', {})
502
493
 
503
- # Merge rolling update policy with existing policy
504
- existing_policy["AutoScalingRollingUpdate"] = {
505
- "MinInstancesInService": update_policy.get("min_instances_in_service", 1),
506
- "MaxBatchSize": update_policy.get("max_batch_size", 1),
507
- "PauseTime": f"PT{update_policy.get('pause_time', 300)}S"
494
+ # Merge with defaults, then use the robust add_override method
495
+ merged_policy = {
496
+ **default_policy, # Preserve CDK defaults
497
+ "AutoScalingRollingUpdate": {
498
+ "MinInstancesInService": update_policy.get("min_instances_in_service", 1),
499
+ "MaxBatchSize": update_policy.get("max_batch_size", 1),
500
+ "PauseTime": f"PT{update_policy.get('pause_time', 300)}S"
501
+ }
508
502
  }
509
503
 
510
- # Set the merged policy
511
- cfn_asg.update_policy = existing_policy
504
+ # Use the robust CDK-documented approach
505
+ cfn_asg.add_override("UpdatePolicy", merged_policy)
512
506
 
513
507
  logger.info("Added rolling update policy to Auto Scaling Group")
514
508
 
@@ -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"