This is Chapter 1 of the Infrastructure as Code with AWS CDK series. Two things come before writing any stack code: initialising the CDK project and bootstrapping the AWS account.
Prerequisites
- Python 3.9+
- Node.js 18+ (CDK CLI is a Node package)
- AWS CLI v2 configured with valid credentials - see Connect to AWS SSO and SSH into EC2 Instance
- An AWS account with permissions to create IAM roles, S3 buckets, and CloudFormation stacks
Install the CDK CLI globally:
npm install -g aws-cdk
cdk --version
Initialise project
Create a new directory and initialise a CDK Python project inside it:
mkdir my-cdk-app && cd my-cdk-app
cdk init app --language python
This scaffolds the project with a virtual environment, a sample stack, and a cdk.json config file.
Activate the virtual environment and install dependencies:
# macOS / Linux
source .venv/bin/activate
# Windows (PowerShell)
.venv\Scripts\activate.ps1
pip install -r requirements.txt
Directory structure
After initialisation the project looks like this:
my-cdk-app/
├── app.py # CDK app entry point
├── cdk.json # CDK config and context
├── requirements.txt # Python dependencies
├── requirements-dev.txt # Dev dependencies (e.g. pytest)
├── .venv/ # Python virtual environment
└── my_cdk_app/
├── __init__.py
└── my_cdk_app_stack.py # Default stack
app.py is where the CDK app is defined and stacks are instantiated. my_cdk_app_stack.py is where resources are defined. The folder and class names match the project name passed to cdk init.
Bootstrap AWS account
CDK needs a one-time setup in each AWS account and region it deploys to. Bootstrapping creates an S3 bucket (for assets) and IAM roles (for deployments) in the account:
cdk bootstrap aws://123456789012/us-east-1
Replace 123456789012 with your account ID and us-east-1 with your target region. If credentials are already configured via AWS CLI or SSO, the account ID can be omitted:
cdk bootstrap
This only needs to run once per account/region combination. Re-running it is safe - it updates the bootstrap stack if needed.
Synth and deploy
CDK compiles Python into CloudFormation before deploying. Run synth to see the generated CloudFormation template:
cdk synth
This outputs a CloudFormation template to cdk.out/. Use it to verify what CDK will create before deploying.
Deploy the stack:
cdk deploy
CDK shows a diff of changes and prompts for confirmation before creating or modifying any IAM resources.
Verify
After deploying, the stack appears in CloudFormation in the AWS console. Check:
- CloudFormation > Stacks >
MyCdkAppStack- status should beCREATE_COMPLETE - S3 > Buckets - the CDK bootstrap bucket should be visible (
cdk-hnb659fds-assets-...)
To tear down the stack:
cdk destroy
Notes
- The bootstrap stack itself is a CloudFormation stack - it can be viewed and managed in the console under
CDKToolkit. - Each AWS account + region combination needs its own bootstrap - e.g. deploying to both
us-east-1andap-southeast-2requires bootstrapping both. cdk synthis useful for debugging - the generated CloudFormation is incdk.out/and can be inspected directly.- The
.venv/folder andcdk.out/should be in.gitignore- they are added automatically bycdk init.