Integratieresources deployen¶
Hoe een workload team integratieresources (Logic Apps, Function Apps, Container Apps, Data Factory) in zijn spoke deployt met de integratiemodules: het spoke outputs-bestand, de configuratie en de herbruikbare deploymentworkflow met zijn veiligheidsregels.
Referentieontwerp
De pipeline in het referentieontwerp is GitHub Actions met een herbruikbare workflow. Jouw platform kan andere tooling of andere namen gebruiken. Vraag je platformteam om de template, de runner group en de te gebruiken release.
Overzicht¶
flowchart LR
a["1. Spoke outputs<br/>one file per environment"] --> b["2. Your configuration<br/>module call + maps"]
b --> c["3. Review and plan<br/>pull request, plan-only run"]
c --> d["4. Manual run<br/>reusable workflow: apply"]
d --> e["5. Deploy your application code"]
Stap 1: haal de spoke outputs op¶
De modules hebben de gegevens van je spoke nodig: resourcegroep, netwerk en subnets, Key Vault, storage account en Log
Analytics workspace. Die staan in een variabelenbestand met één spoke_config-object, één bestand per omgeving, bijvoorbeeld
config/spoke-outputs-<environment>.tfvars. Het is gebaseerd op de outputs van de spoke-deployment, zodat je
configuratie op één lijn blijft met de spoke en je geen waarden overtypt.
spoke_config = {
name = "<workload>-<environment>"
subscription_id = "<subscription-id>"
resource_group_name = "<resource-group>"
location = "West Europe"
tenant_id = "<tenant-id>"
environment = "<environment>"
key_vault_id = "<key-vault-resource-id>"
key_vault_name = "<key-vault-name>"
storage_account_id = "<storage-account-resource-id>"
storage_account_name = "<storage-account-name>"
virtual_network_id = "<vnet-resource-id>"
virtual_network_name = "<vnet-name>"
subnet_ids = { "<subnet-name>" = "<subnet-resource-id>" }
subnet_names = { "<subnet-name>" = "<subnet-name>" }
log_analytics_workspace_id = "<workspace-resource-id>"
log_analytics_workspace_name = "<workspace-name>"
}
De lijst met velden staat op Modules. Vraag je platformteam hoe je spoke dit bestand maakt. Pas de waarden nooit met de hand aan als de spoke verandert: neem de nieuwe outputs over.
Stap 2: schrijf de configuratie¶
Roep de root module aan en vul de maps die je nodig hebt (logic_apps, function_apps met service_plans,
container_apps_environment, data_factories), zie Modules. Geef elke omgeving haar eigen configuratiewaarden
via de variabelenbestanden, en houd de code gelijk.
Stap 3: review en plan¶
Open een pull request en laat die reviewen. Start daarna de deploymentworkflow (stap 4) met apply uitgeschakeld: die draait
terraform fmt, init, validate en plan en toont het plan. Lees het. Je verwacht resources in je spoke, geen wijzigingen
aan resources die je niet hebt aangeraakt en geen onverwachte deletes.
Stap 4: draai de herbruikbare workflow¶
Deployments starten niet automatisch. Een persoon start de deploymentworkflow met de hand en kiest de omgeving en of er wordt toegepast.
Het referentieontwerp biedt een herbruikbare workflow, zodat elke workloadrepository hetzelfde, gereviewde deploymentpad gebruikt. De workloadrepository bevat een kleine aanroeper:
name: Terraform deployment
on:
workflow_dispatch:
inputs:
environment:
description: Environment to plan or deploy
required: true
type: choice
options: [dev, tst, acc, prd]
default: dev
enableApply:
description: Apply the plan
required: true
type: boolean
default: false
runnerGroup:
description: Self-hosted runner group
required: true
type: string
default: <runner-group>
permissions:
actions: read
contents: read
id-token: write
jobs:
deploy:
uses: <organisation>/<platform-repository>/.github/workflows/terraform-deploy.yml@<release-tag>
with:
environment: ${{ inputs.environment }}
enable_apply: ${{ inputs.enableApply }}
runner_group: ${{ inputs.runnerGroup }}
module_owner: <organisation>
module_repository: <module-repository>
secrets:
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
MODULE_GITHUB_APP_ID: ${{ vars.<module-app-id-variable> }}
MODULE_GITHUB_APP_PRIVATE_KEY: ${{ secrets.<module-app-key-secret> }}
| Input | Verplicht | Doel |
|---|---|---|
environment |
ja | Kiest dev, tst, acc of prd en de bijbehorende repository-omgeving |
runner_group |
ja | De self-hosted runner group (runners binnen het netwerk) |
module_owner, module_repository |
ja | Eigenaar en naam van de privé-repository met de Terraform-modules |
enable_apply |
nee | Standaard false. Apply is alleen toegestaan vanaf de main branch. |
terraform_version |
nee | Versie van de Terraform CLI. De herbruikbare workflow heeft een standaardwaarde. |
Secrets en permissies:
- De aanroeper geeft de Azure-aanmeldwaarden (
AZURE_CLIENT_ID,AZURE_TENANT_ID,AZURE_SUBSCRIPTION_ID) door uit de gekozen omgeving. Aanmelden bij Azure gebeurt met OpenID Connect (de permissieid-token: write), niet met een opgeslagen wachtwoord. - Een GitHub App-identity (ID en private key) laat de workflow de privé Terraform-modules downloaden. Configureer de ID als repositoryvariabele en de key als repositorysecret.
- De aangeroepen workflow kan geen permissies verlenen die de aanroeper heeft onthouden, dus
actions: read,contents: readenid-token: writemoeten in de aanroeper staan. De aanroepende repository moet herbruikbare workflows mogen gebruiken uit de repository die ze host.
Veiligheidsregels van de workflow¶
- De gekozen omgeving heeft een backendbestand (
config/<environment>.azurerm.tfbackend) en een spoke outputs-bestand (config/spoke-outputs-<environment>.tfvars) nodig, plus een bestaande repository-omgeving. - Format, init, validate en plan draaien altijd vóór een apply.
- Apply staat standaard uit en wordt geweigerd tenzij de workflow vanaf
maindraait. - Een apply naar
accofprdvereist daarnaast minimaal één required reviewer op die omgeving. - Eén aanroep deployt één omgeving. Promotie en volgorde tussen omgevingen zijn aan jou.
- Pin de workflow op een release tag of commit, niet op een bewegende branch. Je platformteam publiceert en kondigt releases aan.
Stap 5: deploy je applicatie¶
Terraform deployt de lege service. Jij deployt je code met je eigen pipeline: workflows naar een Logic App, code naar een Function App, images naar de registry en daarna een nieuwe revision van een Container App. De resources zijn alleen via private paden bereikbaar, dus je pipeline moet draaien op een runner binnen het netwerk (Build agents).
Na de deployment¶
- Resources kunnen via VNet integration andere resources in de spoke bereiken. Inkomende toegang loopt alleen via een private endpoint.
- Vraag firewallregels aan voor alles buiten je spoke (Aanvragen en wijzigen).
- Wijzig resources die Terraform beheert niet in de portal. De volgende deployment maakt dat ongedaan.