cdk-factory 0.15.23__tar.gz → 0.16.4__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 (161) hide show
  1. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/PKG-INFO +1 -1
  2. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/pyproject.toml +1 -1
  3. cdk_factory-0.16.4/src/cdk_factory/configurations/resources/acm.py +78 -0
  4. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/load_balancer.py +14 -0
  5. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/rds.py +11 -0
  6. cdk_factory-0.16.4/src/cdk_factory/stack_library/acm/__init__.py +6 -0
  7. cdk_factory-0.16.4/src/cdk_factory/stack_library/acm/acm_stack.py +169 -0
  8. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/load_balancer/load_balancer_stack.py +13 -2
  9. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/rds/rds_stack.py +9 -0
  10. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/route53/route53_stack.py +6 -1
  11. cdk_factory-0.16.4/src/cdk_factory/version.py +1 -0
  12. cdk_factory-0.15.23/src/cdk_factory/version.py +0 -1
  13. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/.gitignore +0 -0
  14. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/.windsurfrules +0 -0
  15. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/LICENSE +0 -0
  16. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/README.md +0 -0
  17. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/archive/README.md +0 -0
  18. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/archive/migrate_to_enhanced_ssm.py +0 -0
  19. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/examples/json-imports/README.md +0 -0
  20. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/examples/separate-api-gateway/README.md +0 -0
  21. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/examples/separate-api-gateway/api-gateway-stack.json +0 -0
  22. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/examples/separate-api-gateway/config.json +0 -0
  23. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/examples/separate-api-gateway/lambda-stack.json +0 -0
  24. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/mypy.ini +0 -0
  25. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/publish_to_pypi.py +0 -0
  26. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/publish_to_pypi.sh +0 -0
  27. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/pysetup.py +0 -0
  28. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/pysetup.sh +0 -0
  29. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/requirements.dev.txt +0 -0
  30. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/requirements.tests.txt +0 -0
  31. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/requirements.txt +0 -0
  32. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/run-checks.sh +0 -0
  33. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/run-tests-clean-venv.sh +0 -0
  34. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/run-tests.sh +0 -0
  35. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/scripts/cloudfront-cleanup.sh +0 -0
  36. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/__init__.py +0 -0
  37. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/app.py +0 -0
  38. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/builds/README.md +0 -0
  39. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/cdk.json +0 -0
  40. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/cli.py +0 -0
  41. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/commands/command_loader.py +0 -0
  42. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/base_config.py +0 -0
  43. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/cdk_config.py +0 -0
  44. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/deployment.py +0 -0
  45. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/deployment_wave.py +0 -0
  46. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/devops.py +0 -0
  47. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/enhanced_base_config.py +0 -0
  48. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/enhanced_ssm_config.py +0 -0
  49. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/management.py +0 -0
  50. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/pipeline.py +0 -0
  51. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/pipeline_stage.py +0 -0
  52. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/_resources.py +0 -0
  53. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/api_gateway.py +0 -0
  54. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/apigateway_route_config.py +0 -0
  55. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/auto_scaling.py +0 -0
  56. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/cloudfront.py +0 -0
  57. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/cloudwatch_widget.py +0 -0
  58. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/code_artifact.py +0 -0
  59. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/code_artifact_login.py +0 -0
  60. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/code_repository.py +0 -0
  61. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/cognito.py +0 -0
  62. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/docker.py +0 -0
  63. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/dynamodb.py +0 -0
  64. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/ecr.py +0 -0
  65. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/ecs_service.py +0 -0
  66. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/exisiting.py +0 -0
  67. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/lambda_edge.py +0 -0
  68. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/lambda_function.py +0 -0
  69. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/lambda_layers.py +0 -0
  70. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/lambda_triggers.py +0 -0
  71. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/monitoring.py +0 -0
  72. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/resource_mapping.py +0 -0
  73. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/resource_naming.py +0 -0
  74. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/resource_types.py +0 -0
  75. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/route53.py +0 -0
  76. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/route53_hosted_zone.py +0 -0
  77. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/rum.py +0 -0
  78. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/s3.py +0 -0
  79. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/security_group.py +0 -0
  80. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/security_group_full_stack.py +0 -0
  81. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/sqs.py +0 -0
  82. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/resources/vpc.py +0 -0
  83. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/stack.py +0 -0
  84. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/configurations/workload.py +0 -0
  85. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py +0 -0
  86. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/ecr/ecr_construct.py +0 -0
  87. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/lambdas/lambda_function_construct.py +0 -0
  88. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/lambdas/lambda_function_docker_construct.py +0 -0
  89. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/lambdas/lambda_function_role_construct.py +0 -0
  90. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/lambdas/policies/policy_docs.py +0 -0
  91. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/lambdas/policies/policy_statements.py +0 -0
  92. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/s3_buckets/s3_bucket_construct.py +0 -0
  93. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py +0 -0
  94. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py +0 -0
  95. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/constructs/sqs/policies/sqs_policies.py +0 -0
  96. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/interfaces/enhanced_ssm_parameter_mixin.py +0 -0
  97. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/interfaces/istack.py +0 -0
  98. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/interfaces/live_ssm_resolver.py +0 -0
  99. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/interfaces/ssm_parameter_mixin.py +0 -0
  100. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/lambdas/edge/ip_gate/handler.py +0 -0
  101. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/lambdas/health_handler.py +0 -0
  102. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/pipeline/path_utils.py +0 -0
  103. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/pipeline/pipeline_factory.py +0 -0
  104. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/pipeline/security/policies.py +0 -0
  105. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/pipeline/security/roles.py +0 -0
  106. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/pipeline/stage.py +0 -0
  107. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack/istack.py +0 -0
  108. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack/stack_factory.py +0 -0
  109. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack/stack_module_loader.py +0 -0
  110. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack/stack_module_registry.py +0 -0
  111. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack/stack_modules.py +0 -0
  112. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/__init__.py +0 -0
  113. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py +0 -0
  114. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/auto_scaling/__init__.py +0 -0
  115. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/auto_scaling/auto_scaling_stack.py +0 -0
  116. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/aws_lambdas/lambda_stack.py +0 -0
  117. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/buckets/README.md +0 -0
  118. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/buckets/bucket_stack.py +0 -0
  119. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/cloudfront/__init__.py +0 -0
  120. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/cloudfront/cloudfront_stack.py +0 -0
  121. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/code_artifact/code_artifact_stack.py +0 -0
  122. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/cognito/cognito_stack.py +0 -0
  123. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/dynamodb/dynamodb_stack.py +0 -0
  124. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/ecr/README.md +0 -0
  125. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/ecr/ecr_stack.py +0 -0
  126. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/ecs/__init__.py +0 -0
  127. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/ecs/ecs_service_stack.py +0 -0
  128. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/lambda_edge/__init__.py +0 -0
  129. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py +0 -0
  130. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/load_balancer/__init__.py +0 -0
  131. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/monitoring/__init__.py +0 -0
  132. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/monitoring/monitoring_stack.py +0 -0
  133. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/rds/__init__.py +0 -0
  134. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/route53/__init__.py +0 -0
  135. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/rum/__init__.py +0 -0
  136. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/rum/rum_stack.py +0 -0
  137. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/security_group/__init__.py +0 -0
  138. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/security_group/security_group_full_stack.py +0 -0
  139. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/security_group/security_group_stack.py +0 -0
  140. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/simple_queue_service/sqs_stack.py +0 -0
  141. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/stack_base.py +0 -0
  142. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/vpc/__init__.py +0 -0
  143. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/vpc/vpc_stack.py +0 -0
  144. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stack_library/websites/static_website_stack.py +0 -0
  145. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/stages/websites/static_website_stage.py +0 -0
  146. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/templates/README.md +0 -0
  147. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/templates/app.py.template +0 -0
  148. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/templates/cdk.json.template +0 -0
  149. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/api_gateway_integration_utility.py +0 -0
  150. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/commandline_args.py +0 -0
  151. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/configuration_loader.py +0 -0
  152. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/docker_utilities.py +0 -0
  153. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/environment_services.py +0 -0
  154. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/file_operations.py +0 -0
  155. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/git_utilities.py +0 -0
  156. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/json_loading_utility.py +0 -0
  157. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/lambda_function_utilities.py +0 -0
  158. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utilities/os_execute.py +0 -0
  159. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/utils/api_gateway_utilities.py +0 -0
  160. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/src/cdk_factory/workload/workload_factory.py +0 -0
  161. {cdk_factory-0.15.23 → cdk_factory-0.16.4}/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.23
