Jak podnítit inovaci s využitím Azure, mít věci pod kontrolou co do bezpečnosti a nákladů a přitom se neuklikat k smrti? Podívejme se jak automatizovat vznik sandboxů včetně řízení přístupů, vytvoření budgetů i automatizované reakce na jejich překročení a to včetně odmazání prostředků. To vše řízené jednou šablonou pro všechny sandboxy a udělal jsem ji rovnou ve třech provedeních - Bicep, Terraform a Pulumi, stačí si vybrat.
Tady jsou základní výchozí předpoklady pro jednoduché řešení sandboxů ve firmě:
Technické řešení takového zadání je následující:
Vytvořil jsem řešení pro tři způsoby automatizace - nativní Bicep, multi-cloudový Terraform používající DSL a na standardním programovacím jazyce postavené Pulumi.
Kompletní řešení najdete v tomto repozitáři vždy v adresáři sandbox (subscriptions je něco jiného a k tomu jindy): https://github.com/tkubica12/governance-automation/
Klíčem k ovládání celého řešení je sepsání jednotlivých sandbox prostředí. Stačí tedy přidat sandbox s potřebnými parametry do seznamu, který jsem ve všech řešení pojal stejně:
var sandboxes = [
{
name: 'research1'
ownerId: '7424fb4c-5e9f-45cd-9f7d-453d45655e75' // tokubica
ownerEmail: 'tomas.kubica@microsoft.com'
monthlyBudget: 100
}
{
name: 'research2'
ownerId: '7424fb4c-5e9f-45cd-9f7d-453d45655e75' // tokubica
ownerEmail: 'tomas.kubica@microsoft.com'
monthlyBudget: 80
}
{
name: 'research3'
ownerId: '7424fb4c-5e9f-45cd-9f7d-453d45655e75' // tokubica
ownerEmail: 'tomas.kubica@microsoft.com'
monthlyBudget: 5
}
]
Pro přidání nového projektu ho tedy stačí přidat do seznamu a pro odebrání ho jednoduše ze seznamu odstranit.
V tomto konkrétním případě narazíme u Bicep na některá omezení. Nedá se jednoduše udělat nahrání souboru do storage jako součást deploymentu - musel bych použít deploymentScripts a to je úplně zbytečně kostrbaté. Jde jen o zdrojový kód pro Azure Function a ten může sedět už dopředu třeba na GitHubu, ale pro srovnání jsem připravil Azure CLI skript pro nahrání do Azure Blob Storage. Terraform i Pulumi mohou tohle udělat přímo při deployment a také jsem to tam takhle použil.
Druhý a asi důležitější rozdíl je, že Bicep/ARM neumožňuje použít mode Complete na subscription scope, jinak řečeno nedokáže odmazat zdroje, které ze šablony odstraníte automaticky (na rozdíl od zdrojů v resource group, kde to podporuje) - a to se nás týká, protože budget a resource group vzniká na subscription scope. Pro Bicep variantu tedy budete muset odmazávat sandboxy třeba skriptem. U Terraform a Pulumi tohle není problém, protože si drží state bokem a stačí vyhodit sandbox ze seznamu a postarají se o jeho likvidaci.
Ještě zbývá dořešit jednu nepříjemnost. Při zakládání budgetu musí být určen start čas a ten musí být na začátku aktuálního měsíce. Zatím to je v kódu dané natvrdo a plánuji to vyřešit. Finta bude v tom tohle vygenerovat automaticky, ale pokud už budget existuje, tak tohle políčko ignorovat (tedy nepřenasazovat budget kvůli změně start času, což nechceme). V Pulumi to bude jednoduché, mám plný programovací jazyk. U Terraform to tak přímočaré asi nebude a u Bicep asi nezbude než to dát jako vstupní parametr a vyřešit při spouštění.
Pro práci se sandboxy bych volil Terraform nebo Pulumi. Být to před měsícem, Terraform by ještě budgety neuměl a Pulumi by vítězilo - ostatně to je jeho velká výhoda proti Terraformu. Jak řešíte sandbox vy a jakou máte strategii? Pinkněte mi na LinkedIn.