Terraform to narzędzie umożliwiające zarządzanie infrastrukturą jako kod, które pozwala na zdefiniowanie, wdrożenie i utrzymanie środowisk chmurowych w sposób automatyczny i powtarzalny. Aby jednak wykorzystać pełen potencjał tego narzędzia, ważne jest zrozumienie kilku kluczowych elementów, takich jak proces planowania, zastosowanie komendy terraform apply, kontrola stanu za pomocą terraform show oraz skuteczne usuwanie zasobów przy pomocy terraform destroy.
Pierwszym krokiem w używaniu Terraform jest stworzenie planu, który dokładnie określa zmiany, jakie zostaną wprowadzone w infrastrukturze. Komenda terraform plan generuje propozycję zmian, ale ważne jest, aby wynik tego planu zapisać do pliku, co pozwala na jego późniejsze wykorzystanie w procesie aplikacji. W dużych zespołach zaleca się zapisanie planu do pliku przy użyciu komendy:
W ten sposób uzyskuje się kontrolę nad tym, co dokładnie ma zostać wprowadzone, eliminując ryzyko niezamierzonych zmian w trakcie procesu. Kolejny krok to terraform apply, który służy do wykonania tych zmian i wdrożenia pożądanej infrastruktury. Komenda ta może być użyta bezpośrednio, ale także z plikiem planu, aby mieć pewność, że wdrażane zostaną tylko te zmiany, które zostały wcześniej zatwierdzone:
Po wykonaniu tej komendy Terraform łączy się z chmurową platformą, np. Azure, i tworzy wskazane zasoby. Zależnie od złożoności zasobów, proces ten może trwać kilka minut. Gdy wszystko przebiega zgodnie z planem, konsola wyświetli komunikat o pomyślnym zakończeniu, a wszystkie zmiany zostaną zapisane w stanie. Jeśli wystąpią jakiekolwiek błędy, takie jak niewłaściwe poświadczenia lub brak uprawnień, Terraform zatrzyma proces i wyświetli szczegóły błędu. W takim przypadku wystarczy rozwiązać problem i ponownie uruchomić terraform apply, a proces zazwyczaj będzie kontynuowany od miejsca, w którym został przerwany.
Po wdrożeniu zasobów, możesz wykorzystać komendę terraform show, aby sprawdzić bieżący stan infrastruktury. Dzięki niej uzyskasz pełny przegląd zarządzanych zasobów oraz ich właściwości. Na przykład:
Ta komenda wyświetli szczegółowy opis wszystkich zasobów, które zostały utworzone, w tym identyfikatory, lokalizacje oraz tagi. Dodatkowo, jeśli istnieje potrzeba sprawdzenia tylko pojedynczego zasobu, można użyć terraform state show, co pozwala na izolację konkretnego zasobu i dokładne zbadanie jego atrybutów.
W przypadku środowisk tymczasowych lub testowych, w których zasoby są potrzebne tylko przez krótki czas, można je usunąć za pomocą komendy terraform destroy. Ta komenda pozwala na całkowite usunięcie zasobów, które zostały wcześniej zdefiniowane w konfiguracji. Proces ten jest podobny do procesu aplikowania zmian, jednak zamiast wdrażać, Terraform usuwa zasoby, a stan zostaje zaktualizowany, by odzwierciedlał brak zarządzanych elementów:
Po wykonaniu tej komendy Terraform wyświetla plan usunięcia zasobów i pyta o potwierdzenie, po czym rozpoczyna proces ich usuwania.
Jednym z kluczowych elementów pracy z Terraformem jest język HashiCorp Configuration Language (HCL), który zapewnia wysoką czytelność kodu. HCL łączy w sobie przejrzystość dla użytkowników i możliwość łatwego przetwarzania przez maszyny, co czyni go idealnym wyborem do tworzenia dokumentacji infrastrukturalnej. W HCL każda konfiguracja jest reprezentowana jako blok, w którym zdefiniowane są zasoby, ich właściwości oraz zależności. Przykład takiego bloku wygląda następująco:
Blok "resource" opisuje zasób w chmurze, w tym przypadku sieć wirtualną w Azure. Ważnym elementem jest także możliwość odniesienia się do innych zasobów, co ułatwia zarządzanie zależnościami bez konieczności powielania danych.
HCL pozwala także na definiowanie zmiennych, które ułatwiają tworzenie elastycznych i wielokrotnie wykorzystywanych konfiguracji. Zmienna może być zadeklarowana z domyślną wartością, jak w poniższym przykładzie:
Zmienna ta może być później nadpisana przy użyciu pliku .tfvars lub zmiennych środowiskowych, co pozwala na dostosowanie konfiguracji do różnych środowisk.
Terraform, dzięki swojej prostocie oraz rozbudowanej funkcjonalności, jest w stanie zaspokoić potrzeby zarówno małych zespołów, jak i dużych organizacji, które zarządzają wieloma zasobami w różnych chmurach. Dzięki zastosowaniu HCL, kod infrastrukturalny staje się żywą dokumentacją, co upraszcza współpracę pomiędzy zespołami deweloperskimi, inżynierami operacyjnymi i innymi zainteresowanymi stronami.
Poza podstawowym zrozumieniem procesów takich jak planowanie, aplikowanie zmian, kontrolowanie stanu oraz usuwanie zasobów, ważne jest także pamiętać, że Terraform, jako narzędzie do zarządzania infrastrukturą, może być stosowane w połączeniu z innymi narzędziami, co pozwala na pełną automatyzację procesów wdrożeniowych. Ważne jest także, by regularnie aktualizować stan, szczególnie w przypadku dynamicznych środowisk, w których zmiany mogą zachodzić często. Należy również zwrócić szczególną uwagę na bezpieczeństwo danych i uprawnień, zwłaszcza przy pracy z wrażliwymi informacjami w chmurze.
Jak zarządzać stanem w Terraform: Lokalny vs Zdalny stan i manipulacje stanem
W mechanizmie Terraform stan odgrywa kluczową rolę, pełniąc funkcję przechowywania aktualnych informacji o zarządzanej infrastrukturze. Zamiast ponownie odpytywać całą infrastrukturę przy każdym działaniu, Terraform korzysta ze snapshotu stanu zawartego w pliku stanu, dzięki czemu oszczędza czas i zasoby. Zawartość tego pliku odzwierciedla rzeczywisty stan zasobów i stanowi bazę dla operacji takich jak planowanie zmian czy ich stosowanie. Niemniej jednak, ponieważ plik stanu może zawierać wrażliwe dane, takie jak poświadczenia lub klucze dostępowe, wymaga on odpowiedniego zabezpieczenia.
Kiedy zespół korzysta z pliku stanu, daje to pewność, że wszyscy członkowie pracują na tej samej, autorytatywnej wersji stanu. Może to być pomocne, gdy infrastruktura jest współdzielona, a każdy uczestnik ma spójne dane na temat bieżącego stanu zasobów. Mimo to, plik stanu nie jest tylko narzędziem do odczytu – może być także manipulowany ręcznie w przypadkach wyjątkowych. Na przykład, jeśli zasób został usunięty poza Terraform, na przykład w portalu Azure, możemy usunąć go z perspektywy Terraform, używając komendy terraform state rm. Podobnie, terraform state mv umożliwia przeniesienie zasobów pomiędzy modułami w pliku stanu, co zapobiega cyklowi zniszczenia i ponownego utworzenia zasobu.
Manipulowanie stanem w ten sposób niesie ryzyko. Niepoprawne usunięcie lub przeniesienie zasobu może sprawić, że Terraform przestanie śledzić rzeczywiste zasoby, co może prowadzić do nieoczekiwanych wyników. W związku z tym każdą manualną zmianę warto dokładnie przemyśleć, a także przed jej zastosowaniem wykonać plan weryfikujący zmiany, aby upewnić się, że nie zostaną wprowadzone błędy.
Lokalny stan vs Zdalny stan
Dla pojedynczych użytkowników lub w przypadku niewielkich eksperymentów najwygodniejszym rozwiązaniem jest przechowywanie pliku stanu lokalnie. W tym przypadku, po inicjalizacji Terraform, plik terraform.tfstate pojawi się w folderze projektu, a jego zawartość będzie zmieniać się z każdą operacją terraform apply. Takie podejście jest odpowiednie w kontekście szybkich prototypów lub prywatnych środowisk do testów. Problem pojawia się jednak, gdy infrastruktura jest współdzielona przez zespół – lokalny plik stanu staje się potencjalnym źródłem problemów, ponieważ każdy członek zespołu może zarządzać własną wersją tego pliku. Tego typu rozbieżności prowadzą do ryzyka konfliktów, zwłaszcza gdy różni użytkownicy uruchamiają komendy Terraform w tym samym czasie.
Co więcej, lokalny plik stanu może zawierać wrażliwe dane, takie jak hasła, klucze dostępu czy informacje o zasobach, które nie powinny znajdować się na każdym urządzeniu dewelopera. Dodatkowo, jeśli plik stanu ulegnie uszkodzeniu lub utracie (np. wskutek awarii dysku), odzyskanie stanu infrastruktury może być trudne, co prowadzi do duplikacji zasobów lub nieporozumień co do aktualnego stanu wdrożenia.
Aby rozwiązać te problemy, zespoły coraz częściej przyjmują zdalny stan. Stosowanie zdalnego backendu, np. w AWS S3, Azure Blob Storage, Google Cloud Storage lub Terraform Cloud, zapewnia wszystkim członkom zespołu dostęp do jednej, autorytatywnej wersji stanu. Zaletą takiego podejścia jest to, że wszystkie operacje terraform plan i terraform apply będą wykonywane na wspólnej wersji stanu, eliminując ryzyko niezamierzonych rozbieżności. Ponadto, zdalny backend zapewnia dodatkowe mechanizmy, takie jak blokowanie dostępu, co zapobiega równoczesnemu modyfikowaniu pliku stanu przez kilku użytkowników, a także szyfrowanie, wersjonowanie czy replikację, co poprawia bezpieczeństwo i trwałość danych.
Typowa konfiguracja backendu dla środowiska Azure może wyglądać następująco:
Po uruchomieniu terraform init, Terraform przeniesie lokalny stan do zdalnego backendu, a kolejne operacje będą wykonywane na zdalnym pliku stanu, co zapewni synchronizację między członkami zespołu.
Manipulacje stanem
Chociaż podstawową metodą zarządzania stanem jest użycie komend terraform plan i terraform apply, zdarzają się sytuacje, w których konieczna jest manualna ingerencja w plik stanu. Warto jednak pamiętać, że najlepszą praktyką jest minimalizowanie takich zmian, aby uniknąć błędów. Manipulacje stanem są szczególnie przydatne w przypadku, gdy zasoby zostały zmodyfikowane lub usunięte poza Terraform (np. w konsolach chmurowych), lub gdy chcemy przenieść zasób do innego modułu.
Przykład użycia komendy terraform state rm, aby usunąć zasób ze stanu:
Inny przykład to przenoszenie zasobu pomiędzy modułami:
Zanim jednak zdecydujemy się na takie działania, warto wykonać kopię zapasową pliku stanu i przeanalizować zmiany za pomocą komendy terraform plan, aby upewnić się, że nie wprowadzamy niezamierzonych zmian.
Rozwiązywanie konfliktów stanu
Konflikty stanu mogą wystąpić w sytuacjach, gdy wielu członków zespołu jednocześnie pracuje nad tą samą infrastrukturą, albo gdy zasoby są modyfikowane poza Terraform. Zwykle przejawiają się one w postaci błędów blokady stanu lub rozbieżności między stanem rzeczywistym a stanem zapisanym w pliku. Istnieje kilka typowych przypadków konfliktów:
-
Równoczesne operacje Terraform: Jeśli dwóch użytkowników równocześnie uruchomi Terraform, może dojść do konfliktu blokady stanu. Aby rozwiązać taki problem, można ręcznie odblokować stan za pomocą komendy
terraform force-unlock, jednak należy to zrobić ostrożnie, upewniając się, że wcześniejsza operacja Terraform faktycznie zakończyła się i nie powoduje uszkodzenia stanu. -
Drift infrastruktury: Drift ma miejsce, gdy rzeczywisty stan infrastruktury odbiega od stanu zapisanego w pliku stanu, na przykład w wyniku zmian dokonanych ręcznie lub przez inne procesy automatyczne. Aby zarządzać tym zjawiskiem, warto używać komendy
terraform refresh, która synchronizuje plik stanu z rzeczywistym stanem infrastruktury. Następnieterraform planpomoże zwizualizować różnice, aterraform applyzaktualizuje stan.
Ostatecznie, aby uniknąć powstawania takich problemów, warto przestrzegać dobrych praktyk w zakresie zarządzania stanem, takich jak stosowanie zdalnego backendu, stosowanie blokady stanu oraz regularne synchronizowanie infrastruktury z rzeczywistym stanem za pomocą komend Terraform.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский