====== Terraform Workspace ======
===== Set up workspace =====
$ terraform workspace new dev
Created and switched to workspace "dev"!
$ terraform workspace new prod
Created and switched to workspace "prod"!
$ terraform workspace list
default <------------------ Note default workspace which is always present.
* dev <================== Asterisk indicates current workspace
prod
testing123
$ terraform workspace select prod
Switched to workspace "prod".
$ terraform workspace show
prod
$ terraform workspace select dev
Switched to workspace "dev".
===== Terraform code to use workspace =====
setup.tf
# Export key and secret credentials first.
# Create new workspace with 'terraform workspace new dev|prod'
# See all workspaces with 'terraform workspace list'
# Select workspace with 'terraform select dev|prod'
# run as -> $ terraform apply
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "3.74.1"
}
}
# Use AWS s3 and dynamo for state files
backend "s3" {
region = "eu-west-2"
bucket = "ajs-vpc-ec2-statefiles"
key = "tsg/plan-apply.tfstate"
dynamodb_table = "ajs-tsg-plan-apply-lockfiles"
}
}
provider "aws" {
region = "eu-west-2"
}
parameter-store.tf
resource "aws_ssm_parameter" "environment" {
name = format("%s_%s", "environment", terraform.workspace)
type = "String"
description = "Environment, eg. Production / Development"
tags = {
email = "andrew.2.stringer@bt.com",
builtBy = "terraform"
}
value = terraform.workspace
}
variable "ami_instance_type" {
type = map # Note! TF variable type lower case
default = {
"prod" = "t2.large"
"dev" = "t2.nano"
}
}
resource "aws_ssm_parameter" "ami_to_use" {
name = format("%s_%s", "ami_to_use", terraform.workspace)
type = "String" # NOTE! Quotes + Capital - AWS resource Type
value = var.ami_instance_type[terraform.workspace]
}
network.tf
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "default"
tags = {
Name = format("%s_%s", "vpc", terraform.workspace)
}
}
===== Using Workspace to create prod and dev environments with the same code =====
You will need to create a prod and dev workspace first. Depending on which workspace you run the ''terraform apply'' from, an appropriate instance size will be selected for EC2 and an appropriately named VPC will be created.
Note:- No changes needed to the actual terraform code to create two environments in one account but with different resources.
**setup.tf**
# Export key and secret credentials first.
# run as -> $ terraform apply
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "3.74.1"
}
}
# Use AWS s3 and dynamo for state files
backend "s3" {
region = "eu-west-2"
bucket = "tfworkspace-statefiles"
key = "tsg/plan-apply.tfstate"
dynamodb_table = "tsg-plan-apply-lockfiles"
}
}
provider "aws" {
region = "eu-west-2"
}
**parameter-store.tf**
resource "aws_ssm_parameter" "environment" {
name = format("%s_%s", "environment", terraform.workspace)
type = "String"
description = "Environment, eg. Production / Development"
tags = {
email = "andrew.2.stringer@bt.com",
builtBy = "terraform"
}
value = terraform.workspace
}
variable "ami_instance_type" {
type = map # Note! TF variable type lower case
default = {
"prod" = "t2.large"
"dev" = "t2.nano"
}
}
resource "aws_ssm_parameter" "ami_to_use" {
name = format("%s_%s", "ami_to_use", terraform.workspace)
type = "String" # NOTE! Quotes + Capital - AWS resource Type
value = var.ami_instance_type[terraform.workspace]
}
**network.tf**
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "default"
tags = {
Name = format("%s_%s", "vpc", terraform.workspace)
}
}