Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Pytania dotyczące struktury kodu są zdecydowanie najczęściej zadawanymi w społeczności Terraform. W pewnym momencie każdy zaczyna się zastanawiać co dla projektu będzie najlepsze.
To jedno z pytań, na które jest wiele odpowiedzi, lecz bardzo trudno jest udzielić uniwersalnych porad, więc postarajmy się zacząć od zrozumienia z czym mamy do czynienia.
Jaka jest złożoność Twojego projektu?
Liczba powiązanych zasobów
Liczba użytych dostawców Terraform (uwaga — patrz poniżej na temat „dostawców logicznych” (logical providers))
Jak często zmienia się Twoja infrastruktura?
Zaczynając od raz w miesiącu/tygodniu/codziennie
Skończywszy na ciągłym (za każdym razem, gdy pojawia się nowa zmiana (commit))
Kto lub co zmienia kod? Czy pozwalasz serwerowi CI aktualizować repozytorium po zbudowaniu nowego artefaktu?
Tylko programiści mogą wysyłać kod do repozytorium infrastruktury
Każdy może proponować zmiany, otwierając pull-requesty (w tym automatyczne zadania uruchomione na serwerze CI)
Z jakiej platformy lub usługi wdrożeniowej korzystasz?
AWS CodeDeploy, Kubernetes czy OpenShift wymagają nieco innych podejść
Jak grupowane są środowiska?
Według środowiska, regionu, projektu
Umieszczenie całego kodu w pliku main.tf
jest dobrym pomysłem, jeśli dopiero zaczynasz swoją przygodę z Terraform lub piszesz testowy kod, aby coś zweryfikować. We wszystkich innych przypadkach lepiej będzie mieć kilka plików podzielonych logicznie w następujący sposób:
main.tf
— wywoływanie modułów, zmienny lokalnych i źródeł danych w celu utworzenia wszystkich zasobów
variables.tf
— zawiera deklaracje zmiennych używanych w main.tf
outputs.tf
— zawiera dane wyjściowe z zasobów utworzonych w main.tf
versions.tf
— zawiera wymagania dotyczące wersji dla Terraform i dostawców
Łatwiej i szybciej pracuje się z mniejszą liczbą zasobów
komendy terraform plan
i terraform apply
wykonują wywołania API, aby zweryfikować status zasobów
Jeśli masz całą infrastrukturę w jednej kompozycji, może to zająć trochę czasu
Promień rażenia jest mniejszy przy mniejszej ilości zasobów
Odizolowanie od siebie niepowiązanych zasobów poprzez umieszczenie ich w oddzielnych kompozycjach zmniejsza ryzyko, jeśli coś pójdzie nie tak
Rozpocznij swój projekt od użycia stanu zdalnego (remote state), ponieważ:
Twój laptop nie jest odpowiednim miejscem na źródło prawdy (source of truth) o Twojej infrastrukturze
Zarządzanie plikiem tfstate
w repozytorium git to koszmar
Później, gdy warstwy infrastruktury zaczną rosnąć w wielu kierunkach (liczba zależności lub zasobów) łatwiej będzie mieć wszystko pod kontrolą
Ćwicz pisanie spójnej struktury i praktykuj zachowywanie konwencji nazewnictwa:
Podobnie jak przy kodzie proceduralnym, kod Terraform powinien być napisany tak, aby w pierwszej kolejności mogli go przeczytać ludzie. Zachowanie porządku pomoże, kiedy trzeba będzie wrócić do zmian sprzed pół roku.
Przenoszenie zasobów w pliku stanu Terraform jest możliwe, ale może to być trudniejsze, jeśli masz niespójną strukturę i nazewnictwo
Zachowaj moduły zasobów tak proste, jak to możliwe
Nie "hardkoduj" wartości, które mogą być przekazywane jako zmienne lub uzyskane przy użyciu źródeł danych
Użyj źródeł danych i terraform_remote_state
jako łącznika między modułami infrastruktury w kompozycji
W tej książce przykładowe projekty są pogrupowane według złożoności — od małych do bardzo dużych infrastruktur. Ten podział nie jest ścisły, więc sprawdź, jak robią to inni.
Posiadanie małej infrastruktury oznacza, że istnieje niewielka liczba zależności i niewiele zasobów. Wraz z rozwojem projektu pojawia się potrzeba łączenia wykonywania konfiguracji Terraform. Łączenia różnych modułów infrastruktury i przekazywanie wartości w ramach kompozycji staje się oczywistym następstwem.
Istnieje co najmniej 5 odrębnych grup rozwiązań do orkiestracji, z których korzystają programiści_stki:
Czysty Terraform. Bardzo proste rozwiązanie. Programiści_stki muszą znać tylko Terraform, aby wykonać zadanie.
Terragrunt. Narzędzie, którego można użyć do orkiestracji całej infrastruktury, a także obsługi zależności. Terragrunt działa natywnie z modułami infrastruktury i kompozycjami, dzięki czemu ogranicza powielanie kodu.
Skrypty wewnętrzne. Często używane jako punkt startowy do używania orkiestracji oraz przed odkryciem Terragrunt.
Ansible lub inne narzędzie ogólnego przeznaczenia do automatyzacji. Zwykle wybierane rozwiązanie, gdy Terraform jest używany po implementacji Ansible lub gdy aktywnie używany jest interfejs użytkownika Ansible.
Mając to wszystko na uwadze — ta książka zawiera przegląd pierwszych dwóch z struktur projektowych — tylko Terraform i Terragrunt.
Ta sekcja opisuje kluczowe pojęcia, które są używane w książce.
Przykładowe zasoby to aws_vpc
, aws_db_instance
, itd. Zasób należy do dostawcy (provider), może przyjmować argumenty (parameters) oraz zwracać różne atrybuty (outputs) i ma swój cykl życia (lifecycle). Może on być tworzony, pobierany, aktualizowany i usuwany.
Moduł infrastruktury to zbiór modułów zasobów, które nie muszą być ze sobą logicznie połączone, ale mogą, współpracując ze sobą służyć temu samemu celowi. Definiuje konfigurację dla dostawców, która jest następnie przekazywana do modułów zasobów podrzędnych i do samodzielnych zasobów. Zwykle ogranicza się on do pracy w pojedynczej encji na każdy logiczny separator (np. region AWS, projekt Google).
Kompozycja to zbiór modułów infrastruktury, które mogą obejmować kilka logicznie oddzielonych obszarów (np. regiony AWS, kilka kont AWS). Kompozycja służy do opisania kompletnej infrastruktury wymaganej dla całej organizacji lub projektu.
Kompozycja składa się z modułów infrastruktury, na które składają się moduły zasobów, które realizują poszczególne zasoby
Źródło danych wykonuje operacje tylko do odczytu (read-only) i jest zależne od konfiguracji dostawcy. Jest ono używane w module zasobów i module infrastruktury.
Źródło danych terraform_remote_state
działa jako spoiwo dla modułów i kompozycji wyższego poziomu.
Dostęp do danych oraz wymiana między nimi (moduły zasobów i moduły infrastruktury) jest realizowany z wykorzystaniem wyjść modułów (module output) i źródeł danych.
Starając się przedstawić opisane powyżej pojęcia przy pomocy pseudorelacji uzyskamy następującą strukturę:
Przykłady i moduły Terraform powinny zawierać dokumentację wyjaśniającą funkcje i sposoby ich używania.
Wszystkie linki w plikach README.md
powinny być bezwzględne, aby witryna Terraform Registry wyświetlała je poprawnie.
Dzięki konfiguracjom Terraform pre-commit
może służyć do formatowania i sprawdzania poprawności kodu, a także do aktualizowania dokumentacji.
Ten przykład zawiera kod dla strukturyzacji konfiguracji Terraform dla średniego rozmiaru infrastruktury, która zawiera:
2 konta AWS
2 oddzielne środowiska (prod
i stage
, które nic ze sobą nie dzielą). Każde środowisko funkcjonuje na osobnym koncie AWS
Każde środowisko używa tej samej wersji modułów/sieci (modules/network
) modułu wewnętrznego, ponieważ pochodzi z katalogu lokalnego.
Idealny dla projektów, w których infrastruktura jest logicznie odseparowana (osobne konta AWS)
Dobre, gdy nie ma potrzeby modyfikowania zasobów współdzielonych między kontami AWS (jedno środowisko = jedno konto AWS = jeden plik stanu)
Dobre, gdy nie ma potrzeby organizowania zmian między środowiskami
Dobre, gdy zasoby infrastruktury są celowo różne w zależności od środowiska i nie można ich uogólniać (np. niektóre zasoby są nieobecne w jednym środowisku lub w niektórych regionach)
W miarę rozwoju projektu coraz trudniej będzie zapewnić wzajemną aktualność tych środowisk. Rozważ użycie modułów infrastruktury (gotowych lub wewnętrznych) do powtarzalnych zadań.
Istnieją też warsztaty dla osób, które chcą przećwiczyć niektóre z zagadnień opisanych w tej książce.
locals
), aby określić jawne zależności między zasobamiPrzydatny sposób na wskazanie Terraform, że niektóre zasoby powinny zostać usunięte wcześniej, nawet jeśli nie ma bezpośredniej zależności w konfiguracjach.
Wymagany argument index_document
musi być ustawiony, jeśli var.website
nie jest pustą mapą.
Opcjonalny argument error_document
można pominąć.
Type | Description | Gotowość |
---|---|---|
Typ | Opis | Gotowość |
---|---|---|
Dostawcy logiczni (logical providers) działają w całości w ramach logiki Terraform i bardzo często nie wchodzą w interakcję z żadnymi innymi usługami, więc możemy myśleć o ich złożoności jako O(1). Najpopularniejszymi dostawcami logicznymi są , , , , .
Plik terraform.tfvars
nie powinien być używany poza .
Upewnij się, że rozumiesz kluczowe pojęcia — , i , gdyż są one używane w poniższych przykładach.
i inne rozwiązania inspirowane Kubernetes. Czasami sensowne jest wykorzystanie ekosystemu Kubernetes i zastosowanie pętli uzgadniania (reconciliation loop), aby osiągnąć pożądany stan konfiguracji Terraform. Obejrzyj film , aby uzyskać więcej informacji.
Zobacz przykłady struktur kodu dla lub w następnym rozdziale.
Oficjalna dokumentacja Terraforma szczegółowo . Przeczytaj ją uważnie, aby zrozumieć resztę tej sekcji.
Moduł zasobu to zbiór połączonych zasobów, które razem wykonują wspólną akcję (np. moduł tworzy VPC, podsieci, bramę NAT itp.). Jest on zależny od konfiguracji dostawcy, którą można zdefiniować w nim lub w strukturach na wyższym poziomie (np. w module infrastruktury).
Na przykład moduł wykorzystuje moduły zasobów, takie jak i , do zarządzania infrastrukturą wymaganą do uruchomienia na .
Innym przykładem jest moduł , w którym wiele modułów jest używanych razem do zarządzania infrastrukturą, a także do tworzenia, wypychania i wdrażania obrazów platformy Docker. Wszystko w jednym miejscu.
źródło danych umożliwia, aby zewnętrzny program działał jako źródło danych, udostępniając dowolne dane do użycia w innym miejscu w konfiguracji Terraform. Oto przykład z modułu , w którym nazwa pliku jest uzyskiwana poprzez wywołanie zewnętrznego skryptu Python.
Źródło danych wysyła żądanie HTTP GET do podanego adresu URL i zwraca informacje o odpowiedzi. Jest to często przydatne w uzyskiwaniu informacji z punktów końcowych (endpoints), dla których nie istnieje natywny dostawca Terraform.
Moduły infrastruktury i kompozycje powinny zachowywać swój w zdalnej lokalizacji, gdzie mogą być pobierane przez inne osoby w kontrolowany sposób (np. z ACL, wersjonowaniem, rejestrowaniem).
Dostawca jest bardzo dobrze . Nie ma więc sensu tego tutaj powtarzać. Moim zdaniem ma on niewiele wspólnego z pisaniem dobrych modułów w Terraform.
Podczas gdy poszczególne zasoby są jak atomy w infrastrukturze, moduły zasobów są molekułami. Moduł jest najmniejszą jednostką, którą wersjonujemy i możemy udostępniać innym. Ma dokładną listę argumentów i implementuje podstawową logikę. Na przykład moduł tworzy zasoby aws_security_group
oraz aws_security_group_rule
na podstawie danych wejściowych. Może on być użyty razem z innymi modułami do stworzenia modułu infrastruktury.
Dostęp między kompozycjami jest często realizowany przy użyciu zdalnych źródeł danych stanu. Istnieje wiele sposobów na .
- narzędzie do orkiestracji
- linter kodu
- menadżer wersji
- narzędzie do automatyzacji pull-requestów
- Zbiór git hooków dla Terraforma do użycia z
- Oszacowywanie kosztów chmury w pull requestach. Działa z Terragrunt, Atlantis a także pre-commit-terrraform.
Nie ma głównego narzędzia do zarządzania zależnościami, ale jest kilka wskazówek, dzięki którym piekło zależności będzie mniej problematyczne. Na przykład może służyć do automatyzacji aktualizacji zależności. Dependabot tworzy pull requesty, aby Twoje zależności były bezpieczne i aktualne. Dependabot obsługuje konfiguracje Terraform.
Dokumentacja może zawierać schematy stworzone za pomocą i plany stworzone za pomocą .
Korzystaj z , aby upewnić się, że kod jest prawidłowy, odpowiednio sformatowany i automatycznie udokumentowany przed przekazaniem go do git'a i sprawdzeniem przez innych.
to framework do zarządzania i utrzymywania różnorodnych narzędzi do sprawdzania kodu przed jego wysłaniem do zdalnego repozytorium. Jest napisanym w Pythonie potężnym narzędziem do automatyzacji żmudnych czynności na maszynie programisty, zanim kod zostanie przekazany do repozytorium git. Zwykle jest używany do uruchamiania linterów i formatowania kodu (zobacz ).
Sprawdź . Zapoznaj się z nim oraz istniejącym repozytoriami (np. ), w których jest ono już używane.
to narzędzie, które generuje dokumentację z modułów Terraform w różnych formatach wyjściowych. Możesz uruchomić go ręcznie (bez pre-commit hooków) lub użyć , aby automatycznie zaktualizować dokumentację.
Post napisany przez :
Źródło:
Każde środowisko korzysta z innej wersji gotowego modułu infrastruktury (alb
) pochodzącego z
Znajdziesz je tutaj: