cdk-factory 0.19.8__tar.gz → 0.19.10__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 (166) hide show
  1. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/PKG-INFO +1 -1
  2. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/pyproject.toml +1 -1
  3. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/cloudfront/cloudfront_stack.py +14 -11
  4. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/ecs/ecs_service_stack.py +34 -0
  5. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py +29 -2
  6. cdk_factory-0.19.10/src/cdk_factory/version.py +1 -0
  7. cdk_factory-0.19.8/src/cdk_factory/version.py +0 -1
  8. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/.gitignore +0 -0
  9. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/.windsurfrules +0 -0
  10. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/LICENSE +0 -0
  11. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/README.md +0 -0
  12. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/REFACTORING_PLAN.md +0 -0
  13. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/archive/README.md +0 -0
  14. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/archive/migrate_to_enhanced_ssm.py +0 -0
  15. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/examples/json-imports/README.md +0 -0
  16. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/examples/separate-api-gateway/README.md +0 -0
  17. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/examples/separate-api-gateway/api-gateway-stack.json +0 -0
  18. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/examples/separate-api-gateway/config.json +0 -0
  19. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/examples/separate-api-gateway/lambda-stack.json +0 -0
  20. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/mypy.ini +0 -0
  21. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/publish_to_pypi.py +0 -0
  22. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/publish_to_pypi.sh +0 -0
  23. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/pysetup.py +0 -0
  24. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/pysetup.sh +0 -0
  25. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/requirements.dev.txt +0 -0
  26. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/requirements.tests.txt +0 -0
  27. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/requirements.txt +0 -0
  28. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/run-checks.sh +0 -0
  29. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/run-tests-clean-venv.sh +0 -0
  30. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/run-tests.sh +0 -0
  31. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/scripts/cloudfront-cleanup.sh +0 -0
  32. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/__init__.py +0 -0
  33. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/app.py +0 -0
  34. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/builds/README.md +0 -0
  35. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/cdk.json +0 -0
  36. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/cli.py +0 -0
  37. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/commands/command_loader.py +0 -0
  38. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/base_config.py +0 -0
  39. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/cdk_config.py +0 -0
  40. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/deployment.py +0 -0
  41. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/deployment_wave.py +0 -0
  42. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/devops.py +0 -0
  43. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/enhanced_base_config.py +0 -0
  44. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/enhanced_ssm_config.py +0 -0
  45. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/management.py +0 -0
  46. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/pipeline.py +0 -0
  47. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/pipeline_stage.py +0 -0
  48. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/_resources.py +0 -0
  49. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/acm.py +0 -0
  50. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/api_gateway.py +0 -0
  51. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/apigateway_route_config.py +0 -0
  52. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/auto_scaling.py +0 -0
  53. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/cloudfront.py +0 -0
  54. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/cloudwatch_widget.py +0 -0
  55. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/code_artifact.py +0 -0
  56. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/code_artifact_login.py +0 -0
  57. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/code_repository.py +0 -0
  58. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/cognito.py +0 -0
  59. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/docker.py +0 -0
  60. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/dynamodb.py +0 -0
  61. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/ecr.py +0 -0
  62. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/ecs_cluster.py +0 -0
  63. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/ecs_service.py +0 -0
  64. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/exisiting.py +0 -0
  65. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/lambda_edge.py +0 -0
  66. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/lambda_function.py +0 -0
  67. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/lambda_layers.py +0 -0
  68. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/lambda_triggers.py +0 -0
  69. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/load_balancer.py +0 -0
  70. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/monitoring.py +0 -0
  71. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/rds.py +0 -0
  72. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/resource_mapping.py +0 -0
  73. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/resource_naming.py +0 -0
  74. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/resource_types.py +0 -0
  75. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/route53.py +0 -0
  76. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/route53_hosted_zone.py +0 -0
  77. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/rum.py +0 -0
  78. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/s3.py +0 -0
  79. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/security_group.py +0 -0
  80. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/security_group_full_stack.py +0 -0
  81. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/sqs.py +0 -0
  82. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/resources/vpc.py +0 -0
  83. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/stack.py +0 -0
  84. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/configurations/workload.py +0 -0
  85. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py +0 -0
  86. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/ecr/ecr_construct.py +0 -0
  87. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/lambdas/lambda_function_construct.py +0 -0
  88. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/lambdas/lambda_function_docker_construct.py +0 -0
  89. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/lambdas/lambda_function_role_construct.py +0 -0
  90. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/lambdas/policies/policy_docs.py +0 -0
  91. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/lambdas/policies/policy_statements.py +0 -0
  92. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/s3_buckets/s3_bucket_construct.py +0 -0
  93. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py +0 -0
  94. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py +0 -0
  95. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/constructs/sqs/policies/sqs_policies.py +0 -0
  96. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/interfaces/istack.py +0 -0
  97. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/interfaces/live_ssm_resolver.py +0 -0
  98. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/interfaces/networked_stack_mixin.py +0 -0
  99. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/interfaces/standardized_ssm_mixin.py +0 -0
  100. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/interfaces/vpc_provider_mixin.py +0 -0
  101. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/lambdas/edge/ip_gate/handler.py +0 -0
  102. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/lambdas/health_handler.py +0 -0
  103. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/pipeline/path_utils.py +0 -0
  104. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/pipeline/pipeline_factory.py +0 -0
  105. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/pipeline/security/policies.py +0 -0
  106. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/pipeline/security/roles.py +0 -0
  107. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/pipeline/stage.py +0 -0
  108. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack/istack.py +0 -0
  109. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack/stack_factory.py +0 -0
  110. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack/stack_module_loader.py +0 -0
  111. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack/stack_module_registry.py +0 -0
  112. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack/stack_modules.py +0 -0
  113. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/__init__.py +0 -0
  114. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/acm/__init__.py +0 -0
  115. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/acm/acm_stack.py +0 -0
  116. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py +0 -0
  117. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/auto_scaling/__init__.py +0 -0
  118. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/auto_scaling/auto_scaling_stack.py +0 -0
  119. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/aws_lambdas/lambda_stack.py +0 -0
  120. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/buckets/README.md +0 -0
  121. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/buckets/bucket_stack.py +0 -0
  122. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/cloudfront/__init__.py +0 -0
  123. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/code_artifact/code_artifact_stack.py +0 -0
  124. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/cognito/cognito_stack.py +0 -0
  125. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/dynamodb/dynamodb_stack.py +0 -0
  126. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/ecr/README.md +0 -0
  127. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/ecr/ecr_stack.py +0 -0
  128. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/ecs/__init__.py +0 -0
  129. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/ecs/ecs_cluster_stack.py +0 -0
  130. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/lambda_edge/__init__.py +0 -0
  131. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/load_balancer/__init__.py +0 -0
  132. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/load_balancer/load_balancer_stack.py +0 -0
  133. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/monitoring/__init__.py +0 -0
  134. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/monitoring/monitoring_stack.py +0 -0
  135. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/rds/__init__.py +0 -0
  136. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/rds/rds_stack.py +0 -0
  137. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/route53/__init__.py +0 -0
  138. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/route53/route53_stack.py +0 -0
  139. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/rum/__init__.py +0 -0
  140. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/rum/rum_stack.py +0 -0
  141. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/security_group/__init__.py +0 -0
  142. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/security_group/security_group_full_stack.py +0 -0
  143. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/security_group/security_group_stack.py +0 -0
  144. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/simple_queue_service/sqs_stack.py +0 -0
  145. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/stack_base.py +0 -0
  146. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/vpc/__init__.py +0 -0
  147. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/vpc/vpc_stack.py +0 -0
  148. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stack_library/websites/static_website_stack.py +0 -0
  149. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/stages/websites/static_website_stage.py +0 -0
  150. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/templates/README.md +0 -0
  151. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/templates/app.py.template +0 -0
  152. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/templates/cdk.json.template +0 -0
  153. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/api_gateway_integration_utility.py +0 -0
  154. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/commandline_args.py +0 -0
  155. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/configuration_loader.py +0 -0
  156. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/docker_utilities.py +0 -0
  157. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/environment_services.py +0 -0
  158. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/file_operations.py +0 -0
  159. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/git_utilities.py +0 -0
  160. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/json_loading_utility.py +0 -0
  161. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/lambda_function_utilities.py +0 -0
  162. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utilities/os_execute.py +0 -0
  163. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/utils/api_gateway_utilities.py +0 -0
  164. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/validation/config_validator.py +0 -0
  165. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/src/cdk_factory/workload/workload_factory.py +0 -0
  166. {cdk_factory-0.19.8 → cdk_factory-0.19.10}/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.19.8
