Skip to main content

Terraform utilities

This Wing library includes some useful utilities to work with Terraform.

Prerequisites

Installation

npm i @winglibs/tf

tf.Resource

Represents an arbitrary Terraform resource.

tf.Resource can only be used when compiling your Wing program to a tf-* target.

It takes a terraformResourceType and attributes properties, as well as all the properties of the TerraformResource class from CDKTF.

bring tf;

let role = new tf.Resource({
terraformResourceType: "aws_iam_role",
attributes: {
inline_policy: {
name: "lambda-invoke",
policy: Json.stringify({
Version: "2012-10-17",
Statement: [
{
Effect: "Allow",
Action: [ "lambda:InvokeFunction" ],
Resource: "*"
}
]
})
},
assume_role_policy: Json.stringify({
Version: "2012-10-17",
Statement: [
{
Action: "sts:AssumeRole",
Effect: "Allow",
Principal: { Service: "states.amazonaws.com" }
},
]
})
}
}) as "my_role";

let arn = role.getStringAttribute("arn");

test "print arn" {
log(arn);
}

Now, we can compile this to Terraform:

wing compile -t tf-aws

And the output will be:

{
"resource": {
"aws_iam_role": {
"my_role": {
"//": {
"metadata": {
"path": "root/Default/Default/my_role",
"uniqueId": "my_role"
}
},
"assume_role_policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"states.amazonaws.com\"}}]}",
"inline_policy": {
"name": "lambda-invoke",
"policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"lambda:InvokeFunction\"],\"Resource\":\"*\"}]}"
}
}
}
},
"provider": { "aws": [ { } ] },
"terraform": {
"backend": {
"local": {
"path": "./terraform.tfstate"
}
},
"required_providers": {
"aws": {
"source": "aws",
"version": "5.31.0"
}
}
}
}

tf.Provider

Represents an arbitrary Terraform provider.

tf.Provider can only be used when compiling your Wing program to a tf-* target.

It takes name, source, version, and attributes properties:

bring tf;

new tf.Provider({
name: "dnsimple",
source: "dnsimple/dnsimple",
version: "1.6.0",
attributes: {
token: "dnsimple_token",
}
}) as "DnsimpleProvider";

Now, we can compile this to Terraform:

wing compile -t tf-aws

And the output will be:

{
"provider": {
"aws": [{}],
"dnsimple": [
{
"token": "dnsimple_token"
}
]
},
"terraform": {
"backend": {
"local": {
"path": "./terraform.tfstate"
}
},
"required_providers": {
"aws": {
"source": "aws",
"version": "5.31.0"
},
"dnsimple": {
"source": "dnsimple/dnsimple",
"version": "1.6.0"
}
}
}
}

You can create a singleton provider like so:

class DnsimpleProvider {
pub static getOrCreate(scope: std.IResource): tf.Provider {
let root = nodeof(scope).root;
let singletonKey = "WingDnsimpleProvider";
let existing = nodeof(root).tryFindChild(singletonKey);
if existing? {
return unsafeCast(existing);
}

return new tf.Provider(
name: "dnsimple",
source: "dnsimple/dnsimple",
version: "1.6.0",
) as singletonKey in root;
}
}

Use DnsimpleProvider.getOrCreate(scope) to get the provider instance.

tf.Element

Just a blob of JSON that goes into the Terraform output:

bring tf;

new tf.Element({
provider: [
{ aws: { } },
{ aws: { alias: "server_function" } },
{ aws: { alias: "global", region: "us-east-1" } }
]
});

The above example will add a provider section to the output Terraform with a set of providers.

Maintainers

License

This library is licensed under the MIT License.

API Reference

Table of Contents

Resource (preflight class)

No description

Constructor

new(props: ResourceProps): Resource

Properties

NameTypeDescription
connectionany?No description
countany?No description
dependsOn
Array?
No description
forEachITerraformIterator?No description
lifecycleTerraformResourceLifecycle?No description
providerTerraformProvider?No description
provisioners
Array?
No description
terraformGeneratorMetadataTerraformProviderGeneratorMetadata?No description
terraformMetaArguments
Map
No description
terraformResourceTypestrNo description
cdktfStackTerraformStackNo description
fqnstrNo description
friendlyUniqueIdstrNo description

