Cloud Development Kit for Terraform - programmatic infrastructure as code using familiar programming languages
npx @tessl/cli install tessl/npm-cdktf@0.21.0The Cloud Development Kit for Terraform (CDKTF) enables you to define cloud infrastructure using familiar programming languages instead of HashiCorp Configuration Language (HCL). It leverages the entire Terraform ecosystem through a TypeScript-based JSII library that supports multiple target languages including Python, Java, C#, and Go.
npm install cdktf constructsimport { App, TerraformStack, TerraformOutput } from "cdktf";
import { Construct } from "constructs";For CommonJS:
const { App, TerraformStack, TerraformOutput } = require("cdktf");import { App, TerraformStack, TerraformOutput } from "cdktf";
import { Construct } from "constructs";
class MyStack extends TerraformStack {
constructor(scope: Construct, id: string) {
super(scope, id);
// Add Terraform resources, data sources, and outputs here
new TerraformOutput(this, "example", {
value: "Hello, CDKTF!",
});
}
}
const app = new App();
new MyStack(app, "my-stack");
app.synth();CDKTF is built around several key architectural components:
Essential classes for building CDKTF applications, including the root App construct and TerraformStack containers.
class App extends Construct {
constructor(config?: AppConfig);
synth(): void;
crossStackReference(fromStack: TerraformStack, toStack: TerraformStack, identifier: string): string;
static isApp(x: any): x is App;
static of(construct: IConstruct): App;
}
class TerraformStack extends Construct {
constructor(scope: Construct, id: string);
toTerraform(): any;
toHclTerraform(): any;
addOverride(path: string, value: any): void;
getLogicalId(tfElement: ITerraformAddressable): string;
prepareStack(): void;
runAllValidations(): void;
ensureBackendExists(): TerraformBackend;
allProviders(): TerraformProvider[];
addDependency(dependency: TerraformStack): void;
dependsOn(stack: TerraformStack): boolean;
hasResourceMove(): boolean;
registerOutgoingCrossStackReference(identifier: string): TerraformOutput;
registerIncomingCrossStackReference(fromStack: TerraformStack): TerraformRemoteState;
static isStack(x: any): x is TerraformStack;
static of(construct: IConstruct): TerraformStack;
}Terraform resource and data source management with full attribute access and lifecycle controls.
class TerraformResource extends TerraformElement {
constructor(scope: Construct, id: string, config: TerraformResourceConfig);
getStringAttribute(terraformAttribute: string): string;
getNumberAttribute(terraformAttribute: string): number;
getListAttribute(terraformAttribute: string): string[];
getBooleanAttribute(terraformAttribute: string): IResolvable;
getNumberListAttribute(terraformAttribute: string): number[];
getStringMapAttribute(terraformAttribute: string): {[key: string]: string};
getNumberMapAttribute(terraformAttribute: string): {[key: string]: number};
getBooleanMapAttribute(terraformAttribute: string): {[key: string]: boolean};
getAnyMapAttribute(terraformAttribute: string): {[key: string]: any};
interpolationForAttribute(terraformAttribute: string): IResolvable;
importFrom(id: string, provider?: TerraformProvider): void;
moveTo(moveTarget: string, index?: string | number): void;
moveToId(id: string): void;
moveFromId(id: string): void;
addMoveTarget(moveTarget: string): void;
hasResourceMove(): boolean;
static isTerraformResource(x: any): x is TerraformResource;
}
class TerraformDataSource extends TerraformElement {
constructor(scope: Construct, id: string, config: TerraformResourceConfig);
static isTerraformDataSource(x: any): x is TerraformDataSource;
}Provider configuration and Terraform module integration for external resource management.
abstract class TerraformProvider extends TerraformElement {
constructor(scope: Construct, id: string, config: TerraformProviderConfig);
readonly terraformResourceType: string;
readonly alias?: string;
static isTerraformProvider(x: any): x is TerraformProvider;
}
abstract class TerraformModule extends TerraformElement {
constructor(scope: Construct, id: string, options: TerraformModuleConfig);
interpolationForOutput(moduleOutput: string): IResolvable;
getString(output: string): string;
addProvider(provider: TerraformProvider | TerraformModuleProvider): void;
}Input variables and output values for parameterizing and exposing infrastructure values.
class TerraformVariable extends TerraformElement {
constructor(scope: Construct, id: string, config: TerraformVariableConfig);
readonly stringValue: string;
readonly numberValue: number;
readonly listValue: string[];
readonly booleanValue: IResolvable;
readonly value: any;
addValidation(validation: TerraformVariableValidationConfig): void;
}
class TerraformOutput extends TerraformElement {
constructor(scope: Construct, id: string, config: TerraformOutputConfig);
readonly value: any;
readonly description?: string;
readonly sensitive?: boolean;
static isTerraformOutput(x: any): x is TerraformOutput;
}
class TerraformLocal extends TerraformElement {
constructor(scope: Construct, id: string, expression: any);
readonly expression: any;
readonly fqn: string;
}Terraform backend configuration for state management across different storage systems.
abstract class TerraformBackend extends TerraformElement {
constructor(scope: Construct, id: string, name: string);
abstract getRemoteStateDataSource(scope: Construct, name: string, fromStack: string): TerraformRemoteState;
static isBackend(x: any): x is TerraformBackend;
}Backend implementations: S3Backend, LocalBackend, RemoteBackend, CloudBackend, AzurermBackend, ConsulBackend, GcsBackend, and more.
Token resolution system for handling unresolved values and creating Terraform expressions.
class Token {
static isUnresolved(obj: any): boolean;
static asString(value: any, options?: EncodingOptions): string;
static asNumber(value: any): number;
static asList(value: any, options?: EncodingOptions): string[];
static asNumberList(value: any): number[];
static asStringMap(value: any, options?: EncodingOptions): {[key: string]: string};
static asNumberMap(value: any, options?: EncodingOptions): {[key: string]: number};
static asBooleanMap(value: any, options?: EncodingOptions): {[key: string]: boolean};
static asAnyMap(value: any, options?: EncodingOptions): {[key: string]: any};
static asAny(value: any): IResolvable;
static nullValue(): IResolvable;
}
function ref(identifier: string, stack?: TerraformStack): IResolvable;
function conditional(condition: Expression, trueValue: Expression, falseValue: Expression): any;
function propertyAccess(target: Expression, args: Expression[]): IResolvable;Iterator support for for_each constructs and dynamic block generation.
abstract class TerraformIterator {
static fromList(list: any[]): ListTerraformIterator;
static fromMap(map: {[key: string]: any}): MapTerraformIterator;
static fromResources(resource: ITerraformResource): ResourceTerraformIterator;
getString(attribute: string): string;
getNumber(attribute: string): number;
dynamic(attributes: {[key: string]: any}): IResolvable;
keys(): IResolvable;
values(): IResolvable;
}Comprehensive access to Terraform's built-in functions for expressions and computations.
class Fn {
static bcrypt(str: string, cost?: number): string;
static conditional(condition: any, trueValue: any, falseValue: any): any;
static lookup(inputMap: any, key: string, defaultValue?: any): any;
static join(separator: string, list: string[]): string;
static length(value: any): number;
static keys(inputMap: any): string[];
static values(inputMap: any): any[];
// Plus 100+ additional Terraform functions
}Built-in testing utilities for validating CDKTF applications and infrastructure configurations.
class Testing {
static app(options?: TestingAppConfig): App;
static stubVersion(app: App): App;
static fakeCdktfJsonPath(app: App): App;
static enableFutureFlags(app: App): App;
static synthScope(fn: IScopeCallback): string;
static synth(stack: TerraformStack, runValidations?: boolean): string;
static synthHcl(stack: TerraformStack, runValidations?: boolean, returnMetadata?: boolean): string;
static fullSynth(stack: TerraformStack): string;
static renderConstructTree(construct: IConstruct): string;
static toHaveDataSourceWithProperties(received: string, resourceType: string, properties?: Record<string, any>): boolean;
static toHaveDataSource(received: string, resourceType: string): boolean;
static toHaveResourceWithProperties(received: string, resourceType: string, properties?: Record<string, any>): boolean;
static toHaveResource(received: string, resourceType: string): boolean;
static toHaveProviderWithProperties(received: string, resourceType: string, properties?: Record<string, any>): boolean;
static toHaveProvider(received: string, resourceType: string): boolean;
static toBeValidTerraform(received: string): boolean;
static setupJest(): void;
}Testing matchers: toHaveResource, toHaveResourceWithProperties, toHaveDataSource, toBeValidTerraform, and more.
Resource provisioning capabilities for executing scripts and transferring files during resource creation.
interface FileProvisioner {
type: "file";
source: string;
destination: string;
connection?: SSHProvisionerConnection | WinrmProvisionerConnection;
}
interface LocalExecProvisioner {
type: "local-exec";
command: string;
workingDir?: string;
interpreter?: string[];
environment?: {[key: string]: string};
}
interface RemoteExecProvisioner {
type: "remote-exec";
inline?: string[];
script?: string;
scripts?: string[];
connection: SSHProvisionerConnection | WinrmProvisionerConnection;
}Construct annotation system for adding metadata and cross-cutting concerns through aspect-oriented programming.
class Annotations {
static of(scope: IConstruct): Annotations;
addInfo(message: string): void;
addWarning(message: string): void;
addError(message: string): void;
}
interface IAspect {
visit(node: IConstruct): void;
}
class Aspects {
static of(scope: IConstruct): Aspects;
add(aspect: IAspect): void;
readonly all: IAspect[];
}interface AppConfig {
readonly context?: {[key: string]: any};
readonly outdir?: string;
readonly stackTraces?: boolean;
readonly hclOutput?: boolean;
readonly skipBackendValidation?: boolean;
readonly skipValidation?: boolean;
}
interface TerraformResourceConfig {
readonly terraformResourceType: string;
readonly terraformGeneratorMetadata?: TerraformProviderGeneratorMetadata;
readonly provider?: TerraformProvider;
readonly dependsOn?: ITerraformDependable[];
readonly count?: number | TerraformCount;
readonly forEach?: ITerraformIterator;
readonly lifecycle?: TerraformResourceLifecycle;
readonly provisioners?: (FileProvisioner | LocalExecProvisioner | RemoteExecProvisioner)[];
readonly connection?: SSHProvisionerConnection | WinrmProvisionerConnection;
}
interface IResolvable {
readonly creationStack: string[];
resolve(context: IResolveContext): any;
toString(): string;
}
interface ITerraformDependable {
// Marker interface for dependable resources
}
interface ITerraformAddressable {
readonly fqn: string;
}
interface TestingAppConfig {
readonly outdir?: string;
readonly stackTraces?: boolean;
readonly stubVersion?: boolean;
readonly enableFutureFlags?: boolean;
readonly fakeCdktfJsonPath?: boolean;
readonly context?: {[key: string]: any};
}
interface IScopeCallback {
(scope: Construct): void;
}
interface EncodingOptions {
readonly displayHint?: string;
}