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.Resourcecan only be used when compiling your Wing program to atf-*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.Providercan only be used when compiling your Wing program to atf-*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
- Classes
- Structs
Resource (preflight class) 
No description
Constructor
new(props: ResourceProps): Resource
Properties
| Name | Type | Description | 
|---|---|---|
| connection | any? | No description | 
| count | any? | No description | 
| dependsOn |  | No description | 
| forEach | ITerraformIterator? | No description | 
| lifecycle | TerraformResourceLifecycle? | No description | 
| provider | TerraformProvider? | No description | 
| provisioners |  | No description | 
| terraformGeneratorMetadata | TerraformProviderGeneratorMetadata? | No description | 
| terraformMetaArguments |  | No description | 
| terraformResourceType | str | No description | 
| cdktfStack | TerraformStack | No description | 
| fqn | str | No description | 
| friendlyUniqueId | str | No description | 
Methods
| Signature | Description | 
|---|---|
| addMoveTarget(moveTarget: str): void | Adds a user defined moveTarget string to this resource to be later used in .moveTo(moveTarget) to resolve the location of the move. | 
|  | No description | 
| getBooleanAttribute(terraformAttribute: str): IResolvable | No description | 
|  | No description | 
|  | No description | 
| getNumberAttribute(terraformAttribute: str): num | No description | 
|  | No description | 
|  | No description | 
| getStringAttribute(terraformAttribute: str): str | No description | 
|  | No description | 
| hasResourceMove(): any? | No description | 
| importFrom(id: str, provider: TerraformProvider?): void | No description | 
| interpolationForAttribute(terraformAttribute: str): IResolvable | No description | 
| static isTerraformResource(x: any): bool | No description | 
| moveFromId(id: str): void | Move the resource corresponding to "id" to this resource. | 
| moveTo(moveTarget: str, index: any?): void | Moves this resource to the target resource given by moveTarget. | 
| moveToId(id: str): void | Moves this resource to the resource corresponding to "id". | 
| toHclTerraform(): any | No description | 
| toMetadata(): any | No description | 
| toTerraform(): any | Adds this resource to the terraform JSON output. | 
| addOverride(path: str, value: any): void | No description | 
| static isTerraformElement(x: any): bool | No description | 
| overrideLogicalId(newLogicalId: str): void | Overrides the auto-generated logical ID with a specific ID. | 
| resetOverrideLogicalId(): void | Resets a previously passed logical Id to use the auto-generated logical id again. | 
Provider (preflight class) 
No description
Constructor
new(props: ProviderProps): Provider
Properties
| Name | Type | Description | 
|---|---|---|
| alias | str? | No description | 
| fqn | str | No description | 
| metaAttributes |  | No description | 
| terraformGeneratorMetadata | TerraformProviderGeneratorMetadata? | No description | 
| terraformProviderSource | str? | No description | 
| terraformResourceType | str | No description | 
| cdktfStack | TerraformStack | No description | 
| friendlyUniqueId | str | No description | 
Methods
| Signature | Description | 
|---|---|
| static isTerraformProvider(x: any): bool | No description | 
| toHclTerraform(): any | No description | 
| toMetadata(): any | No description | 
| toTerraform(): any | Adds this resource to the terraform JSON output. | 
| addOverride(path: str, value: any): void | No description | 
| static isTerraformElement(x: any): bool | No description | 
| overrideLogicalId(newLogicalId: str): void | Overrides the auto-generated logical ID with a specific ID. | 
| resetOverrideLogicalId(): void | Resets a previously passed logical Id to use the auto-generated logical id again. | 
Element (preflight class) 
No description
Constructor
new(config: Json): Element
Properties
| Name | Type | Description | 
|---|---|---|
| cdktfStack | TerraformStack | No description | 
| fqn | str | No description | 
| friendlyUniqueId | str | No description | 
Methods
| Signature | Description | 
|---|---|
| toTerraform(): Json | No description | 
| addOverride(path: str, value: any): void | No description | 
| static isTerraformElement(x: any): bool | No description | 
| overrideLogicalId(newLogicalId: str): void | Overrides the auto-generated logical ID with a specific ID. | 
| resetOverrideLogicalId(): void | Resets a previously passed logical Id to use the auto-generated logical id again. | 
| toHclTerraform(): any | No description | 
| toMetadata(): any | No description | 
ResourceProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
| attributes | Json? | No description | 
| connection | any? | No description | 
| count | any? | No description | 
| dependsOn |  | No description | 
| forEach | ITerraformIterator? | No description | 
| lifecycle | TerraformResourceLifecycle? | No description | 
| provider | TerraformProvider? | No description | 
| provisioners |  | No description | 
| terraformGeneratorMetadata | TerraformProviderGeneratorMetadata? | No description | 
| terraformResourceType | str | No description | 
ProviderProps (struct) 
No description
Properties
| Name | Type | Description | 
|---|---|---|
| attributes | Json? | The provider-specific configuration options. @default {} | 
| name | str | The name of the provider in Terraform - this is the prefix used for all resources in the provider. @example "aws" | 
| source | str | The source of the provider on the Terraform Registry. @example "hashicorp/aws" | 
| version | str | The version of the provider to use. @example "2.0" |