Ga naar inhoud

IaC Accelerator

De IaC Accelerator is een compleet, werkend voorbeeld van een infrastructure-as-code-project dat de modules van Managed Templates gebruikt. Het is bedoeld voor teams die nieuw zijn met de bibliotheek of met infrastructure as code. Je kopieert het naar je eigen repository en past het aan. Het verlaagt de drempel en geeft je een structuur, een deploymentpipeline en geautomatiseerde updates van je moduleversies.

Een referentieproject, geen product

De accelerator laat een aanbevolen aanpak zien. Specialistische gevallen zijn niet zijn doel: pas de bestanden aan je behoeften aan. De namen, pool, service connections, subscriptions en registry in de bestanden zijn placeholders die je moet vervangen. Het onderhoudende team test en ondersteunt de accelerator zelf, niet de wijzigingen die jij in je kopie aanbrengt.

Wat erin zit

Onderdeel Terraform Bicep
Projectstructuur Root module per omgeving, een gedeelde main-module, lokale modules Eén main.bicep, één parameterbestand per omgeving, lokale modules
Deploymentpipeline Plan-stage, daarna een apply-stage die op goedkeuring wacht Een optionele what-if-stage, daarna een deploy-stage die op goedkeuring wacht
Geautomatiseerde updates Renovate-configuratie en -pipeline, voor Azure DevOps of GitHub Actions Hetzelfde
Modulebron git::-bron met een versietag Verwijzing naar de container registry met een versie

Wat het deployt

De voorbeeldworkload bestaat uit de volgende resources. Het is een mix van modules, geen aanbevolen architectuur.

Resource Module
Resourcegroep Gewone resource, benoemd met de Azure naming-module (Terraform)
User-assigned identity user_assigned_identity
Log Analytics workspace log_analytics_workspace
Key Vault, met een encryptiekey key_vault
Storage account, versleuteld met de key storage_account
App Service plan en een Linux web app serverfarm, app_service_site_linux
Virtuele Windows-machine virtual_machine_windows
SQL server sql_server
Recovery Services vault met een VM-backuppolicy Lokale code in de accelerator (rsv), geen module uit de bibliotheek

Het voorbeeld verbindt met een bestaande spoke: het zoekt het virtuele netwerk en het subnet op en plaatst de private endpoints daar. De standaardnamen volgen de naamgevingsconventie van het spoke canvas (Naamgeving en tags): wijzig ze als je spoke andere namen gebruikt. Dit betekent dat de accelerator het best werkt in een spoke die het platform voor je heeft aangemaakt (Wat je krijgt).

Structuur

Terraform

environments/          One root module per environment (dev, prod). Entry point, providers, backend, variables.
main/                  Infrastructure for all environments: resources, module calls, data sources.
modules/               Project-specific modules.
pipelines/             terraform.yaml, templates for plan and apply, Renovate pipeline and workflow.
renovate.json          Example Renovate configuration.

Elke map in environments/ is een root module die de gedeelde main-module aanroept met omgevingsspecifieke waarden. Je kunt omgevingen toevoegen door mappen toe te voegen. De structuur laat je ook vanaf een werkstation deployen, via een VPN als resources publieke toegang uit hebben staan. Beslis of je de versiebeperkingen van Terraform in main/terraform.tf instelt of in elke omgeving.

Bicep

main.bicep             The infrastructure, at subscription scope.
dev.bicepparam         Parameters of the dev environment.
prod.bicepparam        Parameters of the prod environment.
modules/               Local modules: the backup vault, and a module that looks up the spoke network.
pipelines/             bicep.yaml, a single-environment template, Renovate pipeline and workflow.
renovate.json          Example Renovate configuration.

Houd gedeelde resources, naamgeving en outputs in main.bicep, en omgevingsspecifieke waarden in de parameterbestanden.