3
+ Version: 0.16.4
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.23"
36
+ version = "0.16.4"
37
37
  authors = [
38
38
  { name="Eric Wilson", email="eric.wilson@geekcafe.com" }
39
39
  ]
@@ -0,0 +1,78 @@
1
+ """
2
+ AcmConfig - supports ACM (AWS Certificate Manager) settings for AWS CDK.
3
+ Maintainers: Eric Wilson
4
+ MIT License. See Project Root for license information.
5
+ """
6
+
7
+ from typing import Any, Dict, List, Optional
8
+
9
+
10
+ class AcmConfig:
11
+ """
12
+ ACM Configuration - supports AWS Certificate Manager settings.
13
+ Each property reads from the config dict and provides a sensible default if not set.
14
+ """
15
+
16
+ def __init__(self, config: dict = None, deployment=None) -> None:
17
+ self.__config = config or {}
18
+ self.__deployment = deployment
19
+
20
+ @property
21
+ def name(self) -> str:
22
+ """Certificate configuration name"""
23
+ return self.__config.get("name", "certificate")
24
+
25
+ @property
26
+ def domain_name(self) -> str:
27
+ """Primary domain name for the certificate"""
28
+ domain = self.__config.get("domain_name")
29
+ if not domain:
30
+ raise ValueError("domain_name is required for ACM certificate")
31
+ return domain
32
+
33
+ @property
34
+ def subject_alternative_names(self) -> List[str]:
35
+ """Subject alternative names (SANs) for the certificate"""
36
+ sans = self.__config.get("subject_alternative_names", [])
37
+ # Also check for alternate_names for backward compatibility
38
+ if not sans:
39
+ sans = self.__config.get("alternate_names", [])
40
+ return sans
41
+
42
+ @property
43
+ def hosted_zone_id(self) -> Optional[str]:
44
+ """Route53 hosted zone ID for DNS validation"""
45
+ return self.__config.get("hosted_zone_id")
46
+
47
+ @property
48
+ def hosted_zone_name(self) -> Optional[str]:
49
+ """Route53 hosted zone name (used for looking up zone)"""
50
+ return self.__config.get("hosted_zone_name")
51
+
52
+ @property
53
+ def validation_method(self) -> str:
54
+ """Certificate validation method (DNS or EMAIL)"""
55
+ return self.__config.get("validation_method", "DNS")
56
+
57
+ @property
58
+ def certificate_transparency_logging_preference(self) -> Optional[str]:
59
+ """Certificate transparency logging preference (ENABLED or DISABLED)"""
60
+ return self.__config.get("certificate_transparency_logging_preference")
61
+
62
+ @property
63
+ def ssm_exports(self) -> Dict[str, str]:
64
+ """SSM parameter paths to export certificate details"""
65
+ exports = self.__config.get("ssm_exports", {})
66
+
67
+ # Provide default SSM export path if not specified
68
+ if not exports and self.__deployment:
69
+ exports = {
70
+ "certificate_arn": f"/{self.__deployment.environment}/{self.__deployment.workload_name}/certificate/arn"
71
+ }
72
+
73
+ return exports
74
+
75
+ @property
76
+ def tags(self) -> Dict[str, str]:
77
+ """Tags to apply to the certificate"""
78
+ return self.__config.get("tags", {})
@@ -151,3 +151,17 @@ class LoadBalancerConfig(EnhancedBaseConfig):
151
151
  if "ssm" in self.__config and "imports" in self.__config["ssm"]:
