Tworzenie sieci AWS przy pomocy Terraform

Potrzebujesz czasami na szybko postawić sieć AWS do testów, ale klikanie zajmuje sporo czasu? Na ratunek przychodzi nam Terraform oraz moduł do niego terraform-aws-vpc, dzięki któremu w prosty sposób postawimy sieć i ją usuniemy w chwilę. Zakładam, że masz zainstalowany Terraform, oraz skonfigurowane AWS CLI, jeżeli nie, to odsyłam do poniższych tutoriali:

Wracając do tematu, tworzymy sobie plik providers.tf, w którym dodamy konfigurację providera AWS:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "4.6.0"
    }
  }
}

provider "aws" {
}

Następnie tworzymy plik main.tf, w którym dodamy kod odpowiedzialny za utworzenie sieci w AWS

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

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

  azs             = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]

  enable_nat_gateway = true

  tags = {
    Environment = "develop"
  }
}

Pokrótce objaśnię, co dana linia oznacza:
1. source – oznacza źródło naszego modułu
2. name – nazwa naszej sieci
3. cidr – oznacza blok IP, jaki chcemy przypisać do VPC
4. azs – oznacza Availability Zone, w których chcemy mieć dodany VPC
5. private_subnets – oznacza prywatne subnety, które możemy wykorzystać np. do uruchomienia tam bazy AWS RDS, która ma być dostępna tylko z poziomu VPC
6. public_subnets – oznacza publiczne subnety, które możemy wykorzystać np. do postawienia bastion host, a z niego do połączenia z instancją EC2 w prywatnym subnecie
7. enable_nat_gateway – jeżeli zostawimy parametr na true, to dla każdego prywatnegu subnetu zostanie utworzony osobny NAT Gatewaym, dzięki któremu będziemy mogli się łączyć z internetem, ale nikt z zewnątrz nie będzie mógł się połączyć z nim.

NAT Gateway

W kwestii NAT Gateway, mamy do wyboru różne opcja tzn. możemy tworzyć jeden NAT Gateway dla każdego subnetu, Availability Zone oraz jeden wspólny NAT z którego będą korzystać wszystkie subnety. Konfiguracja zależy od wybranego wariantu:

Jeden NAT Gateway na każdy subnet
enable_nat_gateway = true
single_nat_gateway = false
one_nat_gateway_per_az = false
Jeden NAT Gateway wspólny dla wszystkich subnetów
enable_nat_gateway = true
single_nat_gateway = true
one_nat_gateway_per_az = false

Jeden NAT Gateway dla każdego AZ
enable_nat_gateway = true
single_nat_gateway = false
one_nat_gateway_per_az = true

Na koniec zostało nam wykonać dwa polecenia, pierwsze utworzy nam projekt, oraz pobierze potrzebne moduły, natomias drugie, zbuduje nam infrastrukturę na AWS

terraform init

oraz

terraform apply

Dzięki takiemu szablonowi, możemy w bardzo krótkim czasie postawić sobie sieć na potrzeby np testów, dodatkowo kiedy już jej nie potrzebujemy, równie szybko możemy usunąć zasoby z AWS poprzez wykonanie polecenia

terraform destroy

Oczywiście, to tylko część możliwości jakie daje nam ten moduł, ponieważ można w nim zrobić praktycznie wszystko z sieciami, mogę tylko Was odesłać do oficjalnego githuba modułu, gdzie wszystko jest bardzo szczegółowo opisane https://github.com/terraform-aws-modules/terraform-aws-vpc