Zum Inhalt

Integrationsmodule: Logic App, Function App, Container App, Data Factory

Die Integrationsmodule sind Terraform-Module, die einen Integrationsservice in deinem spoke deployen, bereits mit dem spoke verbunden (Netzwerk, Key Vault, Storage Account, Log Analytics) und auf einer sicheren Baseline aufgebaut. Du wählst einige Einstellungen, das Modul erledigt den Rest. Diese Seite beschreibt das Modulset, was jedes Modul deployt, seine Defaults und wie ein Workload- Team es verwendet. Wie du das Deployment ausführst: Integrationsressourcen deployen.

Optionales Angebot, Referenzdesign

Welche Module und Versionen deine Plattform anbietet, hängt von deiner Plattform ab. Die Defaults auf dieser Seite stammen aus dem Terraform der Module. Dein Plattform-Team kann sie geändert oder eine andere Version gepinnt haben.

Das Modulset

Ein Root-Modul nimmt pro Service-Typ eine Map entgegen. Du füllst nur, was du brauchst. Eine leere Map deployt nichts.

Service Input-Map Deployt (Zusammenfassung)
Logic App logic_apps Eine Standard Logic App auf einem gemeinsamen Workflow-Plan, nur Private Endpoint, eingebaute Authentifizierung, eigenes Storage Account
Function App function_apps (und service_plans) Eine Linux Function App, VNet-Integration, Private Endpoint, identitätsbasierter Zugriff auf das Storage Account des spokes
Container App container_apps_environment Ein Container Apps environment (intern), Container Apps und Jobs in T-Shirt-Größen
Data Factory data_factories Eine Data Factory mit Managed Virtual Network, Private Endpoint und Linked Services zum Key Vault und Storage des spokes

Zusammen bilden sie die Zutat Module der Plattform (Servicebeschreibung).

flowchart LR
    cfg["Your configuration<br/>logic_apps, function_apps,<br/>container_apps_environment, data_factories"] --> root["Root module"]
    out["spoke_config<br/>(spoke outputs)"] --> root
    root --> la["Logic App"]
    root --> fa["Function App + service plans"]
    root --> ca["Container Apps environment,<br/>apps and jobs"]
    root --> adf["Data Factory"]
    la & fa & ca & adf -->|"read"| spoke["Spoke: VNet and subnets,<br/>Key Vault, storage account,<br/>Log Analytics"]

Wie ein Modul deinen spoke verwendet

Jedes Modul braucht die Beschreibung deines spokes in einer Variable, spoke_config. Sie wird aus einer Datei mit den Outputs des spokes gefüllt (siehe Integrationsressourcen deployen).

Feld von spoke_config Bedeutung
name, environment, location, tags Name, Umgebung, Region und Tags des spokes. Module erben Tags. Das Container-App-Modul verlangt, dass die Umgebung nonprod oder prod ist (siehe unten).
subscription_id, tenant_id, resource_group_name Wo der spoke liegt
virtual_network_id, virtual_network_name Das Netzwerk des spokes
subnet_ids, subnet_names Maps der Subnetze des spokes. Module wählen Subnetze per Name (zum Beispiel für Private Endpoints und für die ausgehende Integration).
key_vault_id, key_vault_name Das Key Vault des spokes
storage_account_id, storage_account_name Das Storage Account des spokes
log_analytics_workspace_id, log_analytics_workspace_name Wohin die Logs gehen

Die Module lesen diese Ressourcen (Key Vault, Storage Account, Log-Analytics-Workspace) als bestehende Ressourcen. Sie erstellen sie nicht. Ein Modul, das ein benanntes Subnet nicht findet, schlägt fehl, prüfe also zuerst die Subnet-Namen in deinem spoke.

Private Endpoints: Die Module verwalten die privaten DNS Zone Groups ihrer Private Endpoints nicht. Die Namensauflösung für die Endpoints wird voraussichtlich von der Plattform geregelt, zum Beispiel per Azure Policy. Frag dein Plattform-Team.

Logic App

Eine Standard Logic App mit gehärteter Baseline.