152
152
  return self.__config["ssm"]["imports"]
153
153
  return self.__config.get("ssm_imports", {})
154
+
155
+ @property
156
+ def ssm_exports(self) -> Dict[str, Any]:
157
+ """SSM parameter exports for the Load Balancer"""
158
+ # Check both nested and flat structures for backwards compatibility
159
+ if "ssm" in self.__config and "exports" in self.__config["ssm"]:
160
+ return self.__config["ssm"]["exports"]
161
+ return self.__config.get("ssm_exports", {})
162
+
163
+ @property
164
+ def ssm_parameters(self) -> Dict[str, Any]:
165
+ """SSM parameters for the Load Balancer (only exports, not imports)"""
166
+ # For LoadBalancer, only return exports to prevent trying to export imported values
167
+ return self.ssm_exports
@@ -155,6 +155,12 @@ class RdsConfig(EnhancedBaseConfig):
155
155
  """Allocated storage in GB"""
156
156
  # Ensure we return an integer
157
157
  return int(self.__config.get("allocated_storage", 20))
158
+
159
+ @property
160
+ def max_allocated_storage(self) -> Optional[int]:
161
+ """Maximum storage for auto-scaling in GB (enables storage auto-scaling if set)"""
162
+ max_storage = self.__config.get("max_allocated_storage")
163
+ return int(max_storage) if max_storage is not None else None
158
164
 
159
165
  @property
160
166
  def storage_encrypted(self) -> bool:
@@ -180,6 +186,11 @@ class RdsConfig(EnhancedBaseConfig):
180
186
  def enable_performance_insights(self) -> bool:
181
187
  """Whether to enable Performance Insights"""
182
188
  return self.__config.get("enable_performance_insights", True)
189
+
190
+ @property
191
+ def allow_major_version_upgrade(self) -> bool:
192
+ """Whether to allow major version upgrades"""
193
+ return self.__config.get("allow_major_version_upgrade", False)
183
194
 
184
195
  @property
185
196
  def subnet_group_name(self) -> str:
@@ -0,0 +1,6 @@
1
+ """
2
+ ACM Stack Module
3
+ """
4
+ from .acm_stack import AcmStack
5
+
6
+ __all__ = ["AcmStack"]
@@ -0,0 +1,169 @@
1
+ """
2
+ ACM (AWS Certificate Manager) Stack Pattern for CDK-Factory
3
+ Maintainers: Eric Wilson
4
+ MIT License. See Project Root for the license information.
5
+ """
6
+
7
+ from typing import Dict, Any, List, Optional
8
+
9
+ import aws_cdk as cdk
10
+ from aws_cdk import aws_certificatemanager as acm
11
+ from aws_cdk import aws_route53 as route53
12
+ from aws_lambda_powertools import Logger
13
+ from constructs import Construct
14
+
15
+ from cdk_factory.configurations.deployment import DeploymentConfig
16
+ from cdk_factory.configurations.stack import StackConfig
17
+ from cdk_factory.configurations.resources.acm import AcmConfig
18
+ from cdk_factory.interfaces.istack import IStack
19
+ from cdk_factory.interfaces.enhanced_ssm_parameter_mixin import EnhancedSsmParameterMixin
20
+ from cdk_factory.stack.stack_module_registry import register_stack
21
+ from cdk_factory.workload.workload_factory import WorkloadConfig
22
+
23
+ logger = Logger(service="AcmStack")
24
+
25
+
26
+ @register_stack("acm_stack")
27
+ @register_stack("certificate_stack")
28
+ class AcmStack(IStack, EnhancedSsmParameterMixin):
29
+ """
30
+ Reusable stack for AWS Certificate Manager.
31
+ Supports creating ACM certificates with DNS validation via Route53.
32
+ """
33
+
34
+ def __init__(self, scope: Construct, id: str, **kwargs) -> None:
35
+ super().__init__(scope, id, **kwargs)
36
+ self.acm_config = None
37
+ self.stack_config = None
38
+ self.deployment = None
39
+ self.workload = None
40
+ self.certificate = None
41
+ self.hosted_zone = None
42
+
43
+ def build(
44
+ self,
45
+ stack_config: StackConfig,
46
+ deployment: DeploymentConfig,
47
+ workload: WorkloadConfig,
48
+ ) -> None:
49
+ """Build the ACM Certificate stack"""
50
+ self._build(stack_config, deployment, workload)
51
+
52
+ def _build(
53
+ self,
54
+ stack_config: StackConfig,
55
+ deployment: DeploymentConfig,
56
+ workload: WorkloadConfig,
57
+ ) -> None:
58
+ """Internal build method for the ACM Certificate stack"""
59
+ self.stack_config = stack_config
60
+ self.deployment = deployment
61
+ self.workload = workload
62
+ self.acm_config = AcmConfig(
63
+ stack_config.dictionary.get("certificate", {}), deployment
64
+ )
65
+
66
+ cert_name = deployment.build_resource_name(self.acm_config.name)
67
+
68
+ # Get or import hosted zone for DNS validation
69
+ if self.acm_config.hosted_zone_id:
70
+ self.hosted_zone = self._get_hosted_zone()
71
+
72
+ # Create the certificate
73
+ self.certificate = self._create_certificate(cert_name)
74
+
75
+ # Export certificate ARN to SSM
76
+ self._export_certificate_arn(cert_name)
77
+
78
+ # Add outputs
79
+ self._add_outputs(cert_name)
80
+
81
+ def _get_hosted_zone(self) -> route53.IHostedZone:
82
+ """Get the Route53 hosted zone for DNS validation"""
83
+ if self.acm_config.hosted_zone_id:
84
+ return route53.HostedZone.from_hosted_zone_attributes(
85
+ self,
86
+ "HostedZone",
87
+ hosted_zone_id=self.acm_config.hosted_zone_id,
88
+ zone_name=self.acm_config.domain_name,
89
+ )
90
+ else:
91
+ raise ValueError(
92
+ "hosted_zone_id is required for DNS validation. "
93
+ "Provide it in the certificate configuration."
94
+ )
95
+
96
+ def _create_certificate(self, cert_name: str) -> acm.Certificate:
97
+ """Create an ACM certificate with DNS validation"""
98
+
99
+ # Prepare certificate properties
100
+ cert_props = {
101
+ "domain_name": self.acm_config.domain_name,
102
+ }
103
+
104
+ # Add DNS validation if hosted zone is available
105
+ if self.hosted_zone:
106
+ cert_props["validation"] = acm.CertificateValidation.from_dns(
107
+ self.hosted_zone
108
+ )
109
+
110
+ # Add subject alternative names if provided
111
+ if self.acm_config.subject_alternative_names:
112
+ cert_props["subject_alternative_names"] = (
113
+ self.acm_config.subject_alternative_names
114
+ )
115
+
116
+ certificate = acm.Certificate(
117
+ self,
118
+ cert_name,
119
+ **cert_props
120
+ )
121
+
122
+ # Add tags
123
+ for key, value in self.acm_config.tags.items():
124
+ cdk.Tags.of(certificate).add(key, value)
125
+
126
+ logger.info(f"Created certificate for domain: {self.acm_config.domain_name}")
127
+
128
+ return certificate
129
+
130
+ def _export_certificate_arn(self, cert_name: str) -> None:
131
+ """Export certificate ARN to SSM Parameter Store"""
132
+ ssm_exports = self.acm_config.ssm_exports
133
+
134
+ if not ssm_exports:
135
+ logger.debug("No SSM exports configured for certificate")
136
+ return
137
+
138
+ # Export certificate ARN
139
+ if "certificate_arn" in ssm_exports:
140
+ param_name = ssm_exports["certificate_arn"]
141
+ if not param_name.startswith("/"):
142
+ param_name = f"/{param_name}"
143
+
144
+ self.export_ssm_parameter(
145
+ scope=self,
146
+ id=f"{cert_name}-cert-arn-param",
147
+ value=self.certificate.certificate_arn,
148
+ parameter_name=param_name,
149
+ description=f"Certificate ARN for {self.acm_config.domain_name}",
150
+ )
151
+ logger.info(f"Exported certificate ARN to SSM: {param_name}")
152
+
153
+ def _add_outputs(self, cert_name: str) -> None:
154
+ """Add CloudFormation outputs"""
155
+ cdk.CfnOutput(
156
+ self,
157
+ "CertificateArn",
158
+ value=self.certificate.certificate_arn,
159
+ description=f"Certificate ARN for {self.acm_config.domain_name}",
160
+ export_name=f"{cert_name}-arn",
161
+ )
162
+
163
+ cdk.CfnOutput(
164
+ self,
165
+ "DomainName",
166
+ value=self.acm_config.domain_name,
167
+ description="Primary domain name for the certificate",
168
+ export_name=f"{cert_name}-domain",
169
+ )
@@ -447,8 +447,19 @@ class LoadBalancerStack(IStack, EnhancedSsmParameterMixin):
447
447
  def _get_certificates(self) -> List[elbv2.ListenerCertificate]:
