Korzystanie z pętli `for_each` i `count`
Dowiedz się, jak tworzyć wiele instancji zasobu lub modułu za pomocą `count` i `for_each`, aby efektywnie obsługiwać kolekcje i mapy.
Korzystanie z pętli `for_each` i `count` to bezpłatna lekcja Terraform Infrastructure as Code na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Terraform Infrastructure as Code, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Terraform Infrastructure as Code zawiera 4 lekcji w sumie.
Wprowadzenie do pętli
Podczas zarządzania infrastrukturą za pomocą Terraformu często trzeba tworzyć wiele podobnych zasobów. Proszę sobie wyobrazić konieczność utworzenia 10 serwerów WWW lub 5 instancji baz danych. Wielokrotne zapisywanie tego samego bloku kodu byłoby żmudne i podatne na błędy!
W tej lekcji poznają Państwo dwie zaawansowane funkcje Terraformu: count i for_each. Pomagają one efektywnie aprowizować wiele zasobów, zachowując przejrzystość i skalowalność konfiguracji.
Dlaczego używać `count` i `for_each`?
Używanie pętli takich jak count i for_each przynosi znaczące korzyści:
- Mniej powtórzeń: kod infrastruktury jest zapisywany raz i wielokrotnie wykorzystywany.
- Większa czytelność: konfiguracje stają się przejrzystsze i łatwiejsze do zrozumienia.
- Skalowalność: liczbę zasobów można łatwo zmienić, modyfikując pojedynczą wartość lub kolekcję.
- Spójność: wszystkie podobne zasoby są konfigurowane w identyczny sposób.
`count` do prostego powtarzania
Argument metadanych count doskonale sprawdza się, gdy trzeba utworzyć wiele niemal identycznych instancji zasobu lub modułu. Podają Państwo wartość całkowitą, a Terraform tworzy odpowiednią liczbę instancji.
Każda instancja utworzona za pomocą count otrzymuje indeks — od 0 do count - 1. Dostęp do tego indeksu uzyskuje się za pomocą count.index.
Przykład: wiele instancji EC2 za pomocą `count`
Utwórzmy trzy identyczne instancje AWS EC2. Proszę zwrócić uwagę, jak count.index służy do nadania każdemu serwerowi unikatowej nazwy.
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web_server" {
count = 3
ami = "ami-053b0dcd10dcf2f56" # Ubuntu Server 20.04 LTS
instance_type = "t2.micro"
tags = {
Name = "WebServer-${count.index}"
}
}Zrozumienie `count.index`
W poprzednim przykładzie ${count.index} automatycznie przyjmował dla poszczególnych instancji wartości 0, 1 i 2. Dzięki temu można tworzyć unikatowe identyfikatory lub dostosowywać właściwości każdej instancji.
Bez count.index wszystkie trzy serwery miałyby dokładnie ten sam tag „Name”, co mogłoby prowadzić do nieporozumień lub problemów w AWS.
Wprowadzenie do `for_each`
Choć count świetnie nadaje się do prostego powtarzania, for_each oferuje większą elastyczność. Iteruje po zbiorze ciągów znaków lub mapie ciągów znaków, tworząc jedną instancję dla każdego elementu.
for_each jest idealny, gdy trzeba zarządzać zasobami o różnych konfiguracjach albo gdy liczba zasobów wynika z kolekcji innej niż numeryczna (np. listy nazw środowisk lub mapy ustawień użytkowników).
Przykład: `for_each` ze zbiorem
W tym przykładzie tworzymy trzy zasobniki S3, z których każdy otrzymuje nazwę odpowiadającą elementowi naszego zbioru for_each. Używamy each.value, aby uzyskać dostęp do bieżącego elementu iteracji.
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "app_buckets" {
for_each = toset(["prod-app-data", "dev-app-logs", "test-app-assets"])
bucket = each.value
acl = "private"
tags = {
Environment = split("-", each.value)[0]
}
}Przykład: `for_each` z mapą
Mapa pozwala definiować bardziej złożone i unikatowe konfiguracje dla każdego zasobu. W tym przykładzie tworzymy zasobniki S3 z różnymi ustawieniami wersjonowania zależnymi od kluczy środowisk.
Dostęp do klucza uzyskuje się za pomocą each.key, a do wartości — za pomocą each.value.
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "configured_bucket" {
for_each = {
production = { name = "prod-data-bucket", versioning = true }
development = { name = "dev-logs-bucket", versioning = false }
}
bucket = each.value.name
acl = "private"
versioning {
enabled = each.value.versioning
}
tags = {
Environment = each.key
}
}`count` a `for_each`: właściwy wybór
Kiedy należy użyć którego rozwiązania?
- Użyj
count: do prostej iteracji numerycznej i tworzenia identycznych zasobów, gdy najważniejsza jest ich liczba. To dobre rozwiązanie, gdy do rozróżnienia wystarczy indeks. - Użyj
for_each: do iterowania po złożonych kolekcjach (zbiorach lub mapach), gdy zasoby wymagają unikatowych identyfikatorów lub właściwości wynikających z elementów kolekcji. Zwykle jest to preferowane rozwiązanie, gdy każda instancja ma jasno określony, unikatowy identyfikator logiczny.
Szybkie sprawdzenie: pętle
Rozważmy sytuację, w której trzeba utworzyć zasobnik S3 dla każdego zespołu w organizacji, a każdy zasobnik musi mieć określoną przez ten zespół zasadę przechowywania.
Podsumowanie: efektywne tworzenie zasobów
Świetna praca! Dowiedzieli się Państwo, jak wykorzystać count i for_each, aby tworzyć bardziej dynamiczne i efektywne konfiguracje Terraformu.
countsłuży do prostego, numerycznego powtarzania identycznych zasobów z użyciemcount.indexdo ich rozróżniania.for_eachsłuży do iterowania po zbiorach lub mapach i tworzenia różnych zasobów z unikatowymi właściwościami za pomocąeach.keyieach.value.
Konstrukcje te mają fundamentalne znaczenie dla zarządzania skalowalną i łatwą w utrzymaniu infrastrukturą jako kodem!
Często zadawane pytania
Czy lekcja „Korzystanie z pętli `for_each` i `count`” jest bezpłatna?
Tak — pełny tekst „Korzystanie z pętli `for_each` i `count`” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Terraform Infrastructure as Code, przejdź na CoddyKit PRO. Kurs Terraform Infrastructure as Code zawiera 4 lekcji w sumie.
Co nauczysz się w „Korzystanie z pętli `for_each` i `count`”?
Dowiedz się, jak tworzyć wiele instancji zasobu lub modułu za pomocą `count` i `for_each`, aby efektywnie obsługiwać kolekcje i mapy. Ćwiczysz Terraform Infrastructure as Code z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Terraform Infrastructure as Code?
Nie wymagamy żadnego doświadczenia. Terraform Infrastructure as Code w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Korzystanie z pętli `for_each` i `count`”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Terraform Infrastructure as Code?
Tak. Każda lekcja Terraform Infrastructure as Code zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Korzystanie z pętli `for_each` i `count`
- Wbudowane funkcje Terraform
- Wyrażenia warunkowe i splaty
- Dynamiczne bloki dla zagnieżdżonej konfiguracji