Infrastruktura jako kod (terraform + digital ocean)
We wpisie pokazuję w jaki sposób rozstawić serwery z linii poleceń terraform.
Daniel Gustaw
• 3 min read
W scrapingu ważnym czynnikiem jest skala, do jakiej możemy rozszerzyć tempo pobierania i przetwarzania danych. Kiedy kilka lat temu pisałem swój pierwszy system, który równolegle zbierał dane używając kilkunastu serwerów, każdy z tych serwerów był przeze mnie “wyklikany” w panelu dostawcy.
Teraz pokażę w jaki sposób rozstawić serwery z linii poleceń terraform. Dostawcą będzie Digital Ocean, ponieważ w porównaniu ze swoją największą konkurencją ma bardzo korzystne (8-10 razy niższe) ceny transferu sieciowego.

https://www.digitalocean.com/pricing/calculator/
Prezentację przeprowadzimy z systemu arch.
Instalacja Terraform
Nie ma nic bardzej przyjemnego niż instlacja oprogramowania w arch. Aby cieszyć się gotowym do pracy terraformem wystarczy komenda
yay -S terraform
Podłączenie dostawcy
Aby połączyć się z Digital Ocean potrzebujemy tokenu. Jeśli go nie posiadamy, znajdziemy w zakładce API w panelu przycisk “Generate New Token”

Token warto zapisać w ~/.zshrc lub ~/.bashrc
export DIGITALOCEAN_TOKEN=xxxxxxxxxxxxxxxxxxxxxx
po ponownym wykonaniu tego plik będzie on dostępny we wszystkich tworzonych przez nas projektach.
Oficjalna dokumentacja pokazuje jak zrobić to przez zmienną do_token
https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs
ale nie polecam tego sposobu, ponieważ wymusza on na nas dopisywanie argumentów -var do poleceń terraform a podejście prezentowane tutaj oszczędza nam ilość wpisywanych znaków.
Aby skonfigurować połączenie do Digital Ocean mając token w zmiennych środowiskowych tworzymy plik provider.tf i wpisujemy do niego:
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "2.5.1"
}
}
}
provider "digitalocean" {}
A następnie wykonujemy komendę inicjalizacyjną
terraform init
Rozstawianie serwerów
Kolejnym krokiem jest zaplanowanie i rozstawienie infrastruktury. W naszym przypadku bedzie ona bardzo prosta. Powinna zawierać dokładnie jeden droplet z kluczami do wszystkich inoyterów, którymi chcę się na niego logować.
Tworzymy kolejny plik. Nazwałem go master.tf
data "digitalocean_ssh_key" "dell" {
name = "Daniel Laptop Dell"
}
data "digitalocean_ssh_key" "yoga" {
name = "Daniel Lenovo Yoga"
}
data "digitalocean_ssh_key" "hp" {
name = "Daniel Stacjonarny"
}
# Create a web server
resource "digitalocean_droplet" "web" {
image = "ubuntu-18-04-x64"
name = "web-1"
region = "fra1"
size = "s-1vcpu-1gb"
ssh_keys = [
data.digitalocean_ssh_key.dell.id,
data.digitalocean_ssh_key.yoga.id,
data.digitalocean_ssh_key.hp.id
]
}
Są to klucze, które znajdziemy w zakładce “Settings -> Security” w panelu Digital Ocean

Wykonanie
terraform plan
Sprawdzi, czy nasza konfiguracja jest ok i pozwoli zobaczyć jak zmieni się architektura po wdrożeniu. W tym przypadku będzie to dodanie jednego serwera - dokładnie tak jak napisaliśmy w konfiguracji

Wdrożenie wykonamy wpisując
terraform apply -auto-approve
Wykonanie tej komendy trwało u mnie 47s.
Przegląd wyników
Aby zobaczyć co postawiliśmy wykonujemy polecenie:
terraform show terraform.tfstate
Zwraca ono dane na temat zasobów zarządzanych przez terraform

Najbardziej interesujące jest dla nas ip. W tym przypadku 164.90.174.250.
Na serwer loguję się komendą
ssh -o "StrictHostKeyChecking no" root@164.90.174.250
Jak widać działa, bo komenda zalogowała nas na serwer web-1 jako root.

Po powrocie do localhost poleceniem
exit
możemy usunąć wszystkie utworzone droplety komendą
terraform destroy -auto-approve
Należy o niej pamiętać po zakończonej pracy, szczególnie jeśli operujemy na dużej skali mocy obliczeniowej!
Other articles
You can find interesting also.
CodinGame: Czas pochodnej - Część 1, Rekursja (Typescript)
Rozwiązanie ćwiczenia CodinGame. Prosty przykład rekurencji z typescriptem. Reprezentacja formuły inspirowana lispem.
Daniel Gustaw
• 17 min read
Od MLP do CNN. Sieci neuronowe do rozpoznawania cyfr MNIST
Budujemy i porównujemy cztery architektury sieci neuronowych w PyTorch, wizualizujemy wydajność, badamy złożoność w porównaniu do dokładności i pokazujemy, dlaczego CNN-y są najlepsze w klasyfikacji obrazów.
Daniel Gustaw
• 14 min read
Broadcast Channel API
Wpis pokazuje jak używać Broadcast Channel API do przesyłania danych między kartami lub oknami przeglądarki bez wykorzystania serwera i socketów.
Daniel Gustaw
• 11 min read