Infrastructure as Code: Terraform with Go
Introduction
Terraform enables defining infrastructure as code. This guide covers provisioning cloud resources, managing state, and best practices for IaC.
Core Concepts
Terraform Basics
- Resources: Cloud infrastructure components
- Variables: Input parameters
- Outputs: Return values
- State: Current infrastructure state
- Modules: Reusable configurations
Good: Terraform Configuration
Basic Configuration
# โ
GOOD: Terraform configuration
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.aws_region
}
# โ
GOOD: Variables
variable "aws_region" {
description = "AWS region"
type = string
default = "us-east-1"
}
variable "app_name" {
description = "Application name"
type = string
}
variable "environment" {
description = "Environment"
type = string
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "Environment must be dev, staging, or prod."
}
}
# โ
GOOD: Resources
resource "aws_instance" "app" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
tags = {
Name = var.app_name
Environment = var.environment
}
}
# โ
GOOD: Data sources
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"]
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
}
# โ
GOOD: Outputs
output "instance_ip" {
description = "Instance IP address"
value = aws_instance.app.public_ip
}
Modules
# โ
GOOD: Module usage
module "vpc" {
source = "./modules/vpc"
cidr_block = "10.0.0.0/16"
environment = var.environment
}
module "app" {
source = "./modules/app"
vpc_id = module.vpc.vpc_id
app_name = var.app_name
}
Good: Terraform Commands
Common Commands
# โ
GOOD: Initialize Terraform
terraform init
# โ
GOOD: Validate configuration
terraform validate
# โ
GOOD: Format configuration
terraform fmt -recursive
# โ
GOOD: Plan changes
terraform plan -out=tfplan
# โ
GOOD: Apply changes
terraform apply tfplan
# โ
GOOD: Destroy resources
terraform destroy
# โ
GOOD: Show state
terraform show
# โ
GOOD: List resources
terraform state list
Advanced Patterns
Remote State
# โ
GOOD: Remote state configuration
terraform {
backend "s3" {
bucket = "terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-locks"
}
}
Workspaces
# โ
GOOD: Workspace management
terraform workspace new prod
terraform workspace select prod
terraform apply
Best Practices
1. Use Variables
# โ
GOOD: Use variables
variable "instance_type" {
type = string
}
resource "aws_instance" "app" {
instance_type = var.instance_type
}
# โ BAD: Hardcoded values
resource "aws_instance" "app" {
instance_type = "t3.micro"
}
2. Use Modules
# โ
GOOD: Modular structure
module "vpc" { ... }
module "app" { ... }
# โ BAD: Monolithic configuration
resource "aws_vpc" { ... }
resource "aws_instance" { ... }
3. Use Remote State
# โ
GOOD: Remote state
backend "s3" { ... }
# โ BAD: Local state
# State stored locally
Resources
- Terraform Documentation: https://www.terraform.io/docs/
- AWS Provider: https://registry.terraform.io/providers/hashicorp/aws/latest/docs
- Terraform Best Practices: https://www.terraform.io/docs/cloud/guides/recommended-practices
Summary
Terraform enables managing infrastructure as code. Use modules for reusability, remote state for collaboration, and variables for flexibility. Proper IaC practices ensure reproducible, maintainable infrastructure.
Comments