3
+ Version: 0.19.10
4
4
  Summary: CDK Factory. A QuickStarter and best practices setup for CDK projects
5
5
  Author-email: Eric Wilson <eric.wilson@geekcafe.com>
6
6
  License: MIT License
@@ -33,7 +33,7 @@ markers = [
33
33
  [project]
34
34
 
35
35
  name = "cdk_factory"
36
- version = "0.19.8"
36
+ version = "0.19.10"
37
37
  authors = [
38
38
  { name="Eric Wilson", email="eric.wilson@geekcafe.com" }
39
39
  ]
@@ -145,7 +145,7 @@ class CloudFrontStack(IStack):
145
145
  return
146
146
 
147
147
  # Check if certificate ARN is provided
148
- cert_arn = cert_config.get("arn")
148
+ cert_arn = self.resolve_ssm_value(self, cert_config.get("arn"), "CertificateARN")
149
149
  if cert_arn:
150
150
  self.certificate = acm.Certificate.from_certificate_arn(
151
151
  self, "Certificate", certificate_arn=cert_arn
@@ -173,14 +173,14 @@ class CloudFrontStack(IStack):
173
173
  "CloudFront certificates must be created in us-east-1"
174
174
  )
175
175
  return
176
-
176
+
177
177
  # Create the certificate
178
178
  # Get hosted zone from SSM imports
179
179
  hosted_zone_id = cert_config.get("hosted_zone_id")
180
180
  hosted_zone = route53.HostedZone.from_hosted_zone_id(
181
181
  self, "HostedZone", hosted_zone_id
182
182
  )
183
-
183
+
184
184
  self.certificate = acm.Certificate(
185
185
  self,
186
186
  "Certificate",
@@ -223,7 +223,9 @@ class CloudFrontStack(IStack):
223
223
 
224
224
  def _create_custom_origin(self, config: Dict[str, Any]) -> cloudfront.IOrigin:
225
225
  """Create custom origin (ALB, API Gateway, etc.)"""
226
- domain_name = self.resolve_ssm_value(self, config.get("domain_name"), config.get("domain_name"))
226
+ domain_name = self.resolve_ssm_value(
227
+ self, config.get("domain_name"), config.get("domain_name")
228
+ )
227
229
  origin_id = config.get("id")
228
230
 
229
231
  if not domain_name:
@@ -297,21 +299,22 @@ class CloudFrontStack(IStack):
297
299
 
298
300
  def _create_s3_origin(self, config: Dict[str, Any]) -> cloudfront.IOrigin:
299
301
  """Create S3 origin"""
300
- bucket_name = self.resolve_ssm_value(self, config.get("bucket_name"), config.get("bucket_name"))
301
-
302
+ bucket_name = self.resolve_ssm_value(
303
+ self, config.get("bucket_name"), config.get("bucket_name")
304
+ )
302
305
 
303
306
  origin_path = config.get("origin_path", "")
304
-
307
+
305
308
  if not bucket_name:
306
309
  raise ValueError("S3 origin requires 'bucket_name' configuration")
307
-
310
+
308
311
  # For S3 origins, we need to import the bucket by name
309
312
  bucket = s3.Bucket.from_bucket_name(
310
313
  self,
311
314
  id=f"S3OriginBucket-{config.get('id', 'unknown')}",
312
- bucket_name=bucket_name
315
+ bucket_name=bucket_name,
313
316
  )
314
-
317
+
315
318
  # Create S3 origin with OAC (Origin Access Control) for security
316
319
  origin = origins.S3BucketOrigin.with_origin_access_control(
317
320
  bucket,
@@ -321,7 +324,7 @@ class CloudFrontStack(IStack):
321
324
  cloudfront.AccessLevel.LIST,
322
325
  ],
323
326
  )
324
-
327
+
325
328
  return origin
326
329
 
327
330
  def _create_distribution(self) -> None:
@@ -226,6 +226,9 @@ class EcsServiceStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
226
226
  "CloudWatchAgentServerPolicy"
227
227
  )
