āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Terraform: āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāļŠāļģāļŦāļĢāļąāļ Infrastructure as Code
āđāļāļĢāļĩāļĒāļĄāļāļ§āļēāļĄāļāļĢāđāļāļĄāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Terraform āļāđāļ§āļĒāļāļģāļāļēāļĄāđāļĨāļ°āļāļģāļāļāļāļāļĩāđāļāļĢāļāļāļāļĨāļļāļĄāļāļļāļāļŦāļąāļ§āļāđāļāļŠāļģāļāļąāļ āļāļąāđāļāđāļāđāļāļ·āđāļāļāļēāļ State Management āđāļāļāļāļāļķāļ Modules āđāļĨāļ° CI/CD

āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļāđāļāļāļģāđāļŦāļāđāļ DevOps āļŦāļĢāļ·āļ Cloud Engineer āļĄāļąāļāļāļ°āļĄāļĩāļāļģāļāļēāļĄāđāļāļĩāđāļĒāļ§āļāļąāļ Terraform āļāļĒāļđāđāđāļŠāļĄāļ āđāļāļ·āđāļāļāļāļēāļ Terraform āđāļāđāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļ Infrastructure as Code (IaC) āļāļĩāđāđāļāđāļĢāļąāļāļāļ§āļēāļĄāļāļīāļĒāļĄāļĄāļēāļāļāļĩāđāļŠāļļāļāđāļāļāļąāļāļāļļāļāļąāļ āļāļāļāļ§āļēāļĄāļāļĩāđāļĢāļ§āļāļĢāļ§āļĄāļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Terraform āļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļ āļāļĢāđāļāļĄāļāļģāļāļāļāđāļĨāļ°āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāļģāđāļāđāļāđāļāļēāļāđāļāđāļāļĢāļīāļ āđāļĄāđāļ§āđāļēāļāļ°āđāļāđāļāļāļđāđāļāļĩāđāđāļāļīāđāļāđāļĢāļīāđāļĄāļāđāļāļĻāļķāļāļĐāļē Terraform āļŦāļĢāļ·āļāļāļđāđāļāļĩāđāļĄāļĩāļāļĢāļ°āļŠāļāļāļēāļĢāļāđāđāļĨāđāļ§ āļāļāļāļ§āļēāļĄāļāļĩāđāļāļ°āļāđāļ§āļĒāđāļāļĢāļĩāļĒāļĄāļāļ§āļēāļĄāļāļĢāđāļāļĄāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļāđāļāđāļāļĒāđāļēāļāļĄāļąāđāļāđāļ
āļāļđāđāļŠāļąāļĄāļ āļēāļĐāļāđāļĄāļąāļāļāļĢāļ°āđāļĄāļīāļāļāļąāđāļāļāļ§āļēāļĄāđāļāđāļēāđāļāđāļāđāļāļ§āļāļīāļāļāļ·āđāļāļāļēāļāđāļĨāļ°āļāļĢāļ°āļŠāļāļāļēāļĢāļāđāļāļēāļĢāđāļāđāļāļēāļāļāļĢāļīāļ āļāļēāļĢāļāļāļāļāļģāļāļēāļĄāļāļ§āļĢāđāļŠāļāļāđāļŦāđāđāļŦāđāļāļāļķāļāļāļ§āļēāļĄāđāļāđāļēāđāļāđāļāļŦāļĨāļąāļāļāļēāļĢāļāļģāļāļēāļāļāļāļ Terraform āļĢāļ§āļĄāļāļķāļāļāļĢāļ°āļŠāļāļāļēāļĢāļāđāđāļāļāļēāļĢāđāļāđāđāļāļāļąāļāļŦāļēāļāļĩāđāđāļāļīāļāļāļķāđāļāļāļĢāļīāļāđāļāļāļēāļĢāļāļģāļāļēāļ
āđāļāļ§āļāļīāļāļāļ·āđāļāļāļēāļāļāļāļ Terraform
Terraform āļāļ·āļāļāļ°āđāļĢ
Terraform āđāļāđāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļ Infrastructure as Code (IaC) āđāļāļ Open Source āļāļĩāđāļāļąāļāļāļēāđāļāļĒ HashiCorp āđāļāđāļ āļēāļĐāļē HCL (HashiCorp Configuration Language) āđāļāļāļēāļĢāļāļĢāļ°āļāļēāļĻ Infrastructure āļāļĩāđāļāđāļāļāļāļēāļĢ Terraform āļāļģāļāļēāļāļāļēāļĄāļŦāļĨāļąāļāļāļēāļĢ Declarative āļāļķāđāļāļŦāļĄāļēāļĒāļāļ§āļēāļĄāļ§āđāļēāļāļđāđāđāļāđāļāļēāļāļāļ°āļāļĢāļ°āļāļēāļĻāļŠāļāļēāļāļ°āļāļĩāđāļāđāļāļāļāļēāļĢāđāļŦāđ Infrastructure āđāļāđāļ āđāļĨāļ° Terraform āļāļ°āļāļģāļāļ§āļāļ§āđāļēāļāđāļāļāļāļģāļāļ°āđāļĢāļāđāļēāļāđāļāļ·āđāļāđāļŦāđāļāļķāļāļŠāļāļēāļāļ°āļāļąāđāļ
āļāļļāļāđāļāđāļāļāļāļ Terraform āļāļ·āļāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļāļēāļĢāļāļąāļāļāļēāļĢ Infrastructure āļāđāļēāļĄ Cloud Provider āļŦāļĨāļēāļĒāļĢāļēāļĒāđāļāđāļāļĢāđāļāļĄāļāļąāļ āđāļĄāđāļ§āđāļēāļāļ°āđāļāđāļ AWS, Azure, Google Cloud āļŦāļĢāļ·āļāđāļĄāđāđāļāđ On-Premise Infrastructure āđāļāļĒāđāļāđāđāļ§āļĒāļēāļāļĢāļāđāđāļāļĩāļĒāļ§āļāļąāļ
āļāļģāļŠāļąāđāļ Workflow āļŦāļĨāļąāļāļāļāļ Terraform
Terraform āļĄāļĩāļāļģāļŠāļąāđāļāļŦāļĨāļąāļ 4 āļāļģāļŠāļąāđāļāļāļĩāđāđāļāđāđāļāļāļēāļĢāļāļģāļāļēāļāļāļĢāļ°āļāļģāļ§āļąāļ āđāļāđāđāļāđ init, plan, apply āđāļĨāļ° destroy
# 1. Initialize - downloads providers and modules
terraform init
# 2. Plan - shows what will change without modifying anything
terraform plan -out=tfplan
# 3. Apply - executes the planned changes
terraform apply tfplan
# 4. Destroy - tears down all managed resources
terraform destroyāļāļģāļŠāļąāđāļ terraform init āļāļ°āļāļēāļ§āļāđāđāļŦāļĨāļ Provider āđāļĨāļ° Module āļāļĩāđāļāļģāđāļāđāļ āļĢāļ§āļĄāļāļķāļāļāļąāđāļāļāđāļē Backend āļŠāļģāļŦāļĢāļąāļāđāļāđāļ State āļāļģāļŠāļąāđāļ terraform plan āļāļ°āđāļŠāļāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļĩāđāļāļ°āđāļāļīāļāļāļķāđāļāđāļāļĒāđāļĄāđāļāļģāļāļēāļĢāđāļāđāđāļāļāļĢāļīāļ āļāļķāđāļāđāļāđāļāļāļąāđāļāļāļāļāļŠāļģāļāļąāļāđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāđāļāļāļāļēāļĢ Deploy āļāļģāļŠāļąāđāļ terraform apply āļāļ°āļāļģāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļĢāļīāļāļāļēāļĄ Plan āļāļĩāđāļāļģāļŦāļāļ āđāļĨāļ°āļāļģāļŠāļąāđāļ terraform destroy āļāļ°āļĨāļāļāļĢāļąāļāļĒāļēāļāļĢāļāļąāđāļāļŦāļĄāļāļāļĩāđ Terraform āļāļąāļāļāļēāļĢāļāļĒāļđāđ
āļāļēāļĢāļāļąāļāļāļēāļĢ State
State āļāļ·āļāļāļ°āđāļĢāđāļĨāļ°āļāļģāđāļĄāļāļķāļāļŠāļģāļāļąāļ
Terraform State āđāļāđāļāđāļāļĨāđāļāļĩāđāđāļāđāļāļāđāļāļĄāļđāļĨāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļĢāļ°āļŦāļ§āđāļēāļ Configuration āļāļĩāđāđāļāļĩāļĒāļāđāļ§āđāļāļąāļāļāļĢāļąāļāļĒāļēāļāļĢāļāļĢāļīāļāļāļ Cloud Provider State āļāļģāļŦāļāđāļēāļāļĩāđāđāļāđāļāđāļŦāļĨāđāļāļāđāļāļĄāļđāļĨāļāļ§āļēāļĄāļāļĢāļīāļ (Source of Truth) āļāļĩāđ Terraform āđāļāđāđāļāļāļēāļĢāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļ§āđāļēāļŠāļāļēāļāļ°āļāļąāļāļāļļāļāļąāļāļāļāļ Infrastructure āđāļāļāļāđāļēāļāļāļēāļāļŠāļāļēāļāļ°āļāļĩāđāļāđāļāļāļāļēāļĢāļāļĒāđāļēāļāđāļĢ
State āļĄāļĩāļāļ§āļēāļĄāļŠāļģāļāļąāļāļāļĒāđāļēāļāļĒāļīāđāļāđāļāļ·āđāļāļāļāļēāļāđāļāđāļāļāđāļāļĄāļđāļĨ Metadata āļāļāļāļāļĢāļąāļāļĒāļēāļāļĢ āđāļāđāļ ID āļāļāļāļāļĢāļąāļāļĒāļēāļāļĢāļāļ Cloud, āļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļĢāļ°āļŦāļ§āđāļēāļāļāļĢāļąāļāļĒāļēāļāļĢ āđāļĨāļ°āļāđāļēāļāļĩāđ Terraform āļāļģāļāļ§āļāđāļāđ āļŦāļēāļāđāļĄāđāļĄāļĩ State Terraform āļāļ°āđāļĄāđāļŠāļēāļĄāļēāļĢāļāļāļĢāļēāļāļ§āđāļēāļāļĢāļąāļāļĒāļēāļāļĢāđāļāļāļĩāđāļāļąāļāļāļēāļĢāļāļĒāļđāđāđāļĨāļ°āļāđāļāļāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļ°āđāļĢāļāđāļēāļ
āļāļēāļĢāļāļąāļāļāļēāļĢ State āđāļ Production
āđāļāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄ Production āļāļēāļĢāđāļāđāļ State āđāļ§āđāđāļāđāļāļĢāļ·āđāļāļāļāđāļāļāļāļīāđāļāđāļĄāđāđāļŦāļĄāļēāļ°āļŠāļĄ āđāļāļ·āđāļāļāļāļēāļāļŦāļĨāļēāļĒāļāļāđāļāļāļĩāļĄāļāđāļāļāļāļēāļĢāđāļāđāļēāļāļķāļ State āđāļāļĩāļĒāļ§āļāļąāļ āđāļĨāļ°āļāđāļāļāļĄāļĩāļāļĨāđāļāļāđāļāļāļāļąāļāļāļēāļĢāđāļāđāđāļāļāļĢāđāļāļĄāļāļąāļ (Locking) āļāļēāļĢāđāļāđ Remote Backend āđāļāđāļ S3 āļāļĢāđāļāļĄ DynamoDB āļŠāļģāļŦāļĢāļąāļ Locking āđāļāđāļāđāļāļ§āļāļāļīāļāļąāļāļīāļāļĩāđāđāļāļ°āļāļģ
# backend.tf
terraform {
backend "s3" {
bucket = "company-terraform-state"
key = "prod/networking/terraform.tfstate"
region = "eu-west-1"
dynamodb_table = "terraform-locks"
encrypt = true
}
}āļāļēāļĢāļāļąāđāļāļāđāļēāļāļĩāđāļĄāļĩāļāļāļāđāļāļĢāļ°āļāļāļāļŠāļģāļāļąāļāļŦāļĨāļēāļĒāļāļĒāđāļēāļ āđāļāđāđāļāđ bucket āļŠāļģāļŦāļĢāļąāļāđāļāđāļāđāļāļĨāđ State, key āļŠāļģāļŦāļĢāļąāļāļāļģāļŦāļāļāļāļģāđāļŦāļāđāļāđāļāļĨāđāļ āļēāļĒāđāļ Bucket, dynamodb_table āļŠāļģāļŦāļĢāļąāļāļāļģ Locking āļāđāļāļāļāļąāļāļāļēāļĢāđāļāđāđāļāļāļĢāđāļāļĄāļāļąāļ āđāļĨāļ° encrypt āļŠāļģāļŦāļĢāļąāļāđāļāđāļēāļĢāļŦāļąāļŠāđāļāļĨāđ State āđāļāļ·āđāļāļāļāļēāļāļāļēāļāļĄāļĩāļāđāļāļĄāļđāļĨāļŠāļģāļāļąāļāļāļĒāļđāđ
āđāļāļĨāđ State āļāļēāļāļĄāļĩāļāđāļāļĄāļđāļĨāļŠāļģāļāļąāļāđāļāđāļ Password āļŦāļĢāļ·āļ Secret āļāļ§āļĢāđāļāļīāļāđāļāđāļāļēāļāļāļēāļĢāđāļāđāļēāļĢāļŦāļąāļŠāđāļŠāļĄāļ āđāļĨāļ°āļāļģāļāļąāļāļāļēāļĢāđāļāđāļēāļāļķāļ Bucket āđāļāļāļēāļ°āļāļđāđāļāļĩāđāļāļģāđāļāđāļāļāđāļāļāđāļāđāļāļēāļāđāļāđāļēāļāļąāđāļ āļāļāļāļāļēāļāļāļĩāđāļāļ§āļĢāđāļāļīāļāđāļāđāļāļēāļ Versioning āļāļ S3 Bucket āđāļāļ·āđāļāđāļŦāđāļŠāļēāļĄāļēāļĢāļāļāļđāđāļāļ·āļ State āđāļ§āļāļĢāđāļāļąāļāļāđāļāļāļŦāļāđāļēāđāļāđāļŦāļēāļāđāļāļīāļāļāļąāļāļŦāļē
Modules
Module āļāļģāļāļēāļāļāļĒāđāļēāļāđāļĢ
Module āđāļ Terraform āļāļ·āļāļāļĨāļļāđāļĄāļāļāļāļāļĢāļąāļāļĒāļēāļāļĢāļāļĩāđāļāļąāļāđāļāđāļāļŦāļāđāļ§āļĒāđāļāļĩāļĒāļ§āļāļąāļ āļŠāļēāļĄāļēāļĢāļāļāļģāļāļĨāļąāļāļĄāļēāđāļāđāļāđāļģāđāļāđ Module āļāđāļ§āļĒāđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļāļąāļ Infrastructure Pattern āļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļāļāđāļŦāļĢāļ·āļāļāļĩāļĄāđāļāđāļāļĒāđāļēāļāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ āļĨāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāđāļāļāđāļģāļāđāļāļ āđāļĨāļ°āļāļģāđāļŦāđāļāļēāļĢāļāļģāļĢāļļāļāļĢāļąāļāļĐāļēāļāđāļēāļĒāļāļķāđāļ
# main.tf - calling a module
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.16.0"
name = "production-vpc"
cidr = "10.0.0.0/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
single_nat_gateway = true
}āļāļąāļ§āļāļĒāđāļēāļāļāļĩāđāđāļŠāļāļāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđ Module āļāļēāļ Terraform Registry āļāļķāđāļāđāļāđāļ Module āļŠāļģāđāļĢāđāļāļĢāļđāļāļāļĩāđāļāđāļēāļāļāļēāļĢāļāļāļŠāļāļāđāļĨāđāļ§ āļāļēāļĢāļĢāļ°āļāļļ version āđāļāđāļāļŠāļīāđāļāļŠāļģāļāļąāļāđāļāļ·āđāļāđāļŦāđāđāļāđāđāļāļ§āđāļē Infrastructure āļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāļāđāļģāđāļāđāđāļŦāļĄāļ·āļāļāđāļāļīāļĄāļāļļāļāļāļĢāļąāđāļ
āļŦāļĨāļąāļāļāļēāļĢāļāļāļāđāļāļ Module āļāļĩāđāļāļĩ
Module āļāļĩāđāļāļāļāđāļāļāļĄāļēāļāļĒāđāļēāļāļāļĩāļāļ§āļĢāļĄāļĩāļāļļāļāļŠāļĄāļāļąāļāļīāļāļąāļāļāļĩāđ:
- āļĄāļĩāļāļļāļāļāļĢāļ°āļŠāļāļāđāđāļāļĩāļĒāļ§: Module āļāļ§āļĢāļāļģāļŦāļāđāļēāļāļĩāđāđāļāļĩāļĒāļ§āļāļĒāđāļēāļāļāļąāļāđāļāļ āđāļāđāļ āļŠāļĢāđāļēāļ VPC āļŦāļĢāļ·āļāļŠāļĢāđāļēāļ EKS Cluster
- āļĄāļĩ Input Variables āļāļĩāđāđāļŦāļĄāļēāļ°āļŠāļĄ: āļāļ§āļĢāļĄāļĩāļāđāļē Default āļāļĩāđāļŠāļĄāđāļŦāļāļļāļŠāļĄāļāļĨ āđāļĨāļ°āļāļāļļāļāļēāļāđāļŦāđāļāļĢāļąāļāđāļāđāļāđāļāđāļāļēāļĄāļāļ§āļēāļĄāļāļģāđāļāđāļ
- āļĄāļĩ Output āļāļĩāđāļāļģāđāļāđāļ: āļāļ§āļĢāļŠāđāļāļāļāļāļāđāļēāļāļĩāđ Module āļāļ·āđāļāļŦāļĢāļ·āļ Root Module āļāđāļāļāļāļēāļĢāđāļāđāļāļēāļ
- āļĄāļĩ Documentation āļāļĢāļāļāđāļ§āļ: āļāļ§āļĢāļĄāļĩāļāļģāļāļāļīāļāļēāļĒāļāļēāļĢāđāļāđāļāļēāļ āļāļąāļ§āļāļĒāđāļēāļ āđāļĨāļ° README āļāļĩāđāļāļąāļāđāļāļ
āļāļĢāđāļāļĄāļāļĩāđāļāļ°āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ DevOps āđāļĨāđāļ§āļŦāļĢāļ·āļāļĒāļąāļāļāļĢāļąāļ?
āļāļķāļāļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāđāļāļāđāļāđāļāļāļ, flashcards āđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
Workspaces, Environments āđāļĨāļ°āđāļāļĢāļāļŠāļĢāđāļēāļāđāļāļĢāđāļāļāļāđ
āļĢāļđāļāđāļāļāļāļēāļĢāļāļąāļāļāļēāļĢāļŦāļĨāļēāļĒ Environment
āļāļēāļĢāļāļąāļāļāļēāļĢ Infrastructure āļŦāļĨāļēāļĒ Environment āđāļāđāļ Development, Staging āđāļĨāļ° Production āđāļāđāļāļāļ§āļēāļĄāļāđāļēāļāļēāļĒāļāļĩāđāļāļāļāđāļāļĒ āļĄāļĩāļŦāļĨāļēāļĒāļ§āļīāļāļĩāđāļāļāļēāļĢāļāļąāļāļāļēāļĢ āđāļāđāļĨāļ°āļ§āļīāļāļĩāļĄāļĩāļāđāļāļāļĩāļāđāļāđāļŠāļĩāļĒāđāļāļāļāđāļēāļāļāļąāļ
| āļĢāļđāļāđāļāļ | āļāđāļāļāļĩ | āļāđāļāđāļŠāļĩāļĒ | āđāļŦāļĄāļēāļ°āļāļąāļ | |--------|-------|---------|----------| | Workspaces | āļāđāļēāļĒ āđāļāđ Code āļāļļāļāđāļāļĩāļĒāļ§ | State āļāļĒāļđāđāđāļ Backend āđāļāļĩāļĒāļ§ | āļāļĩāļĄāđāļĨāđāļ Environment āļāļĨāđāļēāļĒāļāļąāļ | | Directory āļāđāļēāļ āđ | āđāļĒāļ State āļāļąāļāđāļāļ āļāļĨāļāļāļ āļąāļĒ | āđāļāđāļāļāđāļģāļāđāļāļ | Environment āđāļāļāļāđāļēāļāļāļąāļāļĄāļēāļ | | Terragrunt | DRY āļĒāļ·āļāļŦāļĒāļļāđāļ | āļāđāļāļāđāļĢāļĩāļĒāļāļĢāļđāđāđāļāļĢāļ·āđāļāļāļĄāļ·āļāđāļāļīāđāļĄ | āđāļāļĢāđāļāļāļāđāļāļāļēāļāđāļŦāļāđ |
Workspace vs Directory Isolation
Terraform Workspaces āļāđāļ§āļĒāđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāđ Configuration āļāļļāļāđāļāļĩāļĒāļ§āļāļąāļāļŦāļĨāļēāļĒ Environment āđāļāđ āđāļāļĒāđāļāđāļĨāļ° Workspace āļāļ°āļĄāļĩ State āđāļĒāļāļāļąāļ āļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄ Workspaces āđāļĄāđāđāļāđāđāļĒāļ Backend āļāļąāļāļāļąāđāļāļŦāļēāļāļĄāļĩāļāļąāļāļŦāļēāļāļąāļ Backend āļāļ°āļāļĢāļ°āļāļāļāļļāļ Environment
āļāļēāļĢāđāļāđ Directory āđāļĒāļāļŠāļģāļŦāļĢāļąāļāđāļāđāļĨāļ° Environment āđāļŦāđāļāļēāļĢāđāļĒāļāļāļĩāđāļāļąāļāđāļāļāļāļ§āđāļē āđāļāđāļāđāļāļāļāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢāļāđāļģāļāđāļāļāļāļāļāđāļāđāļ āļ§āļīāļāļĩāļāļĩāđāļāļīāļĒāļĄāļāļ·āļāļāļēāļĢāđāļāđ Module āļĢāđāļ§āļĄāļāļąāļ āđāļĨāļ°āļĄāļĩ Configuration āđāļāļāļēāļ°āļŠāļģāļŦāļĢāļąāļāđāļāđāļĨāļ° Environment
Providers, Data Sources āđāļĨāļ° Resource Lifecycle
āļāļēāļĢāļāļąāđāļāļāđāļē Provider
Provider āđāļāđāļāļāļąāļ§āđāļāļ·āđāļāļĄāļāđāļāļĢāļ°āļŦāļ§āđāļēāļ Terraform āļāļąāļ API āļāļāļ Cloud Provider āļŦāļĢāļ·āļāļāļĢāļīāļāļēāļĢāļāđāļēāļ āđ āļāļēāļĢāļāļąāđāļāļāđāļē Provider āļāļĒāđāļēāļāđāļŦāļĄāļēāļ°āļŠāļĄāđāļāđāļāļāļ·āđāļāļāļēāļāļāļĩāđāļŠāļģāļāļąāļ
# providers.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.80"
}
}
}
provider "aws" {
region = var.aws_region
default_tags {
tags = {
Environment = var.environment
ManagedBy = "terraform"
Team = var.team_name
}
}
}āļāļēāļĢāļĢāļ°āļāļļ Version Constraint āđāļāđāļ ~> 5.80 āļŦāļĄāļēāļĒāļāļ§āļēāļĄāļ§āđāļēāļāļ°āđāļāđ Version 5.80 āļŦāļĢāļ·āļāļŠāļđāļāļāļ§āđāļē āđāļāđāļāđāļģāļāļ§āđāļē 6.0 āļāļķāđāļāļāđāļ§āļĒāļāđāļāļāļāļąāļāļāļēāļĢāļāļąāļāđāļāļĢāļāļāļĩāđāļāļēāļāļāļģāđāļŦāđāđāļāļīāļāļāļąāļāļŦāļē āļāļēāļĢāđāļāđ default_tags āļāđāļ§āļĒāđāļŦāđāļāļļāļāļāļĢāļąāļāļĒāļēāļāļĢāļāļĩāđāļŠāļĢāđāļēāļāļĄāļĩ Tag āļĄāļēāļāļĢāļāļēāļāđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī
Data Sources vs Resources
Data Sources āđāļāđāļŠāļģāļŦāļĢāļąāļāļāđāļēāļāļāđāļāļĄāļđāļĨāļāļēāļāļāļĢāļąāļāļĒāļēāļāļĢāļāļĩāđāļĄāļĩāļāļĒāļđāđāđāļĨāđāļ§ āđāļāļĒāđāļĄāđāļŠāļĢāđāļēāļāļŦāļĢāļ·āļāđāļāđāđāļāļāļ°āđāļĢ āđāļāļāļāļ°āļāļĩāđ Resources āđāļāđāļŠāļģāļŦāļĢāļąāļāļŠāļĢāđāļēāļāđāļĨāļ°āļāļąāļāļāļēāļĢāļāļĢāļąāļāļĒāļēāļāļĢāđāļŦāļĄāđ
# Data source - reads an existing AMI, does not create anything
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"]
}
}
# Resource - creates an EC2 instance using the data source
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
}āđāļāļāļąāļ§āļāļĒāđāļēāļāļāļĩāđ Data Source aws_ami āļāđāļāļŦāļē AMI āļāļāļ Ubuntu āļāļĩāđāļĄāļĩāļāļĒāļđāđāđāļĨāđāļ§ āđāļĨāļ° Resource aws_instance āđāļāđ ID āļāļāļ AMI āļāļąāđāļāđāļāļāļēāļĢāļŠāļĢāđāļēāļ EC2 Instance āđāļŦāļĄāđ
Lifecycle Meta-Arguments āđāļāđāļ create_before_destroy, prevent_destroy āđāļĨāļ° ignore_changes āļāđāļ§āļĒāļāļ§āļāļāļļāļĄāļāļĪāļāļīāļāļĢāļĢāļĄāļāļēāļĢāļŠāļĢāđāļēāļāđāļĨāļ°āļĨāļāļāļĢāļąāļāļĒāļēāļāļĢ āļāļēāļĢāđāļāđ prevent_destroy = true āļāļąāļāļāļĢāļąāļāļĒāļēāļāļĢāļŠāļģāļāļąāļāđāļāđāļ Database āļāļ°āļāđāļāļāļāļąāļāļāļēāļĢāļĨāļāđāļāļĒāđāļĄāđāļāļąāđāļāđāļ
āļŦāļąāļ§āļāđāļāļāļąāđāļāļŠāļđāļ
āļāļēāļĢ Import āļāļĢāļąāļāļĒāļēāļāļĢāļāļĩāđāļĄāļĩāļāļĒāļđāđ
āļāļēāļāļāļĢāļąāđāļāļāđāļāļāļāļēāļĢāļāļģāļāļĢāļąāļāļĒāļēāļāļĢāļāļĩāđāļŠāļĢāđāļēāļāđāļ§āđāđāļĨāđāļ§āļāđāļ§āļĒāļĄāļ·āļāļĄāļēāļāļĒāļđāđāļ āļēāļĒāđāļāđāļāļēāļĢāļāļąāļāļāļēāļĢāļāļāļ Terraform Terraform 1.5 āļāļķāđāļāđāļāļĢāļāļāļĢāļąāļāļāļēāļĢ Import āđāļāļ Declarative āļāđāļ§āļĒ import Block
# import.tf
import {
to = aws_s3_bucket.legacy_data
id = "my-legacy-bucket-name"
}
resource "aws_s3_bucket" "legacy_data" {
bucket = "my-legacy-bucket-name"
}āļ§āļīāļāļĩāļāļĩāđāļāđāļ§āļĒāđāļŦāđāļāļēāļĢ Import āđāļāđāļāļŠāđāļ§āļāļŦāļāļķāđāļāļāļāļ Configuration āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ Review āđāļ Pull Request āđāļāđāļāđāļāļāļāļēāļĢ Apply
Moved Blocks āļŠāļģāļŦāļĢāļąāļāļāļēāļĢ Refactor
āđāļĄāļ·āđāļāļāđāļāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļāļ·āđāļ Resource āļŦāļĢāļ·āļāļĒāđāļēāļĒ Resource āđāļāđāļē Module āļŠāļēāļĄāļēāļĢāļāđāļāđ moved Block āđāļāļ·āđāļāļāļāļ Terraform āļ§āđāļēāđāļĄāđāļāđāļāļāļĨāļāđāļĨāļ°āļŠāļĢāđāļēāļāđāļŦāļĄāđ āđāļāđāđāļŦāđ Update State āđāļāļ
# Renamed a resource from "web" to "app"
moved {
from = aws_instance.web
to = aws_instance.app
}āļāļēāļĢāļāļāļŠāļāļ Terraform
Terraform 1.6 āļāļķāđāļāđāļāļĄāļĩ Native Testing Framework āļāļĩāđāļāđāļ§āļĒāđāļŦāđāđāļāļĩāļĒāļ Test āļŠāļģāļŦāļĢāļąāļ Configuration āđāļāđ
# tests/vpc.tftest.hcl
run "creates_vpc_with_correct_cidr" {
command = plan
assert {
condition = aws_vpc.main.cidr_block == "10.0.0.0/16"
error_message = "VPC CIDR block does not match expected value"
}
}
run "creates_three_private_subnets" {
command = plan
assert {
condition = length(aws_subnet.private) == 3
error_message = "Expected 3 private subnets"
}
}āļāļēāļĢāļāļāļŠāļāļāļāđāļ§āļĒāđāļŦāđāļĄāļąāđāļāđāļāļ§āđāļē Configuration āļāļģāļāļēāļāļāļđāļāļāđāļāļāļāđāļāļāļāļēāļĢ Deploy āđāļĨāļ°āļāđāļ§āļĒāļāđāļāļāļāļąāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļĩāđāļāļēāļāļāļģāđāļŦāđāđāļāļīāļāļāļąāļāļŦāļē
Terraform āđāļ CI/CD Pipeline
āļāļēāļĢāļĢāļ§āļĄ Terraform āđāļāđāļēāļāļąāļ CI/CD Pipeline āđāļāđāļāđāļāļ§āļāļāļīāļāļąāļāļīāļāļĩāđāļŠāļģāļāļąāļāļŠāļģāļŦāļĢāļąāļāļāļĩāļĄāļāļĩāđāļāđāļāļāļāļēāļĢāļāļąāļāļāļēāļĢ Infrastructure āļāļĒāđāļēāļāđāļāđāļāļĢāļ°āļāļ āļāļąāđāļāļāļāļāļāļĩāđāđāļāļ°āļāļģāļĄāļĩāļāļąāļāļāļĩāđ:
- Validate āđāļĨāļ° Format: āļĢāļąāļ
terraform validateāđāļĨāļ°terraform fmt -checkāđāļāļ·āđāļāļāļĢāļ§āļāļŠāļāļ Syntax āđāļĨāļ° Formatting - Security Scan: āđāļāđāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļĒāđāļēāļ tfsec āļŦāļĢāļ·āļ Checkov āđāļāļ·āđāļāļāļĢāļ§āļāļŦāļēāļāļąāļāļŦāļēāļāđāļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ
- Plan: āļĢāļąāļ
terraform planāđāļĨāļ°āļāļąāļāļāļķāļ Plan File āļŠāļģāļŦāļĢāļąāļ Review - Review: āđāļŦāđāļāļĩāļĄāļāļĢāļ§āļāļŠāļāļ Plan āļāđāļāļ Apply āđāļāļĒāđāļāļāļēāļ°āļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāđāļ Production
- Apply: āļĢāļąāļ
terraform applyāļŦāļĨāļąāļāļāļēāļāđāļāđāļĢāļąāļāļāļēāļĢāļāļāļļāļĄāļąāļāļīāđāļĨāđāļ§āđāļāđāļēāļāļąāđāļ
āļāļēāļĢāđāļĒāļ Plan āđāļĨāļ° Apply āļāļāļāļāļēāļāļāļąāļāļāđāļ§āļĒāđāļŦāđāļĄāļĩāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāđāļāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļĢāļīāļ āļĨāļāļāļ§āļēāļĄāđāļŠāļĩāđāļĒāļāđāļāļāļēāļĢāđāļāļīāļāļāļąāļāļŦāļē
āļŠāļĢāļļāļ
āļāļēāļĢāđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Terraform āļāđāļāļāļāļĢāļāļāļāļĨāļļāļĄāļŦāļĨāļēāļĒāļŦāļąāļ§āļāđāļāļŠāļģāļāļąāļ āļāļąāđāļāđāļāđāđāļāļ§āļāļīāļāļāļ·āđāļāļāļēāļāļāļĒāđāļēāļāļāļģāļŠāļąāđāļ Workflow āđāļĨāļ° State Management āđāļāļāļāļāļķāļāļŦāļąāļ§āļāđāļāļāļąāđāļāļŠāļđāļāļāļĒāđāļēāļ Modules āđāļĨāļ°āļāļēāļĢ Testing āļāļĢāļ°āđāļāđāļāļŠāļģāļāļąāļāļāļĩāđāļāļ§āļĢāļāļāļāļģāļĄāļĩāļāļąāļāļāļĩāđ:
- State āđāļāđāļāļŦāļąāļ§āđāļāļāļāļ Terraform: āđāļāđāļēāđāļāļ§āļīāļāļĩāļāļēāļĢāļāļąāļāļāļēāļĢ State āđāļ Production āļāđāļ§āļĒ Remote Backend āđāļĨāļ° Locking
- Module āļāđāļ§āļĒāđāļŦāđāđāļāđāļāļŠāļēāļĄāļēāļĢāļāļāļģāļāļĨāļąāļāļĄāļēāđāļāđāļāđāļģāđāļāđ: āļāļāļāđāļāļ Module āđāļŦāđāļĄāļĩāļāļļāļāļāļĢāļ°āļŠāļāļāđāđāļāļĩāļĒāļ§āđāļĨāļ°āļĄāļĩ Interface āļāļĩāđāļāļąāļāđāļāļ
- Provider āđāļĨāļ° Version Constraint: āļĢāļ°āļāļļ Version āđāļŠāļĄāļāđāļāļ·āđāļāđāļŦāđ Infrastructure āļŠāļĢāđāļēāļāļāđāļģāđāļāđ
- CI/CD Integration: āļāļēāļĢāļĢāļ§āļĄ Terraform āđāļāđāļēāļāļąāļ Pipeline āļāđāļ§āļĒāđāļŦāđāļĄāļĩāļāļēāļĢāļāļ§āļāļāļļāļĄāđāļĨāļ°āļāļĢāļ§āļāļŠāļāļāļāļĩāđāļāļĩ
āļŠāļģāļŦāļĢāļąāļāļāļđāđāļāļĩāđāļāđāļāļāļāļēāļĢāļĻāļķāļāļĐāļēāđāļāļīāđāļĄāđāļāļīāļĄāđāļāļĩāđāļĒāļ§āļāļąāļ DevOps āļŠāļēāļĄāļēāļĢāļāļāđāļēāļāļāļāļāļ§āļēāļĄ āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ DevOps āļāļĩāđāļāļ§āļĢāļĢāļđāđ āđāļĨāļ° āļāļēāļĢ Deploy āđāļāļāļāļĨāļīāđāļāļāļąāļāļāļ Kubernetes āđāļāļ·āđāļāđāļāļĢāļĩāļĒāļĄāļāļ§āļēāļĄāļāļĢāđāļāļĄāđāļŦāđāļāļĢāļāļāđāļ§āļāļĒāļīāđāļāļāļķāđāļ
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āđāļāđāļ
āđāļāļĢāđ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ

āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ DevOps āļāļĩāđāļāļģāđāļāđāļ: āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ 2026
āđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļŠāļąāļĄāļ āļēāļĐāļāđ DevOps āļāđāļ§āļĒāļāļģāļāļēāļĄāļāļĩāđāļāđāļāļāļĢāļđāđāđāļāļĩāđāļĒāļ§āļāļąāļ CI/CD, Kubernetes, Docker, Terraform āđāļĨāļ°āđāļāļ§āļāļāļīāļāļąāļāļī SRE āļāļĢāđāļāļĄāļāļģāļāļāļāļĨāļ°āđāļāļĩāļĒāļ

āļŠāļąāļĄāļ āļēāļĐāļāđ Kubernetes: āļāļāļīāļāļēāļĒ Pods, Services āđāļĨāļ° Deployments āļāļĒāđāļēāļāļĨāļ°āđāļāļĩāļĒāļ
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Kubernetes āđāļāļĩāđāļĒāļ§āļāļąāļ Pods, Services āđāļĨāļ° Deployments āļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļ YAML āļāļĨāđāļ networking āļ āļēāļĒāđāļ āđāļĨāļ°āļāļĨāļĒāļļāļāļāđ scaling āļŠāļģāļŦāļĢāļąāļāļāļĩ 2026

Docker: āļāļēāļāļāļēāļĢāļāļąāļāļāļēāļŠāļđāđāļāļēāļĢāđāļāđāļāļēāļāļāļĢāļīāļ
āļāļđāđāļĄāļ·āļ Docker āļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢ containerize āđāļāļāļāļĨāļīāđāļāļāļąāļ Dockerfile, Docker Compose, multi-stage build āđāļĨāļ°āļāļēāļĢ deploy āļŠāļđāđ production āļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāļāļĢāļīāļ