Terraform - configurare VPC

Postat la Sun 22 May 2022 in howto

Terraform este o aplicatie ce permite crearea si configurarea infrastructurii ce ruleaza de obicei in cloud ca si cod (IaC) intr-un mod foarte rapid.

Terraform se integreaza cu cei mai mari si cunoscuti furnizori de cloud (AWS, GCE, Azure) cat si cu Kubernetes. Lista completa cu integrarile o gasiti aici .

Instalarea aplicatiei este foarte simpla existand repo pentru distributia favorita cat si pentru Windows.

Mai jos voi explica cum creem o retea privata (VPC) in AWS. Pentru acest lucru aveti nevoie de un cont in AWS cu drept full ptr EC2 cu credential de access.

Aceste credentiale de access presupunem ca sunt stocate in profilul default (vezi configurarea aws cli ).

Avem un folder care sa includa proiectul nostru si creem un fiser main.tf in care definim datele de conectare la AWS si regiunea in care se va configura:

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

provider "aws" {
    profile = "default"
    region = "eu-central-1"
}

Initializam configuratia cu comanda:

terraform init

care va instala librariile necesare.

In aceasta regiune - eu-central-1 - creeam un VPC numit ter-vpc cu clasa de ip-uri 10.20.0.0/16:

resource "aws_vpc" "ter-vpc" {
    cidr_block  = "10.20.0.0/16"
    tags = {
        "Name" = "ter-vpc"
    }
}

Nota: parametrii suplimentari gasiti in documentatia vpc

Configuratia descrisa o putem testa inainte de aplicare cu comanda:

terraform plan

si daca modificarile sunt conforme se pot aplica cu comanda

terraform apply

La acest VPC este necesar un internet gateway pentru ca viitoarele resurse sa poata fi accesibile din exterior

resource "aws_internet_gateway" "ter-gw" {
    vpc_id                  = aws_vpc.ter-vpc.id
    tags = {
        "Name" = "ter-gw"
    }
}

Nota: parametrii suplimentari gasiti in documentatia aws_internet_gateway .

In VPC vom crea 2 subretele in DC diferite (availability zone):

resource "aws_subnet" "ter-1a" {
    vpc_id                    = aws_vpc.ter-vpc.id
    cidr_block                = "10.20.1.0/24"
    availability_zone         = "eu-central-1a"
    map_public_ip_on_launch   = true

    tags = {
        Name = "ter-1a"
    }
}

resource "aws_subnet" "ter-1b" {
    vpc_id                    = aws_vpc.ter-vpc.id
    cidr_block                = "10.20.2.0/24"
    availability_zone         = "eu-central-1b"
    map_public_ip_on_launch   = true

    tags = {
        Name = "ter-1b"
    }
}

Nota: parametrii suplimentari gasiti in documentatia aws subnet .