228
228
  )
229
+
230
+ # add any custom policies
231
+ self._add_custom_task_policies(task_role)
229
232
 
230
233
  # Create task definition based on launch type
231
234
  if self.ecs_config.launch_type == "EC2":
@@ -257,6 +260,37 @@ class EcsServiceStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
257
260
  # Add containers
258
261
  self._add_containers_to_task()
259
262
 
263
+ def _add_custom_task_policies(self, task_role: iam.Role) -> None:
264
+ """
265
+ Add custom task policies to the task definition.
266
+ """
267
+ for policy in self.ecs_config.task_definition.get("policies", []):
268
+
269
+ effect = policy.get("effect", "Allow")
270
+ action = policy.get("action", None)
271
+ actions = policy.get("actions", [])
272
+ if action:
273
+ actions.append(action)
274
+ resources = policy.get("resources", [])
275
+ resource = policy.get("resource", None)
276
+ if resource:
277
+ resources.append(resource)
278
+
279
+ if effect == "Allow" and actions:
280
+ effect = iam.Effect.ALLOW
281
+ if effect == "Deny" and actions:
282
+ effect = iam.Effect.DENY
283
+
284
+ sid = policy.get("sid", None)
285
+ task_role.add_to_policy(
286
+ iam.PolicyStatement(
287
+ effect=effect,
288
+ actions=actions,
289
+ resources=resources,
290
+ sid=sid,
291
+ )
292
+ )
293
+
260
294
  def _add_volumes_to_task(self) -> None:
