top of page

Śledź nasze wpisy w social media

  • Instagram
  • Facebook
  • Twitter
  • LinkedIn
  • YouTube
  • Zdjęcie autoraPiotr Kośka

Infrastruktura jako Kod (IaaC) - VPC, Domain, konfiguracja w terraformie naszego środowiska cześć 4

Zaktualizowano: 27 gru 2022




W kolejnej czwartej części zajmiemy się konfiguracja naszego Digital Ocean i tu skonfigurujemy nasze sieci (Networking) - czyli VPC dla adresu sieciowego 10.1.0.0/16 z podziałem na podsieci, oraz skonfigurujemy strefa DNS (Domain) dla dev.technicznie-nietechnicznie.cloud. Dodamy też trochę zmiennych tak by nasza konfiguracja była bardziej elastyczna.

Jeżeli trafiłeś tu i nie znasz poprzednich materiałów poniżej mały spis (poroponowana kolejność czytania):



Dodajmy zmienne


W terraform często będziemy wykorzystywać zmienne lub się do nich odnosić na różne sposoby. Będziemy też wykorzystywać wartości, które wygeneruje nam pewien zasób (resources) stworzony w Digital Ocean, a że nie znamy jego nazwy przed stworzeniem czy identyfikatora będziemy musieli się do niego jakoś odnieść - po przez właśnie zmienne lub "kotwice". Zadeklarujemy sobie kilka zmiennych na początek.


Tworzymy plik vars.tf - jego konstrukcja bedzie nastepująca:


variable "type_env" {
    description = "Type enviroment example: development, staging or production."
    type = string
    default = "development"
}

variable "name_env" {
    description = "Name enviroment."
    type = string
    default = "youtube"
}

variable "app_name_type" {
    description = "Application name"
    type = string
    default = "dev"
}

variable "app_name" {
    description = "Application name"
    type = string
    default = "Application"
}


Nie pierwszy raz już deklarujemy nasze zmienne więc sposób deklaracji ich w terraform nie powinien być dla nas zaskoczeniem. Spojrzymy tylko na nowe elementy:


  • type - określa jakiego typu jest to zmienna - w tym przypadku jest to string - isinieje jeszcze kilka innych typów.

  • default - określa domyślna wartość w przypadku nie podania tej zmiennej przez użytkownika terafforma (operatora).

Pierwszą zmienna z naszej listy type_env możemy wykorzystać już w poprzednio naszym utworzonym pliku project.tf - wykorzystanie bedzie bardzo proste wskazujemy jaki obiekt nas interesuje w tym przypadku var a po kropce odwołujemy się do nazwy naszej zmiennej - całość prezentuje się tak


resource "digitalocean_project" "youtube-project" {
  name = "YoutubeProject"
  description = "Project for YouTube Channel"
  purpose = "Learning"
  environment = var.type_env
}

Naszą zmienna type_env użyjemy w wartości enviroment. Dzięki temu będziemy mogli później przez nasz moduł nadpisywać te zmienne i uruchomić przykładowo takie samo środowisko produkcyjne w naszej konfiguracji. Po prostu tworząc nowy moduł a w nim tylko nadpisując zmienne. Przykład poniżej:


module "digitalocean-youtube" {
  source = "./modules/digitalocean/youtube-do"
  providers = {
    digitalocean = digitalocean.youtube-do
  }
  type_env = "production"
}

Tak uruchomiony kod w Terraform dla mojej aktualnej konfiguracji oczywiście spowodowałby zmiany ponieważ ja już mam skonfigurowany projekt w DigitalOcean z wartości development dla enviroment w resources "digitalocean_project" "youtube-project". Sprawdzenie potwierdziło, że funkcjonalność działa tak jak należy.



Konfigurujemy sieć dla naszych regionów


Regionów w digitalocean nie jest tak dużo jak w AWS czy Azure, ale liczba 14 regionów i konieczność ręcznej konfiguracji sieci w każdym z tych regionów byłaby męcząca. Wezmę sieć 10.1.0.0/16 i podzielę ja na podsieci z maską 10.1.X.X/20 (cidr). Da to mi w moim przypadku podział na 16 podsieci czyli przy 14 regionach jest to idealny podział.


W digitalocean regiony mamy następujące:


  1. North America:

    1. NYC1

    2. NYC2

    3. NYC3

    4. SFO1

    5. SFO2

    6. SFO3

    7. TOR1

  2. Europe:

    1. LON1

    2. AMS2

    3. AMS3

    4. FRA1

  3. Asia:

    1. SGP1

    2. BLR1

  4. Australia:

    1. SYD1:


Konfiguracja sieci odbywać się będzie w następujący sposób poprzez resources "digitalocean_vpc" poniżej przykład dla jednego regionu:


resource "digitalocean_vpc" "nyc3" {
    name = "terraform-${var.type_env}-${var.name_env}-northamerica-nyc3-vpc"
    region = "nyc3"
    ip_range = "10.1.32.0/20"
}

Gdzie odpowiednie pola:

  • name - to nazwa naszej sieci (vpc)

  • region - to informacja dla jakiego regiony bedzie dostepna ta konkretna sieć

  • ip_range - tu podział na moje subnety

A tak prezentuje się całościowo plik konfiguracyjny vpc.tf:


resource "digitalocean_vpc" "nyc1" {
    name = "terraform-${var.type_env}-${var.name_env}-northamerica-nyc1-vpc"
    region = "nyc1"
    ip_range = "10.1.0.0/20"
}

resource "digitalocean_vpc" "nyc2" {
    name = "terraform-${var.type_env}-${var.name_env}-northamerica-nyc2-vpc"
    region = "nyc2"
    ip_range = "10.1.16.0/20"
}

resource "digitalocean_vpc" "nyc3" {
    name = "terraform-${var.type_env}-${var.name_env}-northamerica-nyc3-vpc"
    region = "nyc3"
    ip_range = "10.1.32.0/20"
}

resource "digitalocean_vpc" "sfo1" {
    name = "terraform-${var.type_env}-${var.name_env}-northamerica-sfo1-vpc"
    region = "sfo1"
    ip_range = "10.1.48.0/20"
}

resource "digitalocean_vpc" "sfo2" {
    name = "terraform-${var.type_env}-${var.name_env}-northamerica-sfo2-vpc"
    region = "sfo2"
    ip_range = "10.1.64.0/20"
}

resource "digitalocean_vpc" "sfo3" {
    name = "terraform-${var.type_env}-${var.name_env}-northamerica-sfo3-vpc"
    region = "sfo3"
    ip_range = "10.1.80.0/20"
}

resource "digitalocean_vpc" "tor1" {
    name = "terraform-${var.type_env}-${var.name_env}-northamerica-tor1-vpc"
    region = "tor1"
    ip_range = "10.1.96.0/20"
}

resource "digitalocean_vpc" "lon1" {
    name = "terraform-${var.type_env}-${var.name_env}-europe-lon1-vpc"
    region = "lon1"
    ip_range = "10.1.112.0/20"
}

resource "digitalocean_vpc" "ams2" {
    name = "terraform-${var.type_env}-${var.name_env}-europe-ams2-vpc"
    region = "ams2"
    ip_range = "10.1.128.0/20"
}

resource "digitalocean_vpc" "ams3" {
    name = "terraform-${var.type_env}-${var.name_env}-europe-ams3-vpc"
    region = "ams3"
    ip_range = "10.1.144.0/20"
}

resource "digitalocean_vpc" "fra1" {
    name = "terraform-${var.type_env}-${var.name_env}-europe-fra1-vpc"
    region = "fra1"
    ip_range = "10.1.160.0/20"
}

resource "digitalocean_vpc" "sgp1" {
    name = "terraform-${var.type_env}-${var.name_env}-asia-sgp1-vpc"
    region = "sgp1"
    ip_range = "10.1.176.0/20"
}

resource "digitalocean_vpc" "blr1" {
    name = "terraform-${var.type_env}-${var.name_env}-asia-blr1-vpc"
    region = "blr1"
    ip_range = "10.1.192.0/20"
}

resource "digitalocean_vpc" "syd1" {
    name = "terraform-${var.type_env}-${var.name_env}-australia-syd1-vpc"
    region = "syd1"
    ip_range = "10.1.208.0/20"
}

Wartość ta terraform-${var.type_env}-${var.name_env}-europe-fra1-vpc jest niczym innym jak generowaną nazwa dla vpc na podstawie stałych elementów + uzupełniona z wcześniej zadeklarowanych zmiennych wartościami.


Możemy teraz uruchomić terraform plan i sprawdzić czy wszystko będzie dodane prawidłowo.



Komunikat o 14 dodanych zasobach jest poprawnym komunikatem. Terraform apply i możemy weryfikować po stronie DigitalOcean czy mamy wszystkie VPC stworzone.



DNS po stronie Digital Ocean - działamy z modułem OVH


Dobrze mieć naszą konfigurację tak ustawiona dla naszych maszyn wirtualnych że, będa one automatycznie otrzymywać nazwy FQDN. Tworząc zasób w digital ocean oprócz IP będę też mu przydzielał łatwiejszą do zapamiętania nazwę kanoniczna. W głowie wolę pamiętać numery telefonów a nie adresy IP :)


Muszę zatem wykierować moją subdomenę z OVH do DigitalOcean. Dlatego też stworzony wczesniej moduł OVH i obsługiwany w terraform wykorzystam do tego. Mogę szybko tą zmianę zrobić z poziomu mojego kodu. Tworzę trzy rekordy NS kierujące na moją zone w DigitalOcean.

resource "ovh_domain_zone_record" "ns1-dev-technicznie-nietechnicznie-cloud" {
    zone = "technicznie-nietechnicznie.cloud"
    target = "ns1.digitalocean.com."
    fieldtype = "NS"
    subdomain = "dev"
    ttl = "0"
}

resource "ovh_domain_zone_record" "ns2-dev-technicznie-nietechnicznie-cloud" {
    zone = "technicznie-nietechnicznie.cloud"
    target = "ns2.digitalocean.com."
    fieldtype = "NS"
    subdomain = "dev"
    ttl = "0"
}

resource "ovh_domain_zone_record" "ns3-dev-technicznie-nietechnicznie-cloud" {
    zone = "technicznie-nietechnicznie.cloud"
    target = "ns3.digitalocean.com."
    fieldtype = "NS"
    subdomain = "dev"
    ttl = "0"
}

Konfiguracja po stronie DigitalOcean będzie wyglądać następująco - tworzymy nowy plik domain.tf


data "digitalocean_project" "youtube-project" {
    name = "YoutubeProject"
}

resource "digitalocean_project_resources" "domain" {
    project = data.digitalocean_project.youtube-project.id
    resources = [
        digitalocean_domain.dev-technicznie-nietechnicznie-cloud.urn
    ]
}

resource "digitalocean_domain" "dev-technicznie-nietechnicznie-cloud" {
    name = "${var.app_name_type}.technicznie-nietechnicznie.cloud"
}

Pojawiły nam się trzy nowe obiekty oraz nowy typ w terraform, data - dostępny z naszego providera digitalocean.


  • data "digitalocean_project" "youtube-project" - to wartość, która pobierze nam kilka pól z projektu o nazwie "YoutubeProject" ale nas będzie głownie interesować ID naszego projektu. Potrzebny będzie ono nam do połączenia URN Domeny z ID projektu i w ten sposób zapięcia Domeny w DigitalOcean do naszego projektu który stworzyliśmy.

  • resource "digitalocean_project_resources" "domain" - zasób ten właśnie robi nam połączenia i w ten sposób Projekt w Digital Ocean wie że domena dev.technicznie-nietechnicznie.cloud należy do tego własnie projektu jakim jest "YoutubeProject"

  • resource "digitalocean_domain" "dev-technicznie-nietechnicznie-cloud" - to już deklaracja samej naszej Zony jeszcze bez rekordów, nie licząc trzech rekordów NS)



Już na tym etapie wiemy co robimy :) wiec po naszym terraform plan, terraform apply sprawdzamy czy mamy naszą zone w digitalocean.




Projekt pokazuje nam naszą zone - zatem wszystko mamy skonfigurowane jak należy.


W tym artykule to tyle, w kolejnym materiale uruchomimy naszą pierwsza aplikacje skonfigurowana w terraform.



115 wyświetleń0 komentarzy

Ostatnie posty

Zobacz wszystkie

Comments


Śledź nasze wpisy w social media

  • Instagram
  • Facebook
  • Twitter
  • LinkedIn
  • YouTube

Poznaj terraform jedno z najepszych narzedzi do zarządzania infrastrukturą w kodzie (IaC) - w kursie tym przeprowadzam Cię przez proces instalacji i konfiguracji tego narzędzia.

bottom of page