Skip to main content
How to Use Terraform with GitHub Actions - CICD Pipeline Guide

How to Use Terraform with GitHub Actions - CICD Pipeline Guide

Key Takeaway

Set up Terraform CI-CD with GitHub Actions. Covers plan on PR, apply on merge, state locking, secrets management, and environment protection.

Table of Contents

Introduction

This comprehensive guide covers everything you need to know with practical, copy-paste examples for your Terraform projects.

Prerequisites

  • Terraform v1.5+ installed
  • Cloud provider credentials configured
  • Basic HCL knowledge

Step-by-Step Guide

Core Concepts

Understanding this topic is essential for writing production-ready Terraform code that scales across teams and environments.

Configuration Example

terraform {
  required_version = ">= 1.5"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = var.region
}

Implementation

variable "environment" {
  type        = string
  description = "Deployment environment"
  default     = "dev"

  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "Must be dev, staging, or prod."
  }
}

locals {
  name_prefix = "myapp-${var.environment}"
  common_tags = {
    Environment = var.environment
    ManagedBy   = "terraform"
    Project     = var.project_name
  }
}

resource "aws_instance" "app" {
  ami           = data.aws_ami.latest.id
  instance_type = local.is_prod ? "t3.large" : "t3.micro"
  tags          = merge(local.common_tags, { Name = "${local.name_prefix}-app" })
}

Advanced Usage

resource "aws_security_group" "app" {
  name = "${local.name_prefix}-sg"

  dynamic "ingress" {
    for_each = var.ingress_rules
    content {
      from_port   = ingress.value.port
      to_port     = ingress.value.port
      protocol    = "tcp"
      cidr_blocks = ingress.value.cidrs
    }
  }
}

Best Practices

  1. Use version constraints for providers and modules
  2. Separate environments with workspaces or directories
  3. Enable remote state with locking for teams
  4. Always run plan before applying changes
  5. Use modules for reusable patterns
  6. Tag everything for cost tracking

Hands-On Courses

Conclusion

Apply these patterns in your next project for cleaner, more maintainable infrastructure code.

🚀

Level Up Your Terraform Skills

Hands-on courses, books, and resources from Luca Berton

Luca Berton
Written by

Luca Berton

DevOps Engineer, AWS Partner, Terraform expert, and author. Creator of Ansible Pilot, Terraform Pilot, and CopyPasteLearn.