Skip to content

Files

Latest commit

23107e7 · Jan 7, 2025

History

History

tf

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Apr 14, 2024
Sep 16, 2024
Apr 14, 2024
Sep 16, 2024
Jul 4, 2024
Jul 4, 2024
Jul 4, 2024
Jan 7, 2025
Jan 7, 2025
Jun 11, 2024
Jul 4, 2024
Jun 14, 2024
Sep 16, 2024
Apr 14, 2024
Sep 16, 2024

README.md

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.