Infrastruktur (Bicep)

Aufbau des Bicep-Deployments: Module und Parameterfluss, Ressourcen, App-Settings der Function App, Managed Identity und Rollen, Alerts, Marketplace-Artefakte.

Einstiegspunkt ist bicep/main.bicep. Das Deployment läuft im Scope einer bestehenden Resource Group (Bicep-Default, kein explizites targetScope), im Modus Incremental. Die Parameter aus Anwendersicht sind unter Installation beschrieben; hier geht es um den inneren Aufbau.

Module und Parameterfluss

flowchart TD
    MAIN["main.bicep"]

    SA["storageaccount.bicep"]
    AI["applicationinsights.bicep"]
    ASP["appserviceplan.bicep"]
    SB["servicebus.bicep"]
    ALERT["metricalerts.bicep<br/>if enableAlerts"]
    DASH["dashboard.bicep<br/>if enableGrafanaDashboard"]
    FUNC["azurefunction.bicep"]
    ROLES["roleassignments.bicep<br/>if enableManagedIdentity"]

    MAIN --> SA & AI & ASP & SB & ALERT & DASH & FUNC & ROLES

    SA -->|"id, name"| FUNC
    AI -->|"connectionString, id"| FUNC
    AI -->|"id"| DASH
    ASP -->|"id"| FUNC
    SB -->|"authorizationRuleId, name"| FUNC
    SB -->|"id"| ALERT
    FUNC -->|"principalId"| ROLES
    SA -->|"id"| ROLES
    SB -->|"id"| ROLES

Die Abhängigkeiten ergeben sich über Modul-Outputs, es gibt keine Zyklen. Zusätzlich legt main.bicep ein leeres Tracking-Deployment für die Microsoft-Partner-Attribution an.

Ressourcen

RessourceTypSKU / EigenschaftenModul
Storage Account st<name>Microsoft.Storage/storageAccountsStorageV2, Standard_LRS, TLS 1.2storageaccount
Table Service mit vier Tabellen…/tableServices/tablesconnections, jobs, mappings, watermarkstorageaccount
Application Insights appi<name>Microsoft.Insights/componentsRetention 90 Tage, klassisch (ohne eigenen Log-Analytics-Workspace)applicationinsights
App Service Plan asp<name>Microsoft.Web/serverfarmsY1 (capacity 0) oder EP1–EP3, Windowsappserviceplan
Service Bus Namespace sb<name>Microsoft.ServiceBus/namespacesBasicservicebus
Sieben Queues…/namespaces/queuessiehe untenservicebus
Authorization Rule sbexportFunction…/authorizationRulesSend + Listenservicebus
Function App func<name>Microsoft.Web/siteskind functionapp, FTPS only, netFrameworkVersion 10.0, System-Identity immer aktivazurefunction
Grafana-DashboardMicrosoft.Dashboard/dashboardseingebettete JSON-Definitiondashboard
Action Group + fünf Metric AlertsMicrosoft.Insights/actionGroups, metricAlertsnur mit enableAlertsmetricalerts, dlqmetricalert
RollenzuweisungenMicrosoft.Authorization/roleAssignmentsnur mit enableManagedIdentityroleassignments

Queues

Alle Queues haben deadLetteringOnMessageExpiration = true, TTL defaultMessageTimeToLive (Default P14D) und lockDuration (Default PT30S).

QueueZweckMaxDeliveryCount
sbqhighexport, sbqexport, sbqlowexportVerarbeitung nach PrioritätmaxDeliveryCount (Default 3)
sbqtransitivehigh, sbqtransitivestandart, sbqtransitivelowAblage bei Konflikten im Ziel (HTTP 409); kein TriggermaxDeliveryCount × 2
sbqignoredVeraltete Nachrichten bei SkipOutdatedMessages; kein TriggermaxDeliveryCount

Die Schreibweise standart ist in Code und Bicep konsistent und darf nicht geändert werden, weil bestehende Deployments die Queue unter diesem Namen besitzen.

App-Settings der Function App

