Spoke JSON-naslag¶
Eén JSON-bestand per spoke (één workload in één spoke-omgeving), opgeslagen onder <env-folder>/spokes/.
- Schema:
src/Xebia.Mcp/Files/json/spokeschema.json(JSON Schema draft-07). - Consumer:
src/Xebia.Mcp/Files/terraform/spoke-canvas/deploy/spoke/(locals.tf,main.tf).
Verpl. = verplicht volgens het schema. Gebruikt = gelezen door de Terraform. Velden die wel in het schema staan maar niet worden gebruikt, zijn gemarkeerd als no effect.
Zie Nieuwe spoke voor de walkthrough van een nieuw bestand. Instellingen die voor alle spokes gelden (tenant, regio's, IPAM-pools, PIM-profielen) staan in Spoke common settings.
Hoogste niveau¶
| Veld | Type | Verpl. | Beschrijving |
|---|---|---|---|
workloadShortName |
string, max 6 | ja | Korte workloadcode. Wordt gebruikt in resourcenamen, groepsnamen en de state key. Wijzig dit niet na aanmaak. |
environment |
string | ja | dev, tst, test, acc, acc<n>, prd, prod, shrd, shared. De pipeline groepeert ze in de stages dev / tst / acc / prd / shared, maar namen en de state key gebruiken de ruwe waarde. Wijzig dit niet na aanmaak. |
azureSubscriptionId |
string | ja | ID van een bestaande subscription (zie Nieuwe spoke). |
azureSubscriptionName |
string | ja | De subscription wordt hernoemd naar deze naam. Als het leeg is, wordt SpokeCommon.tenantinfo.SubsciptionNamingTemplate gebruikt. |
managementGroupId |
string | ja | Naam van de management group (niet de volledige ID), bijvoorbeeld cloudplatform-landingzones-corp. Moet een id zijn in <env-folder>/<targetRegions.primary>/foundation.auto.tfvars (config test). |
subType |
string | nee | No effect. |
resourceGroup.name |
string/null | nee | Overschrijft de naam van de resource group rg-canvas-<wl>-<env>-<region>-001. |
tags |
object | ja | Verplichte keys: owner, department, workload, pii (yes/no), costcentre, environment. Extra keys zijn toegestaan. Toegepast op de subscription en de canvas-resources, plus spoke_canvas_version. De deployment voegt ook een gereserveerde tag hidden-XebiaSpokeMetadata toe met JSON-gecodeerde metadata uit het spoke-bestand. Zet die tag niet in het bestand. |
adInfo |
object | ja | Identiteit, zie hieronder. |
targetRegions.primary |
string | ja | Korte regionaam, bijvoorbeeld weu. |
targetRegions.additional |
array | ja | Extra regio's ([] voor geen). |
azdo |
object | nee | Maakt een Azure DevOps-repo en service connection aan. Laat de key helemaal weg om dit over te slaan; null faalt op het schema. Zie Spoke-integraties. |
extensions |
object | nee | Het schema staat alleen apim, acr, servicebus, eventhub toe, elk als { "enabled": bool }. Ze gebruiken de gedeelde services in mcp.json SpokeCommon.shared_services (wat elke extensie inricht). De Terraform leest ook extensions.github (zie Spoke-integraties) en extensions.integrations, maar het schema van sommige versies wijst deze af. servicebus.enabled: true heeft group-name keys nodig die het schema afwijst, dus het kan de config test op dit moment niet halen (Bekende problemen). |
resourceconfiguration |
object | ja | Resources, zie hieronder. |
adInfo¶
| Veld | Type | Verpl. | Beschrijving |
|---|---|---|---|
ProductTeamGroupNames |
string[] | ja | Weergavenamen van bestaande Entra ID-groepen die via de spoke-groepen toegang krijgen. |
PIMGroupConfig.Readers / .Contributors / .Owners |
enum | ja | nopim = actief lidmaatschap, self-approve = PIM-eligible zonder goedkeuring, approval = PIM-eligible met goedkeuring. De profielen worden gedefinieerd in pim_configurations (common settings). De Support-groep is niet configureerbaar: de deploymentlogica stelt die altijd in (RBAC en PIM). |
ad_OwnersMembers, ad_OwnersMembersUPN |
string[] (e-mail / UPN) | nee | Initiële owners van de spoke-groepen. Samen met de deployment-identiteit en de spoke SPN worden ze owners van alle vier spoke-groepen, alleen bij aanmaak (ignore_changes). |
ad_ReadersMembers, ad_ReadersMembersUPN |
array | nee | Worden leden van de Readers-groep, alleen bij aanmaak. |
ad_EngineersMembers, ad_EngineersMembersUPN |
array | nee | No effect (wordt gelezen, maar niet toegepast op een groep). |
PIMAssignments |
object | nee | Override per spoke van de RBAC-rolmap, met de exacte Azure-rolnaam als key, met levels en/of pim_profile. Zie RBAC en PIM voor spokes. |
SPNGraphPermissions |
string[] | nee (niet in schema) | Microsoft Graph app roles die aan de spoke service principal worden toegekend. |
SupportManagementInfo |
object | nee | No effect (niet gelezen door de Terraform). |
resourceconfiguration.network[]¶
| Veld | Type | Verpl. | Beschrijving |
|---|---|---|---|
name |
string | ja | VNet-naam. De placeholders ##wlshortname##, ##environment## en ##region## worden vervangen. |
region |
string | ja | Korte regionaam van dit VNet. |
addressPrefix |
string[] (CIDR) | ja, tenzij ipamPool wordt gebruikt |
Adresruimte van het VNet, bijvoorbeeld 10.20.4.0/23. Geen controle op overlap. Sluit ipamPool uit. |
ipamPool |
string | nee | Naam van een IPAM-pool uit networking.ipam_pools in de common settings. Gebruik in plaats van addressPrefix. Zie hieronder. |
numberOfIpAddresses |
number | nee | Grootte van het blok dat uit de pool wordt toegewezen, bijvoorbeeld 256 voor een /24. Alleen met ipamPool. Default 256. |
peerHub |
bool | ja | De virtual hub connection aanmaken (standaard true). |
dnsServerOverwrite |
string | ja | "" = gebruik de hub DNS-server van de regio. Anders een IP. |
InternetSecurityEnabled |
bool | nee (niet in schema) | internet_security_enabled op de hub connection (standaard true: internet via de hub firewall). |
overwritePeeringConnectionName |
string | nee | Overschrijft de naam van de hub connection (standaard: VNet-naam met vnet- → con-). |
useIPAM |
bool | nee | No effect. |
subnets[] |
array | ja | Zie hieronder. |
networksecuritygroups[] |
array | ja | { name, rules[] }. Een NSG wordt door subnets aangeduid met dezelfde name. Wijzig de priority van een bestaande regel niet (die wordt opnieuw aangemaakt, wat kan mislukken): voeg een nieuwe regel met een nieuwe naam en prioriteit toe en verwijder de oude regel later. Elke regel vereist name, priority (string), direction, access, protocol (*, Tcp, Udp, Icmp, Ah, Esp), source_port_range, destination_port_range, source_address_prefix, destination_address_prefix. Regelnamen moeten uniek zijn en zeggen waar de regel voor dient. priority is uniek per NSG, van 100 tot 4096 (lager is hogere prioriteit). Poorten zijn 1 tot 65535, een bereik (2048-2055) of een lijst (80,443). Adresprefixes zijn een CIDR, een bereik of een service tag. |
routetables[] |
array | ja | { name, routes[] }. Een route is { name, properties: { addressPrefix, nextHopType, nextHopIpAddress } }. nextHopType is een van VirtualNetworkGateway, VnetLocal, Internet, VirtualAppliance, None. |
subnets[]¶
| Veld | Type | Verpl. | Beschrijving |
|---|---|---|---|
name |
string | ja | Placeholders worden vervangen. |
addressPrefix |
string (CIDR) | ja, tenzij een IPAM-pool wordt gebruikt | Moet binnen de adresruimte van het VNet liggen. Sluit ipamPool en numberOfIpAddresses uit. |
ipamPool |
string | nee | Alleen nodig als het subnet uit een andere pool moet komen dan zijn VNet. Subnets erven de pool van het VNet. |
numberOfIpAddresses |
number | ja voor een subnet dat een pool gebruikt | Grootte van het subnet, bijvoorbeeld 16 voor een /28. Een subnet heeft geen default. |
isprivatelinksubnet |
bool | ja | Subnet bedoeld voor Private Endpoints. Elk network[]-item heeft minstens één subnet met true nodig; het eerste wordt gebruikt voor de private endpoints van de Key Vault en storage van de spoke. Wijs hier één subnet voor aan. |
privateEndpointNetworkPoliciesEnabled |
bool | ja | true → Enabled. Anders RouteTableEnabled voor private link-subnets, en anders Disabled. |
privateLinkServiceNetworkPoliciesEnabled |
bool | nee | |
serviceEndpoints |
[{ "service": "<name>" }] |
ja | Bijvoorbeeld Microsoft.Storage, Microsoft.KeyVault. |
delegations |
[{ "name", "actions": [] }] |
ja | name uit de lijst in het schema (66 waarden, bijvoorbeeld Microsoft.Web/serverFarms, Microsoft.App/environments, Microsoft.DBforPostgreSQL/flexibleServers). |
linkedroutetablename |
string/null | ja | Naam van een route table in routetables[], of null. Recente versies hebben geen extra routes nodig, dus een route table hoort een uitzondering te zijn. |
linkednetworksecuritygroupname |
string | nee | Naam van een NSG in networksecuritygroups[]. Leeg → er wordt een standaard-NSG aangemaakt en gekoppeld. |
Adresruimte uit een IPAM-pool¶
In plaats van adresprefixes hard te coderen kan een spoke adresruimte vragen aan een Azure Virtual Network Manager IPAM-pool. Alleen de poolnaam en de grootte worden geconfigureerd. Azure kiest de adressen.
"network": [
{
"name": "vnet-##wlshortname##-##environment##-##region##-001",
"region": "weu",
"ipamPool": "dev-weu",
"numberOfIpAddresses": 512,
"peerHub": true,
"dnsServerOverwrite": "",
"subnets": [
{
"name": "snet-##wlshortname##-default-##environment##-##region##-001",
"isprivatelinksubnet": false,
"numberOfIpAddresses": 256,
"privateEndpointNetworkPoliciesEnabled": false,
"serviceEndpoints": [],
"delegations": [],
"linkedroutetablename": null,
"linkednetworksecuritygroupname": ""
}
],
"networksecuritygroups": [],
"routetables": []
}
]
Regels:
- De poolnaam moet bestaan in
networking.ipam_poolsvan de common settings. Anders faalt het plan en toont het de beschikbare namen. addressPrefixenipamPoolsluiten elkaar uit, voor een VNet en voor een subnet.- Een VNet zonder
numberOfIpAddresseskrijgt 256 adressen. Elk subnet moet zijn eigen grootte opgeven. - Een subnet erft de pool van zijn VNet. Om
numberOfIpAddressesvragen onder een VNet met een hardgecodeerdeaddressPrefixlaat het plan falen, omdat er geen pool is om uit toe te wijzen. - De adressen zijn niet bekend als je het bestand schrijft. Schrijf NSG-regels en routes tegen service tags of de
VirtualNetwork-tag, niet tegen letterlijke CIDR's. - De toegewezen bereiken staan in de deployment-output:
networking.virtualnetwork.<vnet>.resVirtualNetworkAddressSpaceenresAllSubnets.
Optionele resourceblokken¶
Als een blok ontbreekt, gelden de defaults in de Terraform. Storage account, Key Vault en Log Analytics worden standaard gedeployed. Als een blok aanwezig is, moeten alle door het schema verplichte keys aanwezig zijn.
| Blok | Verplichte keys als het blok aanwezig is | Opmerkingen |
|---|---|---|
storageaccount |
EnablePublicAccess, CreatePrivateEndpoint, AccountReplicationType, AccessTier (Cool/Hot/Premium), AccountKind, AccountTier, infrastructure_encryption_enabled, allow_nested_items_to_be_public |
Optioneel: deploy (standaard true), name, PrivateEndpointList (blob, queue, file, table, dfs, web), EnableSAS, Containers. Een storage account forceert een Key Vault (customer-managed key). |
keyvault |
enablepublicaccess, createprivateendpoint, EnableRBACAuthorization (moet true zijn), SKUName, SoftDeleteRetentionInDays, EnabledForDeployment, EnabledForDiskEncryption, EnabledForTemplateDeployment |
Optioneel: deploy (standaard true), name. |
loganalytics |
deploy, sku, RetentionInDays, AllowResourceOnlyPermissions |
Optioneel: name. forwardactivitylog heeft geen effect. |
networkwatcher |
deploy |
Standaard false. |
privatedns |
– | name: maakt een private DNS zone aan die is gekoppeld aan het VNet van de hub DNS resolver. null = geen. |
Defaults en opmerkingen¶
| Instelling | Default of opmerking |
|---|---|
Storage account EnablePublicAccess |
false. true hoort een uitzondering te zijn. |
Storage account / Key Vault CreatePrivateEndpoint |
true. false hoort een uitzondering te zijn. |
AccountReplicationType, AccessTier, AccountTier |
ZRS, Hot, Standard |
PrivateEndpointList |
Alleen namen in kleine letters. Eén private endpoint per genoemd subtype. |
Containers |
Lijst met containernamen die in het storage account worden aangemaakt (bijvoorbeeld een voor Terraform state). |
Key Vault SoftDeleteRetentionInDays |
30. Toegestaan 7 tot 90. |
Key Vault deploy: false |
Geen Key Vault en geen private endpoint, en er wordt geen service principal-secret opgeslagen. Wordt genegeerd (geforceerd naar true) zolang het storage account wordt uitgerold. |
Storage account deploy: false |
Geen storage account en geen private endpoints. |
loganalytics.deploy |
true. false hoort een uitzondering te zijn. |
| Network watcher | Eén per regio als hij is ingeschakeld, in een eigen resource group, niet in de canvas-resource group. |
azdo¶
| Veld | Beschrijving |
|---|---|
projectName |
Bestaand Azure DevOps-project |
repoName |
Aan te maken repository (##wlshortname## en ##environment## worden vervangen) |
serviceConnectionName |
Aan te maken Azure RM service connection voor de spoke SPN (##wlshortname## en ##environment## worden vervangen) |
useFederatedCredentials |
true = workload identity federation in plaats van een secret Er wordt geen secret gegenereerd of in de Key Vault opgeslagen, en er wordt een federated credential aangemaakt op de app registration. Default false. Niet in het schema van sommige versies, wel gelezen door Terraform. |
Wat de deployment met dit blok doet, en het GitHub-equivalent: Spoke-integraties.