cdk-factory 0.18.5__tar.gz → 0.18.8__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.
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/PKG-INFO +1 -1
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/pyproject.toml +1 -1
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/interfaces/standardized_ssm_mixin.py +39 -35
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/auto_scaling/auto_scaling_stack_standardized.py +5 -26
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/load_balancer/load_balancer_stack.py +47 -29
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/rds/rds_stack.py +64 -47
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/websites/static_website_stack.py +1 -1
- cdk_factory-0.18.8/src/cdk_factory/version.py +1 -0
- cdk_factory-0.18.5/src/cdk_factory/stack_library/auto_scaling/auto_scaling_old.py +0 -721
- cdk_factory-0.18.5/src/cdk_factory/version.py +0 -1
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/.gitignore +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/.windsurfrules +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/LICENSE +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/README.md +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/REFACTORING_PLAN.md +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/archive/README.md +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/archive/migrate_to_enhanced_ssm.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/examples/json-imports/README.md +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/examples/separate-api-gateway/README.md +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/examples/separate-api-gateway/api-gateway-stack.json +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/examples/separate-api-gateway/config.json +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/examples/separate-api-gateway/lambda-stack.json +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/mypy.ini +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/publish_to_pypi.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/publish_to_pypi.sh +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/pysetup.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/pysetup.sh +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/requirements.dev.txt +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/requirements.tests.txt +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/requirements.txt +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/run-checks.sh +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/run-tests-clean-venv.sh +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/run-tests.sh +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/scripts/cloudfront-cleanup.sh +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/app.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/builds/README.md +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/cdk.json +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/cli.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/commands/command_loader.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/base_config.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/cdk_config.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/deployment.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/deployment_wave.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/devops.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/enhanced_base_config.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/enhanced_ssm_config.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/management.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/pipeline.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/pipeline_stage.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/_resources.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/acm.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/api_gateway.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/apigateway_route_config.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/auto_scaling.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/cloudfront.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/cloudwatch_widget.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/code_artifact.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/code_artifact_login.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/code_repository.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/cognito.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/docker.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/dynamodb.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/ecr.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/ecs_cluster.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/ecs_service.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/exisiting.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/lambda_edge.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/lambda_function.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/lambda_layers.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/lambda_triggers.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/load_balancer.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/monitoring.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/rds.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/resource_mapping.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/resource_naming.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/resource_types.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/route53.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/route53_hosted_zone.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/rum.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/s3.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/security_group.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/security_group_full_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/sqs.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/resources/vpc.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/configurations/workload.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/ecr/ecr_construct.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/lambdas/lambda_function_construct.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/lambdas/lambda_function_docker_construct.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/lambdas/lambda_function_role_construct.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/lambdas/policies/policy_docs.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/lambdas/policies/policy_statements.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/s3_buckets/s3_bucket_construct.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/constructs/sqs/policies/sqs_policies.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/interfaces/istack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/interfaces/live_ssm_resolver.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/interfaces/networked_stack_mixin.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/interfaces/vpc_provider_mixin.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/lambdas/edge/ip_gate/handler.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/lambdas/health_handler.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/pipeline/path_utils.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/pipeline/pipeline_factory.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/pipeline/security/policies.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/pipeline/security/roles.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/pipeline/stage.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack/istack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack/stack_factory.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack/stack_module_loader.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack/stack_module_registry.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack/stack_modules.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/acm/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/acm/acm_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/auto_scaling/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/aws_lambdas/lambda_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/buckets/README.md +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/buckets/bucket_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/cloudfront/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/cloudfront/cloudfront_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/code_artifact/code_artifact_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/cognito/cognito_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/dynamodb/dynamodb_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/ecr/README.md +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/ecr/ecr_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/ecs/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/ecs/ecs_cluster_stack_standardized.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/ecs/ecs_service_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/lambda_edge/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/load_balancer/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/monitoring/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/monitoring/monitoring_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/rds/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/route53/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/route53/route53_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/rum/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/rum/rum_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/security_group/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/security_group/security_group_full_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/security_group/security_group_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/simple_queue_service/sqs_stack.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/stack_base.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/vpc/__init__.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stack_library/vpc/vpc_stack_standardized.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/stages/websites/static_website_stage.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/templates/README.md +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/templates/app.py.template +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/templates/cdk.json.template +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/api_gateway_integration_utility.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/commandline_args.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/configuration_loader.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/docker_utilities.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/environment_services.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/file_operations.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/git_utilities.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/json_loading_utility.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/lambda_function_utilities.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utilities/os_execute.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/utils/api_gateway_utilities.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/validation/config_validator.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/workload/workload_factory.py +0 -0
- {cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/handlers/test/handler.py +0 -0
{cdk_factory-0.18.5 → cdk_factory-0.18.8}/src/cdk_factory/interfaces/standardized_ssm_mixin.py
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
239
|
-
|
|
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
|
-
#
|
|
81
|
-
self.
|
|
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
|
|
160
|
-
|
|
161
|
-
if
|
|
162
|
-
|
|
163
|
-
#
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
"
|
|
167
|
-
cdk.
|
|
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
|
-
#
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
429
|
-
|
|
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
|
-
#
|
|
73
|
-
self.
|
|
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
|
-
#
|
|
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
|
-
|
|
137
|
-
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
|
191
|
+
subnets = None if db_subnet_group else self._get_subnet_selection()
|
|
175
192
|
|
|
176
193
|
# Configure engine
|
|
177
194
|
engine_version = None
|
|
@@ -225,7 +225,7 @@ class StaticWebSiteStack(IStack):
|
|
|
225
225
|
bucket: The S3 bucket
|
|
226
226
|
cloudfront_distribution: The CloudFront distribution construct
|
|
227
227
|
"""
|
|
228
|
-
ssm_exports = stack_config.dictionary.get("
|
|
228
|
+
ssm_exports = stack_config.dictionary.get("ssm", {}).get("exports", {})
|
|
229
229
|
|
|
230
230
|
if not ssm_exports:
|
|
231
231
|
logger.debug("No SSM exports configured for this stack")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.18.8"
|