SettingQuelle
APPLICATIONINSIGHTS_CONNECTION_STRINGOutput des AI-Moduls
AzureWebJobsStorage bzw. AzureWebJobsStorage__accountNameKey-basiert per listKeys() oder identitätsbasiert, je nach enableManagedIdentity
ExportQueueServiceBus bzw. ExportQueueServiceBus__fullyQualifiedNamespaceanalog für den Service Bus
TARGET_BASED_SCALING_ENABLED0, nur im schlüsselbasierten Modus (ohne enableManagedIdentity)
WEBSITE_CONTENTAZUREFILECONNECTIONSTRINGimmer key-basiert (Content Share)
FUNCTIONS_EXTENSION_VERSION, FUNCTIONS_WORKER_RUNTIME~4, dotnet-isolated
WEBSITE_RUN_FROM_PACKAGE1
GetChangesTimerExpressionParameter, Default */15 * * * * *
SkipOutdatedMessagesParameter, Default false
TELEMETRY_CONTROL, TELEMETRY_INFO_SAMPLE_RATE, TELEMETRY_DEPENDENCY_SAMPLE_RATE, TELEMETRY_DEPENDENCY_SLOW_MSParameter, siehe Logging
AzureWebJobs.<Name>.Disabledaus dem Array disabledFunctions

alwaysOn wird nicht gesetzt. Für Premium-Pläne kann das manuell nachgezogen werden.

Managed Identity und Rollen

Die System-Identity der Function App wird immer angelegt. Mit enableManagedIdentity = true entfallen die Schlüssel in den App-Settings, stattdessen weist roleassignments.bicep folgende Rollen zu:

RolleRessourceGrund
Storage Table Data ContributorStorage AccountKonfigurationstabellen, Durable-Tabellen
Storage Blob Data OwnerStorage AccountDurable-Hub-Blobs
Storage Queue Data ContributorStorage AccountDurable-Hub-Queues
Azure Service Bus Data SenderNamespaceEnqueue
Azure Service Bus Data ReceiverNamespaceDequeue
Azure Service Bus Data OwnerNamespaceQueue-Laufzeitdaten für die MCP-Tools list_queue_statuses und get_queue_status

SettingsService liefert Connection-Strings tolerant (null statt Exception); StorageService und ServiceBusService bauen ihre Clients aus dem Connection-String, wenn vorhanden, sonst über DefaultAzureCredential.

Alerts

Mit enableAlerts entstehen eine Action Group (E-Mail an notificationEmail), vier DLQ-Alerts auf DeadletteredMessages (Info ≥ 1, Warning > 50, Error > 200, Critical > 500, Schwellen parametrisierbar) und ein Queue-Längen-Alert auf ActiveMessages > 300000. Alle Alerts sind namespace-weit (EntityName = *). Anwendersicht: Monitoring & Alerts.

Netzwerk

Es gibt keine VNet-Integration, keine Private Endpoints und keine IP-Restriktionen. Storage, Service Bus und Function App sind öffentlich erreichbar; Transport ist TLS 1.2 bzw. HTTPS. Netzwerk-Isolation wäre eine Erweiterung des Bicep-Deployments.

Parameterdateien

bicep/params/databridge.sample.bicepparam ist die Vorlage mit allen Parametern. Kundenspezifische Parameterdateien liegen daneben im Repository und werden von cicd/manage/deploy_bicep.yml verwendet. storageKind erlaubt nur StorageV2; ältere Parameterdateien mit Storage schlagen an der Validierung fehl.

Marketplace-Artefakte

  • bicep/marketplace/mainTemplate.json wird mit GenerateMarketplace.sh aus main.bicep erzeugt und muss nach jeder Bicep-Änderung neu generiert und committet werden.
  • createUiDefinition.json ist Handarbeit und bildet die Parameter auf den Marketplace-Assistenten ab.

CI/CD

  • cicd/manage/build_and_deploy_functionapp.yml baut das Zip, setzt die Version (VersionMajor.VersionMinor.yyyy.MMdd) und veröffentlicht ein globales Artefakt.
  • cicd/manage/deploy_bicep.yml rollt Infrastruktur und Zip je Kunde aus.
  • cicd/manage/build_docfx_and_publish.yml baut und veröffentlicht diese Dokumentation (der Dateiname stammt noch aus der DocFX-Zeit).