Skip to content

Latest commit

 

History

History
214 lines (174 loc) · 4.14 KB

README.md

File metadata and controls

214 lines (174 loc) · 4.14 KB

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.