Note_Tech

All technological notes.


Project maintained by simonangel-fong Hosted on GitHub Pages — Theme by mattgraham

Terraform - Workspace

Back


Terraform Workspace

instance_type = terraform.workspace == "prod" ? "t3.medium" : "t3.micro"

Common Commands

Command Description
terraform workspace delete Delete a workspace
terraform workspace show Show the name of the current workspace
terraform workspace list List Workspaces
terraform workspace new workspace_name Create a new workspace
terraform workspace select workspace_name Select a workspace

Lab: Local Workspace

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }

  backend "s3" {
    bucket               = ""
    region               = ""
    workspace_key_prefix = "tf-demo-workspace"
    key                  = "terraform.tfstate"
    encrypt              = true
    use_lockfile         = true
  }
}

provider "aws" {
  region = var.aws_region
}


# ##############################
# VPC
# ##############################
resource "aws_vpc" "main" {
  cidr_block           = var.vpc_cidr_block
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name        = format("%s_%s_vpc", var.project_name, terraform.workspace)
    Environment = terraform.workspace
  }
}

resource "aws_subnet" "private" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = var.subnet_cidr_block
  availability_zone = var.availability_zone

  tags = {
    Name        = format("%s_%s_private_subnet", var.project_name, terraform.workspace)
    Environment = terraform.workspace
  }
}

# ##############################
# ec2
# ##############################
resource "aws_instance" "app" {
  count = terraform.workspace == "prod" ? 3 : 1

  ami           = var.ami_id
  instance_type = terraform.workspace == "prod" ? "t2.large" : "t2.micro"
  subnet_id     = aws_subnet.private.id

  tags = {
    Name        = format("%s_%s_ec2_%02d", var.project_name, terraform.workspace, count.index)
    Environment = terraform.workspace
  }
}

cd infra
terraform init
terraform workspace new dev
terraform workspace new prod

# switch and apply
terraform workspace select dev
terraform apply -auto-approve

pic

terraform workspace select prod
terraform apply -auto-approve

pic


pic

pic