261
295
  """
262
296
  Add volumes to the task definition.
@@ -53,6 +53,8 @@ class LambdaEdgeStack(IStack, StandardizedSsmMixin):
53
53
  self.workload: Optional[WorkloadConfig] = None
54
54
  self.function: Optional[_lambda.Function] = None
55
55
  self.function_version: Optional[_lambda.Version] = None
56
+ # Cache for resolved environment variables to prevent duplicate construct creation
57
+ self._resolved_env_cache: Optional[Dict[str, str]] = None
56
58
 
57
59
  def build(
58
60
  self,
@@ -101,12 +103,32 @@ class LambdaEdgeStack(IStack, StandardizedSsmMixin):
101
103
  # Add outputs
102
104
  self._add_outputs(function_name)
103
105
 
106
+ def _sanitize_construct_name(self, name: str) -> str:
107
+ """
108
+ Create a deterministic, valid CDK construct name from any string.
109
+ Replaces non-alphanumeric characters with dashes and limits length.
110
+ """
111
+ # Replace non-alphanumeric characters with dashes
112
+ sanitized = ''.join(c if c.isalnum() else '-' for c in name)
113
+ # Remove consecutive dashes
114
+ while '--' in sanitized:
115
+ sanitized = sanitized.replace('--', '-')
116
+ # Remove leading/trailing dashes
117
+ sanitized = sanitized.strip('-')
118
+ # Limit to 255 characters (CDK limit)
119
+ return sanitized[:255]
120
+
104
121
  def _resolve_environment_variables(self) -> Dict[str, str]:
105
122
  """
106
123
  Resolve environment variables, including SSM parameter references.
107
124
  Supports {{ssm:parameter-path}} syntax for dynamic SSM lookups.
108
125
  Uses CDK tokens that resolve at deployment time, not synthesis time.
126
+ Caches results to prevent duplicate construct creation.
109
127
  """
128
+ # Return cached result if available
129
+ if self._resolved_env_cache is not None:
130
+ return self._resolved_env_cache
131
+
110
132
  resolved_env = {}
111
133
 
112
134
  for key, value in self.edge_config.environment.items():
@@ -115,18 +137,23 @@ class LambdaEdgeStack(IStack, StandardizedSsmMixin):
115
137
  # Extract SSM parameter path
116
138
  ssm_param_path = value[6:-2] # Remove {{ssm: and }}
117
139
 
140
+ # Create deterministic construct name from parameter path
141
+ construct_name = self._sanitize_construct_name(f"env-{key}-{ssm_param_path}")
142
+
118
143
  # Import SSM parameter - this creates a token that resolves at deployment time
119
144
  param = ssm.StringParameter.from_string_parameter_name(
120
145
  self,
121
- f"env-{key}-{hash(ssm_param_path) % 10000}",
146
+ construct_name,
122
147
  ssm_param_path
123
148
  )
124
149
  resolved_value = param.string_value
125
- logger.info(f"Resolved environment variable {key} from SSM {ssm_param_path}")
150
+ logger.info(f"Resolved environment variable {key} from SSM {ssm_param_path} as {construct_name}")
126
151
  resolved_env[key] = resolved_value
127
152
  else:
128
153
  resolved_env[key] = value
129
154
 
155
+ # Cache the result
156
+ self._resolved_env_cache = resolved_env
130
157
  return resolved_env
131
158
 
132
159
  def _create_lambda_function(self, function_name: str) -> None:
@@ -0,0 +1 @@
1
+ __version__ = "0.19.10"
@@ -1 +0,0 @@
1
- __version__ = "0.19.8"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes