Terraform

Infrastructure as Code - Cloud-Ressourcen deklarativ auf AWS, Azure, GCP mit Zustandsverwaltung bereitstellen

TL;DR

Was: Ein Infrastructure-as-Code-Tool zum Bereitstellen von Cloud-Ressourcen.

Warum: Deklarative Syntax, Multi-Cloud, Zustandsverwaltung, reproduzierbare Infrastruktur.

Quick Start

Installieren:

brew install terraform  # macOS
# or download from terraform.io

Create main.tf:

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

provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "example-instance"
  }
}

Ausführen:

terraform init
terraform plan
terraform apply

Cheatsheet

BefehlBeschreibung
terraform initArbeitsverzeichnis initialisieren
terraform planÄnderungen vorschauen
terraform applyÄnderungen anwenden
terraform destroyInfrastruktur zerstören
terraform fmtCode formatieren
terraform validateKonfiguration validieren
terraform outputOutputs anzeigen
terraform state listRessourcen im State auflisten

Gotchas

Variables

# variables.tf
variable "instance_type" {
  description = "EC2 instance type"
  type        = string
  default     = "t2.micro"
}

# main.tf
resource "aws_instance" "example" {
  instance_type = var.instance_type
}

# terraform.tfvars
instance_type = "t3.small"

Outputs

output "instance_ip" {
  value       = aws_instance.example.public_ip
  description = "Public IP of the instance"
}

Data sources

data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }
  owners = ["099720109477"]
}

resource "aws_instance" "example" {
  ami = data.aws_ami.ubuntu.id
}

Modules

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.0.0"

  name = "my-vpc"
  cidr = "10.0.0.0/16"
}

Next Steps