Learn Terraform by Building Real Infrastructure!
(Course refresh currently underway! Recorded using Terraform 1.7.x and 1.9.x+ )
This course will teach you what you need to know to deploy Terraform resources properly and efficiently whether you're a beginner or someone looking for some new tricks! We will start with the very basics and methodically build from there, learning new information, tricks, and skills along the way! Most lessons are less than 8 minutes long to help ensure a pace that doesn't put you to sleep!
With a focus on using built-in tools to deploy and troubleshoot your deployments, you'll be the only one not having to Google every error you find or copy and paste from Stack Overflow!
In the brand new refreshed sections, you'll build out a Developer Platform that deploys GitHub repositories dynamically for developers . You'll do this using the latest and greatest Terraform skills and functions.
In the legacy sections, you'll learn important Terraform tools to troubleshoot and build your infrastructure as you roll out a Node-RED IoT application using Docker, a Rancher K3s Kubernetes deployment on AWS, a Kubernetes deployment of pods, and even a full CICD deployment using Terraform Cloud!
We'll focus on writing efficient code with minimal repetition while utilizing many of Terraform's advanced features such as:
- Import
- Join
- Min
- Max
- Local Resource
- Variables
- Splat
- For Loops
- Dynamic Blocks
- Variable Validation
- Path References
- String Interpolation
- Workspaces
- Local and Remote Provisioners
- and more!
The entire course was recorded using quality equipment for ease of listening, intelligent zooming and cursor highlighting to ensure maximum readability and the ability to follow along easily, and annotations where necessary to quickly see web links to visit, important topics, and follow along with the resources more easily.
All of the code is tested using the 1x+ version of Terraform and new updates will always be tested and rolled out as soon as possible!
So what are you waiting for? Sign up today and Terraform Apply Yourself!
Example Curriculum
- Providers (5:41)
- Terraform Init (4:23)
- Provider Versioning and Dependency Locks (6:02)
- Backends (3:49)
- Quiz #1
- Our First Resource (5:37)
- Terraform Plan, Apply, and Destroy (7:55)
- Resource Addresses (7:49)
- The State File (5:53)
- Terraform State Commands (4:45)
- Resources: Terraform Apply Yourself! (2:24)
- Quiz #2
- The Random Provider (5:15)
- Terraform Console and Interpolation (7:12)
- Count (6:37)
- Count: Terraform Apply Yourself! (2:01)
- Splat and Outputs (8:19)
- Terraform Types (7:33)
- For Expressions (7:16)
- Variables (6:57)
- Variable Precedence (9:35)
- Variable Validation (7:29)
- The Contains Function (3:57)
- Conditionals (6:02)
- Quiz #3
- Terraform rm and refresh-only (9:59)
- for_each (8:55)
- for_each Terraform Apply Yourself! (2:37)
- The Length Function (4:58)
- The local-exec Provisioner (8:42)
- local-exec Terraform Apply Yourself! (5:03)
- The depends_on Meta-Argument (7:13)
- for_each with Maps (8:34)
- Quiz #4
- Our Deployment in Action! (9:29)
- ignore_changes LIfecycle Meta-Argument (3:49)
- Data Sources (5:02)
- Heredocs and Escape Sequences (5:19)
- The Templatefile Function (5:50)
- Refactoring our Code and Moved Blocks (5:14)
- About GitHub Pages and Accounts
- Nested Blocks (8:46)
- dynamic_blocks (6:04)
- The try() Function (3:10)
- Quiz #5
- Welcome! Course Introduction (2:29)
- Terraform Version Notes
- Downloading the Code
- AWS Setup and Cloud9 Info
- New AWS Account Setup (5:24)
- Configure Billing Alarms (3:12)
- Securing Your AWS Account (5:32)
- AWS Cloud9 Configuration (4:05)
- AWS Cloud9 Disk Expanding (3:44)
- Security Groups and IP Access (2:22)
- Terraform Installation (3:05)
- Terraform Terminology (8:06)
- The Docker Provider (4:45)
- Terraform Init Deeper Dive (3:25)
- Terraform Dependency Lock (6:40)
- Terraform Apply! (6:19)
- Terraform Plan and Apply Deeper Dive (5:33)
- Referencing other Resources (6:30)
- Viewing Your Deployment in the Browser (3:13)
- Terraform State Deeper Dive (7:24)
- Terraform Console and Outputs (7:49)
- The Join Function (6:37)
- The Random Resource (9:16)
- Multiple Resources and Count (7:28)
- The Splat Expression (5:04)
- "For" Loops (10:20)
- Tainting and Updating Resources (5:32)
- State Locking and Breaking State (5:39)
- Terraform Import (9:59)
- Terraform Refresh and State rm (8:15)
- Adding Variables (7:29)
- Variable Validation (v0.13+) (4:48)
- Variables and Outputs (2:48)
- Sensitive Variables and .tfvars Files (3:09)
- Variable Definition Precedence (5:09)
- Hiding Sensitive Values from the CLI (v0.14+) (4:53)
- The Bind Mount and Local Exec (11:04)
- Utilizing Local Values (7:46)
- Min and Max Functions and the Expand Expression (5:23)
- Path References and Interpolation (3:58)
- Maps and Lookups: the Image Variable (7:24)
- Maps and Lookups: External Ports (7:10)
- Terraform Workspaces (5:49)
- Referencing your Workspaces (4:59)
- Utilizing Map Keys Instead of Lookups (3:40)
- Introduction to Modules (2:28)
- First Module! (8:54)
- Module Variables (4:45)
- Terraform Graph (7:57)
- Troubleshooting Dependencies (9:14)
- The Container Module (11:16)
- Module Outputs (6:17)
- Module Information Flow (6:00)
- The Docker Volume (9:16)
- Lifecycle Customization and Targeting (5:05)
- One Module for Multiple Resources (7:02)
- Using for_each (7:39)
- Deploying Containers with for_each (9:44)
- Using for_each and Count Together (9:15)
- New Outputs and Map Transformations (5:08)
- Grafana Apply Yourself! (1:19)
- Grafana Solution (2:44)
- Self Referencing and Provisioner Failure Modes (7:17)
- Terraform Apply Yourself! Self Referencing (4:20)
- Dynamic Blocks (11:05)
- Nesting the Volume Module (12:16)
- Weather Dashboard Project! (12:35)
- What We're Going to Build (3:19)
- Configuring Terraform Cloud (5:56)
- The AWS Provider (3:56)
- Deploy a VPC (10:29)
- Remote State in Terraform Cloud (3:17)
- VPC Subnets "Hardcoded" (8:55)
- VPC Subnets - Terraform Apply Yourself! (4:01)
- The cidrsubnet() Function (8:54)
- The aws_availability_zones Data Source (3:56)
- The random_shuffle Resource (4:54)
- Why Didn't We Use for_each?
- Route Tables and the Internet Gateway (10:11)
- The create_before_destroy Lifcycle Meta Argument (4:51)
- VPC Security Groups "Hardcoded" (8:50)
- VPC Security Groups Dynamic (7:04)
- VPC Security Groups - Terraform Apply Yourself! (4:18)
- VPC RDS Subnet Group and Conditional (6:56)
- Basic RDS Setup (7:11)
- VPC Outputs for RDS - Terraform Apply Yourself! (5:38)
- Managing Sensitive RDS Values (5:37)
- The Terraform Providers Schema Command (3:53)
- ALB Initial Setup (5:41)
- ALB Security Group and Subnets - Terraform Apply Yourself! (3:42)
- ALB Target Group and the uuid() and substr() Functions (8:25)
- ALB Listeners (5:58)
- Upgrading Terraform
- ALB Lifecycle Policies: ignore_changes and create_before_destroy (8:43)
- The aws_ami Data Source (5:49)
- Scaffolding our EC2 Instance and random_id (7:04)
- EC2 - Terraform Apply Yourself! (3:30)
- SSH Key for Our Instance and the file() Function (6:27)
- Controlling random_id Changes with Keepers (4:09)
- Userdata UPDATE!
- EC2 User Data and Template Files (6:49)
- EC2 User Data Template Variables - Terraform Apply Yourself! (7:25)
- Deploying NGINX to Our Kubernetes Cluster (6:53)
- Adding our Ec2 Instances to the Target Group (7:45)
- Adding some Outputs for Our Resources (3:32)
- Sensitive Outputs and How to Access Them (5:50)
- Outputs - Terraform Apply Yourself! (4:23)
- Utilizing the local-exec Provisioner to SCP our Config File (11:50)
- Utilizing the remote-exec Provisioner to Run Commands on EC2 Instances (5:35)
- Cleanup and Create a Destroy Provisioner - Terraform Apply Yourself! (6:40)
- Deploying K8s Resources from Our Cloud9 Instance (3:12)
- What We're Going to Build (3:49)
- Update! New Terraform Cloud UI (1:02)
- Setting up Our Github (5:15)
- Configure Terraform cloud (4:54)
- Our First Cloud Deployment! (9:22)
- Configuring Repository-Based Modules (6:36)
- Utilizing the Configuration Designer to Create a Deployment (4:46)
- Setting up Providers for Our New Deployment (5:41)
- Configuring Our Github Resources in Terraform (5:58)
- Configuring Our Terraform Cloud Resources in Terraform (8:06)
- Deploying Our Module-Based Infrastructure! (5:47)
- Pushing and Pulling Remote State (5:44)
- Updating Our Deployment and Destroying it! (6:21)