cdk-from-cfn is a command-line tool that converts AWS CloudFormation templates into AWS CDK code. It supports multiple programming languages including TypeScript, Python, Java, Go, and C#.
cargo install cdk-from-cfncdk-from-cfn [INPUT] [OUTPUT] --language <LANGUAGE> --stack-name <STACK_NAME> [--as <stack|construct>]INPUTis the input file path (STDIN by default).OUTPUTis the output file path; if not specified, output will be printed on your command line (STDOUT by default).--as(optional) specifies the output type:stack(default) orconstruct. Useconstructto generate a reusable CDK construct instead of a standalone stack.
By default, cdk-from-cfn generates code that extends Stack. You can use the --as flag to generate a reusable Construct instead:
# Generate a Stack (default)
cdk-from-cfn template.json --language typescript --as stack
# Generate a Construct
cdk-from-cfn template.json --language typescript --as constructWhen using construct mode:
- The generated class extends
Constructinstead ofStack - Props interface does not extend
StackProps - Pseudo-parameters like
AWS::StackNameuseStack.of(this)to access the parent stack
cdk-from-cfn leverages WebAssembly (WASM) bindings to provide a cross-platform npm module, which exposes apis to be used in Node.js projects. Simply take a dependency on cdk-from-cfn in your package.json and utilize it as you would a normal module. i.e.
import * as cdk_from_cfn from 'cdk-from-cfn';
// get supported languages
cdk_from_cfn.supported_languages();
// transmute cfn template into cdk app (generates a Stack by default)
cdk_from_cfn.transmute(template, language, stackName);
// transmute cfn template into a reusable Construct
cdk_from_cfn.transmute(template, language, stackName, 'construct');The transmute function accepts an optional fourth parameter classType:
'stack'(default): generates code extendingStack'construct': generates code extendingConstruct
| Name | Enabled by default | Description |
|---|---|---|
typescript |
✔️ | Enables support for TypeScript output |
golang |
✔️ | Enables support for Go output |
java |
✔️ | Enables support for Java output |
Python |
✔️ | Enables support for Python output |
csharp |
✔️ | Enables support for C# output |
You can enable experimental languages (not enabled by default) by enabling the relevant feature:
$ cargo build --release --features=<feature-name>
Finished release [optimized] target(s) in 0.17sIf you want to disable on-by-default languages, you can pass --no-default-features:
$ cargo build --release --no-default-features --features=golang
Finished release [optimized] target(s) in 0.17s- Fn::FindInMap
- Fn::Join
- Fn::Sub
- Ref
- Fn::And
- Fn::Equals
- Fn::If
- Fn::Not
- Fn::Or
- Fn::GetAtt
- Fn::Base64 support
- Fn::ImportValue support
- Fn::Select support
- Resource ordering based on dependencies
- Conditions are emitted in ts but not attached to resource conditions
- Metadata emission for updates to asgs / lambda functions.
- Emission of outputs / exports
- Fn::GetAZs support
- Adding depends-on, and ordering based on it too.
- Deletion policy
- Fn::Cidr support
There are known unsupported features. Working on them in priority order:
- Create policy
- ssm metadata references
- secretsmanager references