Miałem ostatnio w pracy następującą "sytuację".
Dostaliśmy prostego i małego ficzera do zrobienia:
Umożliwić zalogowanemu użytkownikowi pobranie statycznych plików (jakieś tam pdf'y). Pomysł na wykonanie był prosty - wrzucamy dokumenty do blob storage, użytkownik klika link, uderza do usługi w tej samej chmurze, usługa po otrzymaniu żądania generuje jednorazowy token autoryzujący żądanie, dokleja go do URL'a zwracanego jako location 302.
Nic niezwykłego, ale pech chciał, że było to pierwsze użycie blob storage w takim układzie i usługa przekierowująca żądanie musiała mieć odpowiednie credentials, żeby móc pobierać tokeny. Usługa napisana w Springu, pobiera sobie konfigurację, w tym ten sekretny kod na starcie.
Napisane i zaczyna się wdrażanie, infrastruktura opisana kodem (tutaj arm template), kod zapakowany w kontenery - jedzie pull request, kompliacja automatyczny deploy na dev, jakoś poszło. Lecimy ze środowiskami testowymi - trzeba dodać ten sekret, ale to 5 minut roboty, poszło. Na środowiskach testowych poleżało sobie chwilę, o problemie wszyscy zapomnieli, nadszedł moment wrzucenia na produkcję, jak łatwo można się domyślić - zaczynają dzwonić telefony (tak, usługa, która wykonywała przekierowanie była jednocześnie API gatewayem...). Dojście co się stało zajęło chwilę, dojście jaki konkretnie wpis trzeba dodać chwilę dłużej, w końcu dodanie wpisu i usługa się podniosła.
Jasne, miejsce zaimplementowania usługi było niefortunne, ktoś napisał kod, który wywalał się na niezabezpieczonym null pointerze, ktoś inny go puścił przy review itd.
Zastanawiam się jednak, czy macie jakiś pomysł na upewnienei sie, że takie dane znajdą się na srodowisku docelowym, bo:
- nie moga być w kodzie aplikacji
- nie mogą być w kodzie infrastruktury
- nie mogą być w kontenerach
Czyli trzeba użyć kartki "pamiętaj o dodaniu klucza x do key vaulta y"? Czy da się to jakoś zautomatyzować?