Gebruik het

  1. Kopieer de inhoud van iac_accelerator/terraform/ of iac_accelerator/bicep/ uit de repository van de bibliotheek naar je repository.
  2. Bekijk en pas alle bestanden aan. Zoek naar de TODO-opmerkingen, en naar het repositoryadres (Terraform) of het registryadres (Bicep) dat de bestanden als voorbeeld bevatten. Vervang ze door de jouwe.
  3. Pas de pipelinedefinitie aan op je CI/CD-opzet: agent pool, namen van service connections, subscriptions en de versie van de tool (Terraform of Bicep).
  4. Maak Azure DevOps-environments aan die bij je omgevingsnamen passen (dev, prod) en voeg voor allemaal approvers toe, zodat niets verandert zonder review van het vorige resultaat.
  5. Maak service connections aan op subscriptionscope.
  6. Zorg dat de pipeline de bibliotheek kan lezen: zie Geef de pipeline toegang voor Terraform en Geef een Bicep-pipeline toegang voor Bicep. De Terraform-pipeline bevat de git-stappen al.
  7. Commit, push, voeg het pipelinebestand toe als pipeline in Azure DevOps en draai hem.

Waarden doorgeven vanuit een variable group

Terraform Bicep
Hoe Noem de variable group in het variables-blok en map waarden met de parameter envs, bijvoorbeeld TF_VAR_my_variable: $(variable-group-variable-name) Gebruik variableGroupName voor de groep, secretToEnvMapping voor secrets en bicepAdditionalParams voor gewone waarden
Secrets Markeer ze als secret in de groep en als sensitive in Terraform Markeer ze als secret in de groep en map ze met secretToEnvMapping, zodat ze niet worden gelogd

Waarden die van buiten komen maken het lastiger om de code lokaal te draaien: lever ze dan op een andere manier aan (omgevingsvariabelen of een .tfvars-bestand dat niet wordt gecommit).

De pipelines

Terraform-pipeline

De pipeline heeft de parameters environment (dev of prod) en operation (apply of destroy). De template draait twee stages: een plan-stage en een deploy-stage die alleen draait als het plan wijzigingen bevat. De deploy-stage gebruikt een Azure DevOps-environment, dus de approvers die je instelt moeten hem goedkeuren. De apply gebruikt het opgeslagen plan, en na een apply legt een refresh-only run bijwerkingen van de API vast in de state.

Bicep-pipeline

De pipeline heeft stages voor dev en prod, waarbij prod van dev afhangt. Elke stage kan eerst een what-if draaien (de parameter runWhatIf, standaard uit, omdat de output rommelig kan zijn) en deployt daarna met az deployment sub create. De Bicep-versie wordt uit een pipelinevariabele geïnstalleerd.

Houd modules actueel

De accelerator bevat een Renovate-opzet. Renovate controleert de versies van de modules die je gebruikt (en van de Terraform-providers) en opent een pull request als er een nieuwere versie bestaat. Het leest de Bicep-registryverwijzingen en de Terraform-git::-bronnen met tags van de vorm terraform/<module>/<version>, per module afgebakend, zodat een module nooit een versie krijgt uit de tags van een andere module. Updates worden gegroepeerd per type update.

Zet het als volgt op:

  1. Houd de pipeline of workflow die bij je platform past (Azure DevOps of GitHub Actions) en verwijder de andere.
  2. Vervang de placeholders in renovate.json en in de pipeline (de registry, de repository, de agent pool).
  3. Geef Renovate permissie om branches en pull requests aan te maken. In Azure DevOps zijn dat Contribute en Contribute to pull requests voor de build identity van de pipeline. In GitHub Actions heb je een GitHub App nodig, omdat pull requests die het standaardtoken aanmaakt geen andere workflows starten.
  4. Geef voor Bicep de pipeline toegang tot de registry via een service connection die workload identity federation gebruikt. Geef voor Terraform-modules in een andere repository daar ook leestoegang.
  5. Draai het één keer met dryRun op true. De standaardwaarde is false, en het wekelijkse schema draait het echt. Controleer dat alle bestanden met verwijzingen in het log verschijnen en dat geen enkele dependency een skipReason heeft.
  6. Draai het daarna zonder dry-run. Controleer na de eerste echte run dat een pull request alleen de versiestring wijzigt.

Lees de changelog voordat je merget

Een Renovate-pull request wijzigt de versie, niet je code. Lees de changelog en de upgrade notes bij major versies, en laat je normale pipeline de wijziging eerst in dev testen.