Methods

SignatureDescription
addMoveTarget(moveTarget: str): voidAdds a user defined moveTarget string to this resource to be later used in .moveTo(moveTarget) to resolve the location of the move.
getAnyMapAttribute(terraformAttribute: str): Map
No description
getBooleanAttribute(terraformAttribute: str): IResolvableNo description
getBooleanMapAttribute(terraformAttribute: str): Map
No description
getListAttribute(terraformAttribute: str): Array
No description
getNumberAttribute(terraformAttribute: str): numNo description
getNumberListAttribute(terraformAttribute: str): Array
No description
getNumberMapAttribute(terraformAttribute: str): Map
No description
getStringAttribute(terraformAttribute: str): strNo description
getStringMapAttribute(terraformAttribute: str): Map
No description
hasResourceMove(): any?No description
importFrom(id: str, provider: TerraformProvider?): voidNo description
interpolationForAttribute(terraformAttribute: str): IResolvableNo description
static isTerraformResource(x: any): boolNo description
moveFromId(id: str): voidMove the resource corresponding to "id" to this resource.
moveTo(moveTarget: str, index: any?): voidMoves this resource to the target resource given by moveTarget.
moveToId(id: str): voidMoves this resource to the resource corresponding to "id".
toHclTerraform(): anyNo description
toMetadata(): anyNo description
toTerraform(): anyAdds this resource to the terraform JSON output.
addOverride(path: str, value: any): voidNo description
static isTerraformElement(x: any): boolNo description
overrideLogicalId(newLogicalId: str): voidOverrides the auto-generated logical ID with a specific ID.
resetOverrideLogicalId(): voidResets a previously passed logical Id to use the auto-generated logical id again.

Provider (preflight class)

No description

Constructor

new(props: ProviderProps): Provider

Properties

NameTypeDescription
aliasstr?No description
fqnstrNo description
metaAttributes
Map
No description
terraformGeneratorMetadataTerraformProviderGeneratorMetadata?No description
terraformProviderSourcestr?No description
terraformResourceTypestrNo description
cdktfStackTerraformStackNo description
friendlyUniqueIdstrNo description

Methods

SignatureDescription
static isTerraformProvider(x: any): boolNo description
toHclTerraform(): anyNo description
toMetadata(): anyNo description
toTerraform(): anyAdds this resource to the terraform JSON output.
addOverride(path: str, value: any): voidNo description
static isTerraformElement(x: any): boolNo description
overrideLogicalId(newLogicalId: str): voidOverrides the auto-generated logical ID with a specific ID.
resetOverrideLogicalId(): voidResets a previously passed logical Id to use the auto-generated logical id again.

Element (preflight class)

No description

Constructor

new(config: Json): Element

Properties

NameTypeDescription
cdktfStackTerraformStackNo description
fqnstrNo description
friendlyUniqueIdstrNo description

Methods

SignatureDescription
toTerraform(): JsonNo description
addOverride(path: str, value: any): voidNo description
static isTerraformElement(x: any): boolNo description
overrideLogicalId(newLogicalId: str): voidOverrides the auto-generated logical ID with a specific ID.
resetOverrideLogicalId(): voidResets a previously passed logical Id to use the auto-generated logical id again.
toHclTerraform(): anyNo description
toMetadata(): anyNo description

ResourceProps (struct)

No description

Properties

NameTypeDescription
attributesJson?No description
connectionany?No description
countany?No description
dependsOn
Array?
No description
forEachITerraformIterator?No description
lifecycleTerraformResourceLifecycle?No description
providerTerraformProvider?No description
provisioners
Array?
No description
terraformGeneratorMetadataTerraformProviderGeneratorMetadata?No description
terraformResourceTypestrNo description

ProviderProps (struct)

No description

Properties

NameTypeDescription
attributesJson?The provider-specific configuration options. @default {}
namestrThe name of the provider in Terraform - this is the prefix used for all resources in the provider. @example "aws"
sourcestrThe source of the provider on the Terraform Registry. @example "hashicorp/aws"
versionstrThe version of the provider to use. @example "2.0"