Na blogu Hued.me pisałem ostatnio o Infrastructure as a Code (IaC). Przedstawiałem, czym charakteryzuje się to podejście do zarządzania infrastrukturą, omawiałem jego zalety oraz po krótce opisałem trzy narzędzia, które uważam za kluczowe w tworzeniu IaC: ARM, BICEP i Terraform. Dzisiaj przygotowałem ich szczegółowe porównanie oraz subiektywną ocenę. Oczywiście nie są to jedyne warte uwagi rozwiązania pozwalające na tworzenie infrastruktury w kodzie, jednak moim zdaniem stanowią one solidne podstawy umożliwiające poruszanie się w tym temacie.
Co trzeba wiedzieć o ARM, BICEP i Terraform
Zacznijmy od tego, że ARM i BICEP pochodzą od Microsoftu, a Terraform od HashiCorp. Nie dziwi więc, że BICEP pod wieloma względami jest formą ewolucji ARM-a. Co ciekawe, ma on także sporo wspólnego z Terraformem. Ogólnie, wszystkie trzy narzędzia mają wiele cech pochodzących z rozmaitych rozwiązań, które się przeplatają. Możemy zauważyć to np. podczas porównywania trzech różnych plików – widać wtedy jak na dłoni, że język BICEP jest hybrydą i Terraforma, i ARM-a.

Ponadto sądzę, że BICEP to taki JSON w formie YML-a przypominający na pierwszy rzut oka C#. Dzięki takiemu porównaniu łatwiej sobie wyobrazić, z jakich funkcjonalności korzysta ten język. Nikogo nie zaskoczę, jeśli dodam, że ARM jest pisany w JSON-ie, a Terraform łudząco przypomina YML. Widać więc, że poszczególne narzędzia mocno czerpią zarówno od siebie nawzajem, jak i od zewnętrznych tworów, dzięki czemu programiści mogą łatwiej odnaleźć się w korzyściach języków z ulepszeniami od dostawcy. Najbardziej podobne są do siebie rozwiązania proponowane przez Microsoft, czego firma używa jako karty przetargowej. Twierdzą, że ci, którzy znają ARM-a, nie będą mieli żadnego problemu z przerzuceniem się na BICEP, i odwrotnie. W ten sposób zachęcają programistów do odstawienia na bok Terraforma.
Dodatkowo, różnice w strukturze wszystkich trzech narzędzi możecie zobaczyć na moim githubie.
Szczegółowe porównanie ARM, BICEP i Terraform
Omawiane przeze mnie narzędzia z jednej strony są bardzo do siebie podobne, a z drugiej dzielące je różnice z punktu widzenia specjalisty mają ogromną wagę. Aby łatwiej było się w tym wszystkim odnaleźć, przygotowałem tabelę, w której porównuję kluczowe z mojej perspektywy aspekty poszczególnych opcji.
ARM | BICEP | TERRAFORM | |
MultiCloud | Nie | Nie | Tak |
Support | Przez Microsoft | Przez Microsoft | Przez Microsoft |
Poziom wejścia | Bardzo łatwy | Łatwy | Trudny |
Poziom skomplikowania przy małych projektach | Mały | Średni | Średni++ |
Poziom skomplikowania przy dużych projektach | Bardzo duży | Średni | Mały |
Utrzymanie kodu i czytelność | Trudna | Łatwa | Łatwa |
Gotowy na nowości | Od razu | Od razu | Po czasie |
Możliwość deploy poprzez portal Azure | Tak | Nie | Nie |
Możliwość generwania kodu przez portal | Tak | Nie | Nie |
Możliwość wizualizacji bez zewnętrznych narzędzi | Tak | Tak | Nie |
Click and deploy | Tak | Nie | Nie |
Multiplaform | Tak | Tak | Tak |
Czytelność kodu (subiektywnie) | Zła | Dobra | Bardzo dobra |
Azure CLI | Tak | Tak | Tak |
Dokumentacja | Średnia dla nowych osób | Dobra | Bardzo dobra |
Domyślne zależności pomiędzy komponentami | Nie | Tak | Tak |
CI/CD | Full | Full | Full |
Łatwość stworzenia CI/CD | Bardzo prosto | Bardzo prosto | Może być trudno |
Subiektywna ocena ARM, BICEP i Terraform
Zamieszczone porównanie pozwoli każdemu z Was dopasować odpowiednie narzędzie do swoich potrzeb. Podzielę się jeszcze kilkoma spostrzeżeniami, jakie wynikają z mojego doświadczenia, a które trudno było ująć w tabeli.

ARM
Nadaje się on idealnie do bardzo szybkiego rozpropagowania deploymentu na różnych subskrypcjach pomiędzy użytkowników, dlatego świetnie sprawdza się np. na warsztatach. Dzięki funkcji „Click and Deploy” korzystający mają możliwość uzyskania lustrzanej infrastruktury dzięki podejściu IaC
BICEP
Trochę popracowałem z tym językiem i choć wdrożenie jest rzeczywiście bardzo szybkie dla kogoś, kto znał już ARM-a, to jednak takie połączenie YML z JSON-em i C# do mnie nie przemawia. Niby próg wejścia jest znacznie niższy, ale w kontekście aplikacji, które prowadzę, sądzę, że Terraform jest dużo lepszą opcją.
Terraform
Terraform raczej nie sprawdzi się na warsztatach, ale już w projektach zewnętrznych lub wewnętrznych jak najbardziej. Bardzo przyjazna w odbiorze dokumentacja i możliwość tworzenia kolejnych zasobów w chmurze to jego dwie mocne zalety. Jeśli miałbym wskazać jakieś słabe strony Terraforma, to powiedziałbym, że wsparcie procesu CI/CD nie jest rozwijane przez Microsoft, więc musimy korzystać ze skryptów w Bash-u lub PowerShell-u. Co prawda istnieją gotowe taski w pipelinach dla Terraforma, ale obsługują one tylko podstawowe user-case.
ARM, BICEP, Terraform – które narzędzie jest najlepsze?

Podczas tworzenia Infrastructure as a Code mamy naprawdę szeroki wachlarz możliwości, jeśli chodzi o dostępne narzędzia. W tym deklaratywnym podejściu do zarządzania infrastrukturą najważniejsze jest określenie celu, do jakiego dążymy. Reszta jest zautomatyzowana i bardzo uproszczona, jednak i tak wymaga od programistów znajomości i dopasowania odpowiednich rozwiązań. Z moich doświadczeń wynika, że ARM, BICEP i Terraform są zdecydowanie godne uwagi. Rozwiązania Microsoftu polecam do zastosowania na warsztatach (choć bardziej ARM niż BICEP), natomiast Terraform sprawdzi się w innych projektach. Ale oczywiście wszystko zależy od tego, czego w danej chwili potrzebujemy.
Last modified: 7 września 2022