Skip to main content

Sets up TFE / TFC workspaces for all stacks based on a seed stack.

Project description

cdktf-multi-stack-tfe

Setting up Terraform Cloud / Terraform Enterprise workspaces can be tiring when dealing with CDK for Terraform applications spanning multiple stacks and therefore workspaces. This library aims to automate this.

Usage

You need to create the initial workspace yourself, in this case my-app-base.

import * as cdktf from "cdktf";
import Construct from "constructs";
import { BaseStack, Stack, Variable } from "cdktf-multi-stack-tfe";

// We need to have an already created "base" TFE workspace as a basis.
// It will store the TFE workspace configuration and state for all stacks.
// As it creates all TFE workspaces, it's required to be created first (and as a result will scaffold out all the required workspaces).
class MyAppBaseStack extends BaseStack {
  // The name is set to my-app-base
  constructor(scope: Construct) {
    // This will configure the remote backend to use my-company/my-app-base as a workspace
    // my-company is the Terraform organization
    // my-app is the prefix to use for all workspaces
    super(scope, "my-company", "my-app", {
      hostname: "app.terraform.io", // can be set to configure a different Terraform Cloud hostname, e.g. for privately hosted Terraform Enterprise
      token: "my-token", // can be set to configure a token to use
    });

    // You can do additional things in this stack as well
  }
}

class VpcStack extends Stack {
  public vpcId: string

  // This stack will depend on the base stack and it
  // will use the my-company/my-app-$stackName workspace as a backend
  constructor(scope: Construct, stackName: string) {
    super(scope, stackName);

    // Setup an VPC, etc.

    this.vpcId = ....
  }
}

class WebStack extends Stack {
  constructor(scope: Construct, stackName: string, vpcId: string) {
    super(scope, stackName);

    // This expects a TFC variable called "password" in your base stack and
    // will create a variable called "password" in this stack. You can use
    // password.value to get the value as you would do with TerraformVariable.
    const password = new Variable(this, "password", {
      type: "string",
      sensitive: true
    });


    // Setup your webapp using the vpcId
  }
}

const app = new cdktf.App();
new MyAppBaseStack(app); // the stack name is "base"

// This cross-stack reference will lead to permissions being set up so that
// the staging-web workspace can access the staging-vpc workspace.
const vpc = new VpcStack(app, "staging-vpc"); // the stack name is "staging-vpc"
new Web(app, "staging-web", vpc.vpcId); // the stack name is "staging-web"

const prodVpc = new VpcStack(app, "production-vpc");
new Web(app, "production-web", prodVpc.vpcId);

app.synth();

Configuration

Workspace naming

To control the workspace naming please implement the following method on the BaseStack to your liking:

public getWorkspaceName(stackName: string): string {
  return `${this.prefix}-${stackName}`;
}

Workspace configuration

You configure the created workspaces by settting the defaultWorkspaceConfig property on the BaseStack. This config is overwritten by the one specified as the thrid argument of a Stack (in the super call).

Warning

There are some potentially harmful side effects you could run into, so please always carefully read the diff before applying it.

Renaming stacks

This is not supported by the library, if you rename an already existing stack the workspace hosting it will be destroyed and a new one with the new name will be created. This means all references to the infrastructure provisioned in the old stack will be lost, making it impossible to destroy the infrastructure through terraform. In this case we recommend destroying the stack, renaming it and then re-creating it. There are some ways around this issue, but the library currently does not support them.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cdktf-multi-stack-tfe-0.0.50.tar.gz (35.1 kB view details)

Uploaded Source

Built Distribution

cdktf_multi_stack_tfe-0.0.50-py3-none-any.whl (33.2 kB view details)

Uploaded Python 3

File details

Details for the file cdktf-multi-stack-tfe-0.0.50.tar.gz.

File metadata

  • Download URL: cdktf-multi-stack-tfe-0.0.50.tar.gz
  • Upload date:
  • Size: 35.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.1 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for cdktf-multi-stack-tfe-0.0.50.tar.gz
Algorithm Hash digest
SHA256 77cdee5f92c29612c8c2ef9f2ab9dbc2e6e20d4b46547c2908087ffdcb79872f
MD5 de91b0ea9643944d153566d1133183cc
BLAKE2b-256 ca9f093eaa2e88fc17b6342daeff69551a4ab0727cab1b8eb87a71c221b00bf1

See more details on using hashes here.

File details

Details for the file cdktf_multi_stack_tfe-0.0.50-py3-none-any.whl.

File metadata

  • Download URL: cdktf_multi_stack_tfe-0.0.50-py3-none-any.whl
  • Upload date:
  • Size: 33.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.1 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for cdktf_multi_stack_tfe-0.0.50-py3-none-any.whl
Algorithm Hash digest
SHA256 d0442955d72dfcbfd4c1e03f31d967296dc74b58a09d03ccbc3e3fc55fcb8387
MD5 f276f66d136c1e33bf58759c64ce6b49
BLAKE2b-256 a1651d61b45261d3b1ccf645ea8a3b07d019c29c58fa00e6260d2fda077dcef6

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page