logic_apps = {
  orders = {
    subnets = {
      private_endpoint_subnet_name   = "<private-endpoint-subnet>"
      logic_app_outbound_subnet_name = "<logic-app-outbound-subnet>"
    }
    authentication_settings = {
      client_id = "<entra-app-client-id>"
    }
    environment_variables = {}
  }
}
Einstellung Default und Wirkung
Plan Ein gemeinsamer Workflow Service Plan für alle Logic Apps des spokes, Windows, vom Root-Modul aus default_logic_apps_plan erstellt: Größe S (WS1; außerdem M = WS2, L = WS3), mindestens 2 Instanzen, Zone Balancing an. Plan-Name asp-<spoke name>-logicapps in einer Resource group rg-<spoke name>-logicapps, sofern du keine Namen setzt.
Resource group Standardmäßig wird pro Logic App eine Gruppe erstellt (create_resource_group, true). Du kannst eine bestehende angeben.
Netzwerk Öffentlicher Netzwerkzugriff aus. Private Endpoint im von dir benannten Subnet, ausgehender Verkehr über das Outbound-Subnet (VNet-Integration). vnet_private_ports_count reserviert private Ports.
Authentifizierung Immer an. Nicht authentifizierte Anfragen erhalten ein 401. Erlaubte Audiences, Gruppen und Identities werden in authentication_settings gesetzt. /runtime/* ist ausgenommen, damit die Run History Inputs und Outputs zeigen kann.
Storage Ein eigenes Storage Account für die Logic App, für Isolation bei Performance und Sicherheit, mit einer Firewall, die standardmäßig verweigert und nur das Outbound-Subnet erlaubt
Identity System-assigned und eine User-assigned Managed Identity
Härtung Nur HTTPS, FTPS deaktiviert, Basic Authentication für FTP und Web Deploy deaktiviert, HTTP/2 an
Monitoring Application Insights, verbunden mit dem Log-Analytics-Workspace des spokes, Diagnoseeinstellungen für die App und ihr Storage
Health Check Ein Workflow namens HealthCheck mit Trigger Request wird für den Health Check verwendet. Beide Namen können geändert werden (Namen mit höchstens 12 bzw. 7 Zeichen).

Ressourcennamen: logic-<name>, appi-<name>, pe-logic-<name>, id-<name>.

Die Workflows deployen. Das Modul-Repository enthält zwei kleine Bausteine für eine pipeline: Der eine verpackt das Logic- App-Projekt (er verwendet parameters.azure.json als parameters.json, wenn vorhanden, und lässt local.settings.json weg), der andere deployt das Paket in die Logic-App-Standard-Ressource. Dein Plattform-Team gibt dir das pipeline-Template.

Function App

Eine Function App auf einem Service Plan, den du definierst, mit identitätsbasiertem Zugriff auf das Storage Account des spokes.

service_plans = {
  shared-linux = {
    name     = "plan-<name>"
    sku_name = "EP1"
    os_type  = "Linux"
    tags     = {}
  }
}

function_apps = {
  processor = {
    name                      = "func-<name>"
    service_plan_key          = "shared-linux"
    virtual_network_subnet_id = "<integration-subnet-id>"
    app_settings              = { "ENV" = "dev" }
    private_endpoints = {
      default = { subnet_resource_id = "<private-endpoint-subnet-id>" }
    }
  }
}
Einstellung Default und Wirkung
Plan Wähle mit service_plan_key (ein Plan aus service_plans) oder service_plan_resource_id (ein bestehender Plan). Mehrere Apps können sich einen Plan teilen.
Flex Consumption (FC1) Setze sku_name = "FC1" am Plan und function_app_uses_fc1 = true an der App, mit fc1_runtime_name und fc1_runtime_version (Defaults node und 20). Eine App pro FC1-Plan, nur Linux.
Netzwerk VNet-Integration über virtual_network_subnet_id, und ein Private Endpoint ist erforderlich: Gib immer mindestens einen Eintrag in private_endpoints an.
Storage Keine Keys. Die App verwendet ihre System-assigned Identity auf dem Storage Account des spokes: Das Modul gibt ihr Storage Blob Data Owner und Storage Blob Data Contributor auf diesem Account, erstellt einen privaten Blob-Container mit dem Namen der App und setzt die identitätsbasierten Einstellungen AzureWebJobsStorage__.... Setze AzureWebJobsStorage nicht selbst. Das Modul entfernt es.
Identity System-assigned ist immer an. Über managed_identities kannst du User-assigned Identities hinzufügen.
Site-Einstellungen Sichere Defaults in site_config: nur FTPS, mindestens TLS 1.3 (1.2 für die SCM-Site), Always On, 32-Bit-Worker aus. Authentication v2 und IP-Einschränkungen sind verfügbar.
Application Insights Optional, über application_insights
Resource group Standardmäßig die Resource group des spokes. Eine eigene Gruppe mit create_resource_group_for_function_apps und function_apps_resource_group_name.

Linux im Root-Modul

Das Modul-Repository enthält ein Linux- und ein Windows-Function-App-Modul. Der Input des Root-Moduls akzeptiert die Felder des Linux-Moduls. Kläre mit deinem Plattform-Team, bevor du eine Windows Function App planst.

Container App

Ein Container Apps environment in deinem spoke mit Container Apps und Container Jobs.

container_apps_environment = {
  main = {
    resource_name                = "<name>"
    environment                  = "nonprod"
    vnet_integration_subnet_name = "<container-apps-subnet>"
    container_registry_server    = "<registry>.azurecr.io"
    container_registry_identity  = { name = "<pull-identity>", resource_group_name = "<resource-group>" }
    container_apps = [
      { name = "api", image = "<registry>.azurecr.io/<repository>/api", size = "S", min_replicas = 1, max_replicas = 3 }
    ]
    scheduled_container_jobs = [
      { name = "nightly", image = "<registry>.azurecr.io/<repository>/job", schedule_cron = "0 2 * * *" }
    ]
    storage_queues = [{ name = "work", alert_on_message_added_to_queue = false }]
  }
}
Einstellung Default und Wirkung
Environment Name cae-<name>-<np or p>-<region code>. environment muss nonprod oder prod sein. Wenn du es nicht setzt, wird die Umgebung aus spoke_config verwendet, die dann eine der beiden sein muss. Das Environment ist intern (interner Load Balancer) im von dir benannten Subnet, auf dem Consumption-Workload-Profil. Logs gehen an den Log-Analytics-Workspace des spokes.
Images Du gibst pro App oder Job den Image-Namen an. Ein gemeinsamer Tag container_image_tag (Default latest) wird angehängt. Der Pull erfolgt mit einer User-assigned Managed Identity, die du benennst (container_registry_identity), auf der Registry container_registry_server. Hier kommt die gemeinsame Container Registry zum Einsatz (Shared Services).
Größen S 0,25 vCPU, 0,5 GiB. M 0,5 vCPU, 1 GiB. L 1 vCPU, 2 GiB. XL 2 vCPU, 4 GiB. XXL 4 vCPU, 8 GiB. Default S.
Container Apps Pro App: Größe, Health Check, min_replicas (Default 0), max_replicas (Default 1), Umgebungsvariablen, Ingress (Default an), optional Dapr
Container Jobs Drei Arten: manual, event (startet, wenn eine Nachricht in einer Azure-Storage-Queue des Storage Accounts des spokes eintrifft, jeweils eine Ausführung, Polling alle 30 Sekunden) und scheduled (Cron-Ausdruck). Defaults pro Job: Timeout 600 Sekunden, 3 Wiederholungen, Parallelität 1.
Storage-Helfer storage_containers, storage_queues und storage_tables erstellen diese Elemente im Storage Account des spokes
Secrets Eine User-assigned Identity des Environments erhält Key Vault Certificate User auf dem Key Vault des spokes. Der Connection String von Application Insights wird als Secret im Key Vault des spokes abgelegt.
Application Insights Eines pro Environment, 30 Tage Aufbewahrung
Alerts Optional, über monitoring_config: fehlgeschlagene Requests, Exceptions und Nachrichten, die zu gewählten Queues hinzugefügt werden. Benachrichtigungen per E-Mail und/oder in einen Teams-Kanal (über dessen E-Mail-Adresse) werden pro Environment eingeschaltet. Alle sind standardmäßig aus.

Namen: ca-<...> für Apps, cj-<...> für manuelle Jobs, cj-event-<...> für Event-Jobs und cj-cron-<...> für geplante Jobs.

Data Factory

Eine Data Factory für Batch-ETL, mit einem privaten Netzwerkmodell.

data_factories = {
  main = {
    resource_name                = "<name>"
    private_endpoint_subnet_name = "<private-endpoint-subnet>"
    team_members                 = ["<alert-recipient>"]
    enable_alert_failed_pipeline = true
  }
}
Einstellung Default und Wirkung
Netzwerk Öffentlicher Netzwerkzugriff aus, Managed Virtual Network an, ein Private Endpoint im von dir benannten Subnet
Integration Runtime Eine Azure Integration Runtime im Managed Network: 8 Cores (erlaubte Werte 8, 16, 32, 48, 64, 80, 128, 144, 256, 272), Compute-Typ General (oder MemoryOptimized), Time to Live 10 Minuten
Linked Services Zum Key Vault des spokes und zum Storage Account des spokes (blob), authentifiziert mit der Managed Identity der Factory. Sie werden von Terraform verwaltet, Änderungen an diesen beiden in der Factory werden daher überschrieben.
Managed Private Endpoints Zum Key Vault (vault) und zum Storage Account (blob). Das Modul genehmigt sie: über die API beim Key Vault und beim Storage über einen Azure-CLI-Aufruf beim Deployment. Das Deployment braucht daher die Azure CLI und das Recht, Private-Endpoint-Verbindungen auf diesen Ressourcen zu genehmigen.
Zugriff Die Identity der Factory erhält Key Vault Secrets User auf dem Key Vault und Storage Blob Data Contributor auf dem Storage Account
Git-Integration Optional vsts_configuration (ein Azure-DevOps-Git-Repository) und global_parameters, beide von Terraform verwaltet
Monitoring Diagnose-Logs (pipeline-Läufe, Trigger-Läufe) an den Log-Analytics-Workspace des spokes. Eine Action Group DefaultActionGroup schickt E-Mails an team_members. Ein Alert für fehlgeschlagene pipelines, wenn enable_alert_failed_pipeline true ist (Default false).
Resource group Eine neue Resource group pro Data Factory

Die private DNS Zone Group des Private Endpoints der Data Factory wird vom Modul nicht verwaltet. Sie soll von Azure Policy kommen.

Monitoring

Modul Was das Modul einrichtet Was bei dir bleibt
Logic App Application Insights, Diagnoseeinstellungen an den Workspace des spokes, ein Name für den Health-Check-Workflow Alerts auf deine Workflows, ein HealthCheck-Workflow in deiner App
Function App Optional Application Insights Alert Rules und das Logging deines Function-Codes
Container App Application Insights, optionale Alerts und Action Groups Auswahl, welche Alerts eingeschaltet werden, Application Logging
Data Factory Diagnose, optionaler Alert für fehlgeschlagene pipelines, eine Action Group Empfänger, Alerts zur Datenqualität

Monitoring auf Plattformebene: Betrieb.

Verantwortlichkeiten

Plattform-Team Workload-Team
Modulcode, Defaults, neue Versionen, pipeline-Templates Ja
Auswahl der Module, Größen, Pläne und Optionen in deiner Konfiguration Ja
Spoke, Subnetze, Key Vault, Storage Account, Log Analytics Ja
Die Anwendung: Workflows, Function-Code, Container-Images, pipelines Ja
DNS für Private Endpoints, Firewallregeln Ja (auf Anfrage) Stellt die Anfrage
Sicherheit der Data Plane Ja

Die allgemeine Aufteilung ist unter Verantwortlichkeiten beschrieben.