Po tym, co piszesz, to odnoszę wrażenie że firma w której pracowałeś to chyba jakiś lokalny sklep internetowy na Podlasiu.
W większych korporacjach wygląda to inaczej. Opiszę Ci swoją argumentację.
Wrażenie możesz mieć, ale już pisałem, że widziałem takie podejście m.in. w bankach (a pracowałem w kilku jako konsultant właśnie przy wdrażaniu platform chmurowych).
Mając moduły Terraformowe, które pod spodem mają swoją logikę do stawiania klastra np. Kubernetesa, czy Redis'a, czy Gatewaya zespół DevOpsowy w pewien sposób jest stanie nakreślić standardy które panują w firmie. Moduł w Terraformie wygląda tak, że zazwyczaj podaje się zestaw parametrów wejściowych i dostaje się parametry wyjściowe. Ewentualnie lekkie dokonfigurowanie czegoś np. Identity, czy użytkownika, czy coś innego. Dane moduły są przechowywane na Githubie np. przestrzeni
Pawel6G - Infra - Modules.
W tej przestrzeni składowane są repozytoria z tymi modułami, do których zazwyczaj commitują goście z Clouda/Infrastruktury i udostępniają je całej firmie.
Następnie gdy dołącza nowy zespół to od razu wchodzi sobie w przestrzeń Pawel6G - Infra - Modules i widzi jakie moduły są.
Gdyby każdy zespół w firmie miał tak robić jak Ty opisałeś, to pomyśl ile firma by straciła pieniędzy globalnie xD Niezły z Ciebie biznesmen.
Dodatkowo, dzięki takiemu podejściu w firmie każdy zespół ma utarte standardy DevOpsowe i łatwo np. pracownikom przechodzić z zespołu do zespołu, czy podjąć jakieś zastępsto.
Fajnie, ale ja nigdzie nie pisałem, że podejście ze współdzielonymi jedynymi słusznymi modułami nie działa i nie ma zalet, tylko że ja takiego podejścia nie lubię. Tak samo jak bym nie lubił podejścia gdzie masz jedyną słuszną bibliotekę do logowania, obsługi kolejek, cacheowania czy czegoś podobnego utrzymywaną przez jakiś centralny zespół i jak ci czegoś brakuje to pisz tickety i czekaj dniami/tygodniami aż zaimplementują coś co sam byś sobie zrobił w kilka godzin.
A podejścia z takimi modułami nie lubię, bo żeby obsłużyć potrzeby wielu różnych zespołów zazwyczaj i tak kończy się na tym, że taki moduł nie wprowadza jakiejś zbyt dużej abstrakcji nad modułem dostarczonym przez provider Terraformowy dla danej chmury. Jak już wspomniałeś o Redisie to zobacz sobie na możliwości konfiguracji Redisa w Azure i powiedz co tam jest takiego trudnego, że centralny moduł będący przykryciem tego wbudowanego by wnosił jakąś wielką wartość? https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/redis_cache Większość tego co jest dostępne do skonfigurowania i tak by musiało być wystawione jako parametry xD Ewentualnie co by mogło zostać ukryte to jakieś konfiguracje security typu wersja TLS, wymaganie szyfrowania ruchu albo włączony/wyłączony dostęp publiczny (całe 3 propertiesy będące boolem, albo enumem). Tylko marny według mnie wtedy z takiego modułu pożytek, jak tą poprawną konfigurację i tak zapewnisz (bo musisz) politykami po stronie chmury.
Kolejne jest to, że i tak nie wymusisz na każdym stosowania tych modułów (a przynajmniej ja nie znam sensownego sposobu żeby to zrobić, gdzie nawet jakbym znał to bym tego nie chciał robić ), więc na potrzeby standaryzacji i spełnienia wymogów pod kątem security/compliance i tak potrzebujesz mieć zaimplementowane chmurowe polityki governance.
Chcą postawić klaster k8s na swojej subskrypcji AWSowej? Biorą dany moduł, czytają dokumentacje, ustawiają parametry wejściowe, puszczają na pipeline i mają cluster postawiony w 20 minut.
Czyli mniej więcej wygląda to wtedy tak samo jak w sytuacji gdy nie masz swojego modułu tylko korzystasz z modułu dostarczonego przez providera dla danej chmury. Wchodzisz do dokumentacjij, ustawiasz parametry wejściowe, puszczasz pipeline i w 20 minut masz klaster.
Dodatkowo, gdy wyjdzie jakaś luka podatności bezpieczeństwa to jak masz 50 zespołów to jak to wystarczy by tylko w centralnym module ją załatać i globalnie podbić dla wszystkich zespołów dany moduł.
Nie wiem jak chcesz to globalnie podbić, ja jestem zwolennikiem podejścia gdzie to zespoły aplikacyjne odpowiadają za szablony IaC dla swojego projektu, więc co najwyżej mógłbyś ich poinformować że jest nowa wersja modułu i niech podbijają po swojej stronie. Ale wtedy dokładnie to samo mógłbyś zrobić nie mając swoich modułów
Poza tym, patrząc że w IaC zazwyczaj deklaratywnie na dość wysokim poziomie abstrakcji definiujesz co ma się wytworzyć, to tak na szybko nie wiem o jakich lukach bezpieczeństwa mówisz. Bo jak to luka od strony usługi to dostawca chmury zazwyczaj to poprawi sam po swojej stronie bez twojej ingerencji, a jak to niepoprawne skonfigurowanie usługi i wymaga to np. zmiany jakiegoś propertiesa konfiguracyjnego to tak samo ogarniesz to mając własny moduł albo go nie mając bo:
- albo chcesz to każdemu od razu nadpisać na poprawną konfigurację - wtedy szybciej to zrobisz polityką chmurową która na
non-compliant
zasobach odpali akcję remediation
i przestawi co trzeba
- albo nie możesz tego każdemu na chama nadpisać bo to np. potencjalnie jakiś breaking change i puszczasz komunikację, że jest nowa wersja modułu która poprawia to i to i łaskawie albo zespoły szybko podbiją wersję albo będą z tym czekać kwartał, wypadałoby wtedy śledzić kto już przestawił a kto nie i nie dopuszczać nowych deploymentów z popsuta wersją, więc i tak skończy się na tym że zaimplementujesz chmurową politykę governance w trybie audytowania
Jeszcze raz pomyśl sobie jak masz zespołów 50 devowych i daj im wolną amerykankę by sobie infrę robili w czym tam chcą xD A potem zapanuj nad tym.
Teraz zastanów się, przejdź na spokojnie wokół bloku i przemyśl moje rozwiązanie o którym napisałem zamiast je negować.
A pomyśl co się stanie jak każdy zespół będzie mógł od strony kodu pisać w różnych językach i używać dowolnych bibliotek, a nie tylko tych jedynych słusznych.
A nie, czekaj. Nic się nie stanie i zazwyczaj tak to wygląda, że nie masz jedynego słusznego stacku we wszystkich projektach.