Monday, 23 June 2025

AWS CDK Python: Multi-Stack + Multi-Environment + Selective Deployment

 


๐Ÿ“ Project Structure



๐Ÿ“ฆ requirements.txt


aws-cdk-lib constructs>=10.0.0,<11.0.0

Install dependencies:


pip install -r requirements.txt


๐Ÿง  config/dev.json


{ "env_name": "dev", "region": "us-east-1", "account": "123456789012", "bucket_name": "dev-bucket-example", "instance_type": "t2.micro", "lambda_memory": 512, "lambda_timeout": 10, "alb_listener_port": 80 }


๐Ÿงพ cdk.json


{ "app": "python app.py" }

๐Ÿš€ app.py


import json from aws_cdk import App, Environment from my_cdk_app.network_stack import NetworkStack from my_cdk_app.compute_stack import ComputeStack from my_cdk_app.alb_lambda_stack import AlbLambdaStack app = App() # Load context env_name = app.node.try_get_context("env") or "dev" target_stack = app.node.try_get_context("target") or "all" # Load config file with open(f"config/{env_name}.json") as f: config = json.load(f) env = Environment(account=config["account"], region=config["region"]) # Deploy selected stacks if target_stack in ["network", "all"]: network_stack = NetworkStack(app, f"NetworkStack-{env_name}", config=config, env=env) else: network_stack = None if target_stack in ["compute", "all"] and network_stack: ComputeStack(app, f"ComputeStack-{env_name}", config=config, vpc=network_stack.vpc, env=env) if target_stack in ["alb", "all"] and network_stack: AlbLambdaStack(app, f"AlbLambdaStack-{env_name}", config=config, vpc=network_stack.vpc, env=env) app.synth()





๐Ÿงฑ my_cdk_app/network_stack.py

from aws_cdk import Stack, aws_ec2 as ec2
from constructs import Construct class NetworkStack(Stack): def __init__(self, scope: Construct, id: str, config: dict, **kwargs): super().__init__(scope, id, **kwargs) self.vpc = ec2.Vpc(self, "VPC", max_azs=2)

๐Ÿ’ป my_cdk_app/compute_stack.py


from aws_cdk import Stack, aws_s3 as s3, aws_ec2 as ec2 from constructs import Construct class ComputeStack(Stack): def __init__(self, scope: Construct, id: str, config: dict, vpc, **kwargs): super().__init__(scope, id, **kwargs) s3.Bucket(self, "Bucket", bucket_name=config["bucket_name"], versioned=True) ec2.Instance(self, "Instance", instance_type=ec2.InstanceType(config["instance_type"]), machine_image=ec2.MachineImage.latest_amazon_linux(), vpc=vpc )

๐ŸŒ my_cdk_app/alb_lambda_stack.py

from aws_cdk import (
Stack, aws_lambda as _lambda, aws_ec2 as ec2, aws_elasticloadbalancingv2 as elbv2, aws_elasticloadbalancingv2_targets as targets ) from constructs import Construct class AlbLambdaStack(Stack): def __init__(self, scope: Construct, id: str, config: dict, vpc, **kwargs): super().__init__(scope, id, **kwargs) # Lambda Function fn = _lambda.Function(self, "Lambda", runtime=_lambda.Runtime.PYTHON_3_9, handler="index.handler", code=_lambda.Code.from_inline("def handler(event, context): return {'statusCode': 200, 'body': 'Hello from Lambda'}"), memory_size=config["lambda_memory"], timeout=config["lambda_timeout"] ) # ALB alb = elbv2.ApplicationLoadBalancer(self, "ALB", vpc=vpc, internet_facing=True) listener = alb.add_listener("Listener", port=config["alb_listener_port"]) listener.add_targets("LambdaTarget", targets=[targets.LambdaTarget(fn)]) self.dns = alb.load_balancer_dns_name






๐Ÿš€ CDK Commands

✅ Bootstrap environment (once per region/account)

cdk bootstrap

✅ Deploy single stack

cdk deploy AlbLambdaStack-dev

✅ Deploy using context filtering

cdk deploy --context env=dev --context target=alb

✅ Deploy all stacks for dev

cdk deploy --context env=dev

✅ List available stacks

cdk list

✅ Destroy stack

cdk destroy AlbLambdaStack-dev






Task Command Description
✅ Initialize CDK project cdk init app --language python Run once when starting new project
✅ Install Python deps pip install -r requirements.txt Required for CDK code to run
✅ Bootstrap CDK cdk bootstrap Sets up initial resources like CDK bucket
๐Ÿ› ️ Synthesize CloudFormation cdk synth Generates raw CloudFormation template
๐Ÿ“ฆ Deploy all stacks cdk deploy Deploys all stacks defined in app.py
๐Ÿ“ฆ Deploy single stack cdk deploy AlbLambdaStack-dev Deploy only the named stack
๐Ÿ“ฆ Deploy with context cdk deploy --context env=dev --context target=alb Load environment + filter stacks
๐Ÿ—‘️ Destroy a stack cdk destroy AlbLambdaStack-dev Clean up a single stack
๐Ÿ“œ List all stacks cdk list Show all stacks CDK knows about
๐Ÿงฉ Diff template cdk diff AlbLambdaStack-dev Show what will change before deployment

No comments:

Post a Comment