448
448
  """Get certificates for HTTPS listeners"""
449
449
  certificates = []
450
- for cert_arn in self.lb_config.certificate_arns:
451
- certificates.append(elbv2.ListenerCertificate.from_arn(cert_arn))
450
+
451
+ # Check SSM imported values first (takes priority)
452
+ if "certificate_arns" in self.ssm_imported_values:
453
+ cert_arns = self.ssm_imported_values["certificate_arns"]
454
+ if not isinstance(cert_arns, list):
455
+ cert_arns = [cert_arns]
456
+ for cert_arn in cert_arns:
457
+ certificates.append(elbv2.ListenerCertificate.from_arn(cert_arn))
458
+ logger.info(f"Using {len(cert_arns)} certificate(s) from SSM")
459
+ else:
460
+ # Fall back to config values
461
+ for cert_arn in self.lb_config.certificate_arns:
462
+ certificates.append(elbv2.ListenerCertificate.from_arn(cert_arn))
452
463
 
453
464
  if self.ssl_certificate:
454
465
  certificates.append(
@@ -244,9 +244,18 @@ class RdsStack(IStack, EnhancedSsmParameterMixin):
244
244
  "backup_retention": Duration.days(self.rds_config.backup_retention),
245
245
  "cloudwatch_logs_exports": self.rds_config.cloudwatch_logs_exports,
246
246
  "enable_performance_insights": self.rds_config.enable_performance_insights,
247
+ "allow_major_version_upgrade": self.rds_config.allow_major_version_upgrade,
247
248
  "removal_policy": removal_policy,
248
249
  }
249
250
 
251
+ # Add storage auto-scaling if max_allocated_storage is configured
252
+ if self.rds_config.max_allocated_storage:
253
+ db_props["max_allocated_storage"] = self.rds_config.max_allocated_storage
254
+ logger.info(
255
+ f"Storage auto-scaling enabled: {self.rds_config.allocated_storage}GB "
256
+ f"-> {self.rds_config.max_allocated_storage}GB"
257
+ )
258
+
250
259
  # Use either subnet group or vpc_subnets depending on what's available
251
260
  if db_subnet_group:
252
261
  db_props["subnet_group"] = rds.SubnetGroup.from_subnet_group_name(
@@ -58,8 +58,13 @@ class Route53Stack(IStack, EnhancedSsmParameterMixin):
58
58
  # Get or create hosted zone
59
59
  self.hosted_zone = self._get_or_create_hosted_zone()
60
60
 
61
- # Create certificate if needed
61
+ # Create certificate if needed (DEPRECATED - use dedicated ACM stack)
62
62
  if self.route53_config.create_certificate:
63
+ logger.warning(
64
+ "Creating certificates in Route53Stack is deprecated. "
65
+ "Please use the dedicated 'acm_stack' module for certificate management. "
66
+ "This feature will be maintained for backward compatibility."
67
+ )
63
68
  self.certificate = self._create_certificate()
64
69
 
65
70
  # Create DNS records
@@ -0,0 +1 @@
1
+ __version__ = "0.16.4"
@@ -1 +0,0 @@
1
- __version__ = "0.15.23"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes