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):
Wstępniak teoretyczny: Terreform - początki (czysto teoretyczne)
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"
}
![](https://static.wixstatic.com/media/b21a85_b0629003477341699e16748f726ea20e~mv2.png/v1/fill/w_980,h_658,al_c,q_90,usm_0.66_1.00_0.01,enc_auto/b21a85_b0629003477341699e16748f726ea20e~mv2.png)
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
}
![](https://static.wixstatic.com/media/b21a85_f32ed81ef08140c79b6a0ff8436fe01e~mv2.png/v1/fill/w_767,h_201,al_c,q_85,enc_auto/b21a85_f32ed81ef08140c79b6a0ff8436fe01e~mv2.png)
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.
![](https://static.wixstatic.com/media/b21a85_429840b7517044baa59aaa54e06cb56a~mv2.png/v1/fill/w_980,h_414,al_c,q_90,usm_0.66_1.00_0.01,enc_auto/b21a85_429840b7517044baa59aaa54e06cb56a~mv2.png)
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:
North America:
NYC1
NYC2
NYC3
SFO1
SFO2
SFO3
TOR1
Europe:
LON1
AMS2
AMS3
FRA1
Asia:
SGP1
BLR1
Australia:
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.
![](https://static.wixstatic.com/media/b21a85_a94afba994e74df6b6ad8f458fd4655b~mv2.png/v1/fill/w_838,h_422,al_c,q_85,enc_auto/b21a85_a94afba994e74df6b6ad8f458fd4655b~mv2.png)
Komunikat o 14 dodanych zasobach jest poprawnym komunikatem. Terraform apply i możemy weryfikować po stronie DigitalOcean czy mamy wszystkie VPC stworzone.
![](https://static.wixstatic.com/media/b21a85_38584db7e56d4e5bbb975372a31f1b40~mv2.png/v1/fill/w_980,h_701,al_c,q_90,usm_0.66_1.00_0.01,enc_auto/b21a85_38584db7e56d4e5bbb975372a31f1b40~mv2.png)
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.
![](https://static.wixstatic.com/media/b21a85_7e9742a540e743f5abe24081c965b217~mv2.png/v1/fill/w_980,h_249,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/b21a85_7e9742a540e743f5abe24081c965b217~mv2.png)
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.
Commentaires