CDKO is a lightweight orchestrator that eliminates the pain of deploying AWS CDK stacks across multiple accounts and regions. Deploy once, everywhere - with full CDK compatibility and intelligent stack mapping.
If you've ever tried deploying CDK stacks across multiple AWS accounts and regions, you know the pain - running cdk deploy
over and over, changing profiles and regions manually. You end up writing fragile shell scripts that loop through environments, or worse, doing it all by hand.
CDKO solves this with a simple command:
# Deploy to 6 locations (2 accounts × 3 regions) in parallel
cdko -p "dev,staging" -s MyStack -r us-east-1,eu-west-1,ap-southeast-1
npm install -g @owloops/cdko
Prerequisites: Node.js 18+, AWS CDK, AWS CLI configured with your profiles
# Navigate to your CDK project
cd my-cdk-app
# Auto-detect your stacks and create configuration
cdko init
# Deploy a stack across multiple regions
cdko -p MyProfile -s MyStack -r us-east-1,eu-west-1
# Preview changes first
cdko -p MyProfile -s MyStack -m diff
CDKO handles three common CDK deployment patterns:
Keep a single stack definition and deploy to any regions you specify:
new MyStack(app, 'MyStack');
cdko -p MyProfile -s MyStack -r us-east-1,eu-west-1,ap-southeast-1
When you've already specified account and/or region in your stack:
new MyStack(app, 'MyStack-Dev', { env: { account: '123456789012', region: 'us-east-1' }})
new MyStack(app, 'MyStack-Staging', { env: { region: 'us-west-2' }})
CDKO detects these automatically and deploys to the correct environments.
Common for multi-region deployments where the stack name is consistent but construct IDs differ:
new MyStack(app, 'MyStack-US', { stackName: 'MyStack', env: { region: 'us-east-1' }})
new MyStack(app, 'MyStack-EU', { stackName: 'MyStack', env: { region: 'eu-west-1' }})
new MyStack(app, 'MyStack-AP', { stackName: 'MyStack', env: { region: 'ap-southeast-1' }})
CDKO understands these are all the same logical stack.
Pattern matching makes CDKO powerful for complex deployments:
# Deploy all stacks matching a pattern
cdko -p MyProfile -s "API*" -r us-east-1,us-west-2
# Deploy across multiple staging accounts using profile patterns
cdko -p "dev-*,staging-*" -s MyStack -r all
# Mix and match patterns for non-production environments
cdko -p "dev,staging" -s "Frontend*,Backend*" -r us-east-1,eu-west-1
cdko [options]
Option | Description |
---|---|
-p, --profile |
AWS profile(s) - supports patterns (dev-* ), lists (dev,staging ), and wildcards |
-s, --stack |
Stack name pattern to deploy - supports wildcards (API* ) |
Option | Description | Default |
---|---|---|
-r, --region |
Comma-separated regions or 'all' | us-east-1 |
-m, --mode |
Deployment mode: diff , changeset , execute
|
changeset |
-x, --sequential |
Deploy regions sequentially instead of parallel | false |
-d, --dry-run |
Show what would be deployed without executing | false |
-v, --verbose |
Enable verbose CDK output | false |
--include-deps |
Include dependency stacks (removes --exclusively flag) | false |
--parameters |
CDK parameters (KEY=VALUE or STACK:KEY=VALUE) | - |
--context |
CDK context values (KEY=VALUE) | - |
--cdk-opts |
Pass additional options directly to CDK | - |
-h, --help |
Show help message | - |
--version |
Show version with build info | - |
- diff: Shows what changes would be made without executing
- changeset: Creates CloudFormation changesets for review (default)
- execute: Deploys immediately with automatic changeset execution
# Preview changes across all regions
cdko -p prod -s MyStack -r all -m diff
# Deploy with parameters
cdko -p dev -s MyStack --parameters BucketName=my-bucket
# Stack-specific parameters
cdko -p dev -s MyStack --parameters MyStack:KeyName=my-key
# Deploy multiple stacks to multiple accounts
cdko -p "dev-*,staging-*" -s "API*,Frontend*" -r us-east-1,eu-west-1
# Execute immediately (skip changeset review)
cdko -p prod -s MyStack -m execute
# Dry run to see deployment plan
cdko -p "dev-*" -s "Production-*" -d
# Pass CDK options
cdko -p dev -s MyStack --cdk-opts "--require-approval never"
# Sequential deployment
cdko -p prod -s CriticalStack -r us-east-1,us-west-2 -x
CDKO uses a .cdko.json
file to map your logical stacks to their CDK construct IDs. Run cdko init
to auto-generate this from your existing CDK app:
{
"version": "0.1",
"stackGroups": {
"MyStack": {
"123456789012/us-east-1": {
"constructId": "MyStack",
"account": "123456789012",
"region": "us-east-1"
},
"123456789012/eu-west-1": {
"constructId": "MyStack-EU",
"account": "123456789012",
"region": "eu-west-1"
}
}
},
"cdkTimeout": "30m",
"suppressNotices": true
}
CDK creates different construct IDs for the same logical stack across environments. For example:
- Construct ID:
Development-MyApp
→ Stack name:MyApp
(dev account) - Construct ID:
Production-MyApp
→ Stack name:MyApp
(prod account) - Construct ID:
MyApp-EU
→ Stack name:MyApp
(EU region)
CDKO's configuration automatically maps your patterns (like *MyApp
) to the correct construct IDs per account/region combination.
-
CDK_TIMEOUT
- Timeout for CDK operations (default: not set) -
CDK_CLI_NOTICES
- Set to "true" to show CDK notices (default: hidden) -
DEBUG
- Set to "1" for detailed error traces
CDKO is designed for deploying infrastructure and stateful resources from your local machine. It's particularly useful for:
- Initial infrastructure setup across multiple accounts
- Deploying foundational resources (VPCs, databases, etc.)
- Testing infrastructure changes across environments
- Managing resources that don't fit well in CI/CD pipelines
For application deployments and automated workflows, use your CI/CD pipeline. CDKO and CI/CD complement each other - you can even call CDKO from within your pipeline for infrastructure updates.
If you're familiar with Terraform, CDKO is similar to Terragrunt - it's an orchestration layer that makes it practical to deploy infrastructure at scale across complex multi-account, multi-region environments. Just as Terragrunt wraps Terraform to solve the multi-environment deployment problem, CDKO wraps CDK to provide the same capability.
If credentials expire during deployment:
aws sso login --profile dev
aws sso login --profile prod
Always quote patterns to prevent shell expansion:
cdko -p "dev-*" # Correct
cdko -p dev-* # Shell will expand this
See detailed execution information:
DEBUG=1 cdko -p dev -s MyStack -v
git clone https://github.com/Owloops/cdko.git
cd cdko
npm install
npm run build
npm link
# Run linting
npm run lint
# Run tests
npm test
The test suite includes comprehensive integration tests against real CDK stacks:
# Run all tests
npm test
# Run only cdko integration tests
cd test && npm test -- --testNamePattern="CDKO"
All tests use the --dry-run
flag to prevent actual AWS deployments.
- zx - Shell scripting for Node.js
- minimatch - Glob pattern matching
- aws-cdk - AWS Cloud Development Kit
This project is licensed under the MIT License.