Aufbau einer AWS VPC mit Terraform

Zurück zur Übersicht

Mit Terraform als Infrastructure as Code (IaC) Werkzeug lassen sich IT-Infrastrukturen (wie virtuelle Server, Netzwerke, Container, Speicher, usw.) in einem Infrastruktur-Code konfigurieren. Das ermöglicht es schnell, sicher und automatisiert Änderungen in bestehenden IT-Infrastrukturen zu implementieren.

Terraform ist ein anbieterunabhängiges Werkzeug und kann IT-Infrastrukturen bei vielen etablierten Ressourcenanbieter managen, u.a. in Google Cloud, Amazon Web Service (AWS), Oracle Cloud, Azure usw.

In diesem Artikel wird anhand eines Anwendungsfalles gezeigt, wie eine virtual private Cloud (VPC) in AWS mit Terraform „per Knopfdruck“ aufgebaut wird. Die VPC besteht in diesem Beispiel aus einem privatem und einem öffentlichen Subnetz. Die Instanzen im öffentlichen Subnetz können ausgehenden Verkehr direkt über ein Internet Gateway ins Internet senden, während die Instanzen im privaten Subnetz an einem “Network Address Translation” (NAT) Gateway angeschlossen werden müssen, um außerhalb der VPC erreichbar zu sein. Es werden Routing-Tabellen definiert, die den Netzwerkverkehr leiten und koordinieren.

Voraussetzungen

  • AWS Konto
  • Access und secret key von Identity and Access Management -Benutzer (IAM) in AWS
  • Terrafort (hier wird v1.1.6 auf windows_amd64 verwendet)
  • Code-Editor

Erstellung von Terraform Konfigurationsdateien

Zunächst wird ein Verzeichnis „terraform-vpc“, in dem die Konfigurationsdatei terraform.exe und alle Skripte für dieses Projekt gespeichert werden, angelegt. In diesem Verzeichnis dürfen sich keine anderen Dateien befinden, die nicht projektrelevant sind.

mkdir terraform-vpc

cd ./terraform-vpc

In provider.tf wird der Provider „AWS“ angegeben. Dies ermöglicht es, auf Amazon Ressourcen zuzugreifen. Diese Datei beinhaltet noch die Region, in der der Virtual Private Server (VPS) erstellt werden soll, sowie den access bzw. secret key.

provider "aws" {
 	region = "eu-central-1"
 	access_key = "AKIAYXXXXXFCIHHPFU"
 	secret_key = "ZklG6coEXuOBKXXXXXXXXdLTgqOUtdWQLsFaZQT"
}

Danach werden die folgenden Codezeilen in vpc.tf hinzugefügt und in terraform-vpc abgespeichert.

# Erstellen von VPC
resource "aws_vpc" "test" {
 	cidr_block           = "10.10.0.0/16"
 	instance_tenancy     = "default"
 	enable_dns_support   = "true"
 	enable_dns_hostnames = "true"
 	enable_classiclink   = "false"
  tags = {
 	Name = "test"
  }
}

# Erstellen von öffentlichen Subnetz
 resource "aws_subnet" "test-public" {
 	vpc_id                  = aws_vpc.test.id
 	cidr_block              = "10.10.1.0/24"
 	map_public_ip_on_launch = "true"
 	availability_zone       = "eu-central-1a"
  tags = {
 	Name = "test-public"
  }
}

# Erstellen von privaten Subnetz
resource "aws_subnet" "test-privat" {
 	vpc_id                  = aws_vpc.test.id
 	cidr_block              = "10.10.2.0/24"
 	map_public_ip_on_launch = "false"
 	availability_zone       = "eu-central-1a"
  tags = {
 	Name = "test-privat"
  }
}

# Erstellen von Internet Gateway
resource "aws_internet_gateway" "test-gw" {
 	vpc_id = aws_vpc.test.id
  tags = {
 	Name = "test"
  }
}

# Erstellen von öffentlicher Routentabelle
resource "aws_route_table" "test-public" {
 	vpc_id = aws_vpc.test.id
  route {
 	cidr_block = "0.0.0.0/0"
 	gateway_id = aws_internet_gateway.test-gw.id
  }
  tags = {
 	Name = "test-public"
  }
}

# Assoziation Routentabelle mit öffentlichem Subnetz
resource "aws_route_table_association" "test-public" {
 	subnet_id      = aws_subnet.test-public.id
 	route_table_id = aws_route_table.test-public.id
} 

# Erstellen von Nat Gateway
resource "aws_eip" "nat" {
 	vpc = true
}
resource "aws_nat_gateway" "nat" {
 	allocation_id = aws_eip.nat.id
 	subnet_id     = aws_subnet.test-public.id
 	depends_on    = [aws_internet_gateway.test-gw]
}

# Erstellen von privaten Routentabelle
resource "aws_route_table" "test-privat" {
 	vpc_id = aws_vpc.test.id
  route {
 	cidr_block     = "0.0.0.0/0"
 	nat_gateway_id = aws_nat_gateway.nat.id
  }
  tags = {
 	Name = "test-privat"
  }
}

# Assoziation Routentabelle mit privatem Subnetz
resource "aws_route_table_association" "test-privat" {
 	subnet_id      = aws_subnet.test-privat.id
 	route_table_id = aws_route_table.test-privat.id
}

Ausführen von Terraform zur Erstellung der AWS VPC

Nachdem die Terraform Konfigurationsdatei angelegt ist, wird Terraform in drei Schritten gestartet, um die VPC-test zu erstellen.

Schritt 1: terraform init

Im Ordner terraform-vpc wird der erste Befehl terraform init ausgeführt. Dadurch wird das Arbeitsverzeichnis initialisiert und alle erforderlichen Plugins heruntergeladen:
PS C:\terraform-vpc> terraform init
Initializing the backend…
Initializing provider plugins…

Terraform has been successfully initialized!

Schritt 2: terraform plan

Zeigt, wie die VPC-test gebaut werden soll. Hier gibt es die Möglichkeit, die Konfigurationsdateien ggf. entsprechend anzupassen.

Schritt 3: terraform apply

Dies ist der letzte Schritt, um die gewünschte Konfiguration der VPC in AWS zu deployen. Nach dem Ausführen des Befehls wird nochmal nach eine Bestätigung gefragt und das Deployment gestartet. In wenigen Sekunden ist in AWS die neue VPC test fertiggestellt.

Sie haben Fragen? Wir haben die Antworten!

Schreiben Sie uns. Wir freuen uns auf Ihre Nachricht!