Module 2, HCL Syntax From Scratch
What is HCL
HCL stands for HashiCorp Configuration Language. It is designed to be human-readable and machine-friendly.
The Four Building Blocks
1, Blocks
Everything in Terraform is a block. A block has a type, optional labels, and a body:
block_type "label_one" "label_two" {
argument = value
}
Real example:
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-company-data"
}
resource, block type"aws_s3_bucket", resource type (label 1)"my_bucket", local name (label 2)bucket = "my-company-data", argument
2, Arguments
name = "finpay" # string
port = 3000 # number
enabled = true # boolean
availability_zones = ["us-east-1a", "us-east-1b"] # list
tags = {
Environment = "production"
Team = "platform"
}
3, Expressions
# Reference another resource
subnet_id = aws_subnet.public.id
# String interpolation
name = "finpay-${var.environment}"
# Conditional (ternary)
instance_type = var.environment == "production" ? "t3.small" : "t3.micro"
# Function call
bucket_name = lower("MyBucket")
4, Comments
# Single line comment
/*
Multi-line comment
Useful for explaining complex resources
*/
Data Types
region = "us-east-1" # string
port = 5432 # number
multi_az = false # bool
subnets = ["subnet-abc", "subnet-def"] # list(string)
tags = { Name = "finpay-db" } # map(string)
# object
database = {
engine = "postgres"
version = "15"
port = 5432
}
Lab 1, Your First HCL File
mkdir terraform-lab-01
cd terraform-lab-01
touch main.tf
Write this in main.tf:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "first_bucket" {
bucket = "my-terraform-learning-bucket-12345"
tags = {
Name = "My First Terraform Bucket"
Environment = "learning"
}
}
Then run:
terraform init # downloads the AWS provider
terraform plan # shows what will happen
terraform apply # creates the bucket
terraform destroy # deletes the bucket
warning
Observe each output carefully. terraform plan is the most important command you will ever run.
Knowledge Check
- What are the four main components of an HCL block?
- What is the difference between a string and a number in HCL?
- Write an HCL expression that creates a name using string interpolation with a variable called
app_name. - What is the difference between a list and a map?
- Why does
terraform initneed to run beforeterraform plan?
Exam Mapping
- HashiCorp Associate Obj 3: Understand Terraform basics
- HashiCorp Associate Obj 6: Navigate Terraform workflow