Step-01: Introduction
- Learn Dynamic Expressions in Terraform
- Conditional Expression: A conditional expression uses the value of a bool expression to select one of two values.
# Example-1
condition ? true_val : false_val
# Example-2
var.a != "" ? var.a : "default-a"
- Splat Expression: A
splat expression
provides a more concise way to express a common operation that could otherwise be performed with a for
expression.
- The special [*] symbol iterates over all of the elements of the list given to its left and accesses from each one the attribute name given on its right.
# With for expression
[for o in var.list : o.id]
# With Splat Expression [*]
var.list[*].id
- A splat expression can also be used to access attributes and indexes from lists of complex types by extending the sequence of operations to the right of the symbol:
var.list[*].interfaces[0].name
aws_instance.example[*].id
c1-versions.tf
- Added new random provider in
required_providers
block
c2-vairables.tf
- Added new variables
- availability_zones
- name
- team
- high_availability
c3-security-groups.tf
c4-ec2-instance.tf
- Added Random ID resource block
- Added new locals block
- Important Note: Inside locals block we can add conditional expressions as below.
# Create Locals
locals {
#name = var.name
name = (var.name != "" ? var.name : random_id.id.hex)
owner = var.team
common_tags = {
Owner = local.owner
DefaultUser = local.name
}
}
- Added Availability zone argument with count.index
- We will discuss about following conditional expressions here
# In Locals Block: Conditional Expression
name = (var.name != "" ? var.name : random_id.id.hex)
# In EC2 Resource Block: Conditional Expression
count = (var.high_availability == true ? 2 : 1)
# In EC2 Resource Block: count.index
availability_zone = var.availability_zones[count.index]
c5-outputs.tf
- Added Splat expression [*] for all outputs
- Added Common Tags and ELB DNS Name as new outputs
c6-ami-datasource.tf
c7-elb.tf
- Added this new resource
- We will be creating ELB only if "high_availability" variable value is true else it will not be created
# Create ELB if high_availability=true
# In ELB Block: Conditional Expression
count = (var.high_availability == true ? 1 : 0)
# Terraform Initialize
terraform init
# Terraform Validate
terraform validate
# Terraform Plan: When Variable values, high_availability = false and name = "ec2-user"
terraform plan
Observation:
1) Plan will generate for only 1 EC2 instance and 2 Security Groups.
2) ELB Resource will not be created with these variable options
# Terraform Plan: When Variable values, high_availability = true and name = ""
terraform plan
1) Plan will generate for only 2 EC2 instance, 2 Security Groups and 1 ELB
2) ELB Resource will be created with these variable options
3) name value will be a random value known after terraform apply completed
# Terraform Apply
terraform apply -auto-approve
# Verify
1) Verify Outputs
2) Verify EC2 Instances & Security Groups & Common Tags
3) Verify ELB & Common Tags for ELB
4) Access App using ELB DNS Name
Step-04: Clean-Up
# Terraform Destroy
terraform destroy -auto-approve
# Clean-Up
rm -rf .terraform*
rm -rf terraform.tfstate*
# Uncomment and Comment right values in c2-variables.tf (Roll back to put ready for student demo)
high_availability = false
name = "ec2-user"