Maak een Virtual Private Cloud (VPC) op AWS met Terraform

In dit artikel laat ik je zien hoe je een VPC maakt, samen met Subnets, Internet Gateway, NAT Gateways, en Route Tables. We zullen 1 VPC maken met 4 Subnets: 2 Private en 2 Public, 2 NAT Gateways, 1 Internet Gateway, en 4 Route Tables.

Alvorens verder te gaan, neem ik aan dat je een basiskennis hebt van Terraform en VPC op AWS. Om de VPC en het maken ervan vanuit de AWS console te leren, kun jehier klikken en om de basis van Terraform te leren kun je zoeken naar “Wat is Terraform en hoe installeer je het op de AWS EC2 Instance?”.

Vereisten

  1. Basiskennis van Terraform.
  2. Terraform geïnstalleerd op je systeem.
  3. AWS Account(aanmaken als je er geen hebt).
  4. ‘access_key’ & ‘secret_key’ van een AWS IAM Gebruiker. (Klik hier om te leren hoe je een IAM gebruiker met ‘access_key’ & ‘secret_key’ op AWS kunt aanmaken, )

Wat we zullen doen

  1. Schrijf Terraform configuratiebestanden voor het maken van een VPC met andere afhankelijke bronnen.
  2. Maak een VPC en andere afhankelijke bronnen met behulp van de Terraform configuratiebestanden
  3. Verwijder de gemaakte VPC en andere afhankelijke bronnen met behulp van Terraform

Schrijf Terraform configuratiebestanden voor het maken van een VPC met andere afhankelijke bronnen.

Maak een speciale directory waarin je terraform configuratiebestanden kunt maken.

Gebruik het volgende commando om een directory aan te maken en je huidige werkdirectory er naar te veranderen.

mkdir terraform
cd terraform/

Ik gebruik “vim” als editor om bestanden in te schrijven. Je kunt een editor naar keuze gebruiken en de volgende configuraties kopiëren-plakken om variabelen.tf, terraform.tfvars, en main.tf te maken

Maak ‘main.tf’, dat verantwoordelijk is voor het aanmaken van VPC op naar AWS met de afhankelijke middelen. Deze main.tf zal waarden van variabelen lezen uit variables.tf en terraform.tfvars.

vim main.tf
provider "aws" {
      region     = "${var.region}"
      access_key = "${var.access_key}"
      secret_key = "${var.secret_key}"
}


# VPC resources: This will create 1 VPC with 4 Subnets, 1 Internet Gateway, 4 Route Tables. 

resource "aws_vpc" "default" {
  cidr_block           = var.cidr_block
  enable_dns_support   = true
  enable_dns_hostnames = true
}

resource "aws_internet_gateway" "default" {
  vpc_id = aws_vpc.default.id
}

resource "aws_route_table" "private" {
  count = length(var.private_subnet_cidr_blocks)

  vpc_id = aws_vpc.default.id
}

resource "aws_route" "private" {
  count = length(var.private_subnet_cidr_blocks)

  route_table_id         = aws_route_table.private[count.index].id
  destination_cidr_block = "0.0.0.0/0"
  nat_gateway_id         = aws_nat_gateway.default[count.index].id
}

resource "aws_route_table" "public" {
  vpc_id = aws_vpc.default.id
}

resource "aws_route" "public" {
  route_table_id         = aws_route_table.public.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.default.id
}

resource "aws_subnet" "private" {
  count = length(var.private_subnet_cidr_blocks)

  vpc_id            = aws_vpc.default.id
  cidr_block        = var.private_subnet_cidr_blocks[count.index]
  availability_zone = var.availability_zones[count.index]
}

resource "aws_subnet" "public" {
  count = length(var.public_subnet_cidr_blocks)

  vpc_id                  = aws_vpc.default.id
  cidr_block              = var.public_subnet_cidr_blocks[count.index]
  availability_zone       = var.availability_zones[count.index]
  map_public_ip_on_launch = true
}

resource "aws_route_table_association" "private" {
  count = length(var.private_subnet_cidr_blocks)

  subnet_id      = aws_subnet.private[count.index].id
  route_table_id = aws_route_table.private[count.index].id
}

resource "aws_route_table_association" "public" {
  count = length(var.public_subnet_cidr_blocks)

  subnet_id      = aws_subnet.public[count.index].id
  route_table_id = aws_route_table.public.id
}


# NAT resources: This will create 2 NAT gateways in 2 Public Subnets for 2 different Private Subnets.

resource "aws_eip" "nat" {
  count = length(var.public_subnet_cidr_blocks)

  vpc = true
}

resource "aws_nat_gateway" "default" {
  depends_on = ["aws_internet_gateway.default"]

  count = length(var.public_subnet_cidr_blocks)

  allocation_id = aws_eip.nat[count.index].id
  subnet_id     = aws_subnet.public[count.index].id
}
 

Maak ‘variables.tf’ dat de declaratie en definitie van de variabelen bevat.

vim variables.tf
variable "access_key" {
     description = "Access key to AWS console"
     
}
variable "secret_key" {
     description = "Secret key to AWS console"
     
}

variable "region" {
  default     = "eu-west-3"
  type        = string
  description = "Region of the VPC"
}


variable "cidr_block" {
  default     = "10.0.0.0/16"
  type        = string
  description = "CIDR block for the VPC"
}

variable "public_subnet_cidr_blocks" {
  default     = ["10.0.0.0/24", "10.0.2.0/24"]
  type        = list
  description = "List of public subnet CIDR blocks"
}

variable "private_subnet_cidr_blocks" {
  default     = ["10.0.1.0/24", "10.0.3.0/24"]
  type        = list
  description = "List of private subnet CIDR blocks"
}

variable "availability_zones" {
  default     = ["eu-west-3a", "eu-west-3b"]
  type        = list
  description = "List of availability zones"
}
 

Maak ’terraform.tfvars’ dat de definitie bevat van de in het bovenstaande bestand gedefinieerde variabelen access_key en secret_key. We hebben de declaratie van deze twee variabelen in het bestand ’terraform.tfvars’ bewaard.

De volgende sleutels moet je veranderen met de sleutels van je IAM gebruiker.

vim terraform.tfvars
access_key = "AKIAQ6GAIA5XIHHM2GJM"
secret_key = "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"

Nu zou je 3 bestanden moeten hebben, nl. variables.tf, terraform.tfvars, en main.tf

Maak een VPC en andere afhankelijke middelen met de Terraform configuratiebestanden

Voor je de volgende commando’s uitvoert, moet je zeker zijn dat je de geldige access_key en secret_key hebt ingesteld.

Het eerste commando dat je moet gebruiken is ’terraform init’. Dit commando downloadt en installeert plugins voor providers die binnen de configuratie gebruikt worden. In ons geval is dat AWS.

terraform init

Het tweede commando dat gebruikt moet worden is ’terraform plan’. Dit commando wordt gebruikt om de veranderingen te zien die op de infrastructuur zullen plaatsvinden.

terraform plan

Het ’terraform apply’ commando zal de bronnen aanmaken op de AWS die in het main.tf bestand genoemd worden. Je wordt gevraagd je invoer te geven om de middelen aan te maken.

terraform apply

Als je het bovenstaande commando uitvoert, zie je in de uitvoer dat er 20 nieuwe resources zijn toegevoegd en dat er 0 zijn vernietigd.

Je kunt naar de AWS VPC console gaan om te controleren of de VPC is aangemaakt samen met Subnets, Route Tables NAT Gateways, en een Internet Gateway.

Verwijder de aangemaakte VPC en andere afhankelijke middelen met Terraform

Als je de middelen die je aanmaakte met de configuratie vermeld in het bestand main.tf niet meer nodig hebt, kun je het “terraform destroy” commando gebruiken om al die middelen te verwijderen.

terraform destroy

Als je het bovenstaande commando uitvoert, zie je in de uitvoer dat 20 gecreëerde resources vernietigd worden. Je kunt hetzelfde verifiëren door naar AWS te gaan in het VPC Dashboard.

Conclusie

In dit artikel zagen we de stappen om een VPC te maken met 4 Subnets, 4 Route Tables, 2 NAT Gateways, en 1 Internet Gateway. We zagen ook hoe de gecreëerde middelen vernietigd kunnen worden.