AZURERM + AZAPI → STACKIT · TUTORIAL

AzureRM- und AzAPI-Terraform zu STACKIT: der Ablauf

StackToIT liest Terraform mit dem azurerm- oder dem azapi-Provider, offline und ohne Azure-Konto, und schreibt einen STACKIT-Entwurf samt der Liste der Entscheidungen, die es Ihnen nicht abnehmen kann. Diese Anleitung führt einen Lauf auf einer Demo-Umgebung aus, die beide Provider mischt, zeigt, wie jeder Ressourcentyp gelesen wird, und bringt die Prüfarbeit in eine Reihenfolge.

Ein Befehl, eine Zusammenfassung

Eine für diese Seite geschriebene Demo-Umgebung, am 4. November 2026 von StackToIT mit den Providern azurerm 5.6.0 und azapi 2.12.0 bewertet. Oben der Befehl mit gekürztem Ausgabepfad, unten ausgewählte Zeilen der Konsolenzusammenfassung, unverändert. Die Demo lief mit abgeschalteter optionaler Quellvalidierung.

Befehlshell
stacktoit assess . ./stacktoit-out --offline --no-validate
Konsolenzusammenfassung (ausgewählte Zeilen)console.txt
Source        5 migration units · visibility: Complete
Target        4 Terraform-only · 0 hybrid · 0 API-only · 0 manual · 1 no resource (of 5 units the draft considered)
STACKIT draft (this folder/terraform): 4 units generated · 1 need no resource · 0 left for the architect · 7 variables
Critical open settings    11  (4 resolved of the 15 the units state)
  • Sieben Ressourcen, fünf Einheiten

    Die Umgebung enthält eine Resource Group, ein Netzwerk mit einem Subnetz, einen Storage Account, einen Service-Bus-Namespace und eine Application-Insights-Komponente, beide mit azapi geschrieben, sowie ein azapi-Update. Der Lauf fasst sie für die Bewertung zu fünf Einheiten zusammen.

  • Nichts verbindet sich mit Azure

    Die StackToIT-Dokumentation hält fest, dass das Tool Terraform mit dem azurerm- oder azapi-Provider liest und sich nicht mit einem Azure-Konto verbindet. Der Lauf braucht den Code, keine Zugangsdaten.

  • Offene Einstellungen sind die Arbeit

    Elf kritische Einstellungen bleiben in diesem Lauf offen; vier der fünfzehn, die die Einheiten nennen, sind geklärt. Fünf der offenen sind der Resource-Group-Scope, je Einheit einer, für den Identity Architect; der Rest betrifft Namen, die Namespace-Einstellungen, den Adressraum und den Datenstandort.

azapi-Ressourcen hinein, STACKIT-Ressourcen heraus

Erster Ausschnitt: die drei azapi-Ressourcen aus der Eingabe. Danach die Blöcke, die die Engine für die ersten beiden geschrieben hat, ein Ausschnitt je Datei; die Review-Kommentare über jedem Block in der Datei sind hier weggelassen.

Beispieleingabemain.tf
resource "azapi_resource" "queue_namespace" {
  type      = "Microsoft.ServiceBus/namespaces@2024-01-01"
  name      = "sb-portal-gwc"
  location  = azurerm_resource_group.app.location
  parent_id = azurerm_resource_group.app.id

  body = {
    sku = {
      name = "Standard"
      tier = "Standard"
    }
    properties = {
      minimumTlsVersion = "1.2"
    }
  }
}

resource "azapi_resource" "app_insights" {
  type      = "Microsoft.Insights/components@2020-02-02"
  name      = "appi-portal-gwc"
  location  = azurerm_resource_group.app.location
  parent_id = azurerm_resource_group.app.id

  body = {
    kind = "web"
    properties = {
      Application_Type = "web"
      RetentionInDays  = 90
    }
  }
}

resource "azapi_update_resource" "storage_tls" {
  type        = "Microsoft.Storage/storageAccounts@2023-05-01"
  resource_id = azurerm_storage_account.assets.id

  body = {
    properties = {
      minimumTlsVersion = "TLS1_2"
    }
  }
}
STACKIT: RabbitMQterraform/messaging.tf
resource "stackit_rabbitmq_instance" "messaging" {
  project_id = var.project_id
  name       = "messaging"
  plan_name  = var.rabbitmq_plan_name
  version    = var.rabbitmq_version
  parameters = {
    sgw_acl = join(",", var.rabbitmq_allowed_cidrs)
  }
}
STACKIT: Observabilityterraform/observability.tf
resource "stackit_observability_instance" "migrated" {
  project_id = var.project_id
  name       = "migrated-observability"
  plan_name  = var.observability_plan_name
}
  • Der Typ-String entscheidet

    Eine azapi-Ressource hat einen Typ wie Microsoft.ServiceBus/namespaces samt API-Version und einen Body. Der Lauf erkennt die Einheit am Typ und liest den Body für Einstellungen; der Service-Bus-Namespace wird daher als Service-Bus-Namespace bewertet.

  • Gemeinsame Instanzen

    Beide Ziele sind gemeinsame Instanzen: eine RabbitMQ-Instanz für alle Queues und Topics, eine Observability-Instanz für die Telemetrie. Queues und Exchanges legen Sie selbst an, und laut Entwurf werden migrierte Alarme als Alert-Regeln neu geschrieben.

  • Werte ohne Default

    RabbitMQ-Plan, -Version und erlaubte CIDRs sind Variablen ohne Default. Bei der Version widersprechen sich Katalog und Lifecycle-Seite von STACKIT, und der Entwurf benennt das, statt selbst zu wählen.

Wie die Einheiten eingestuft wurden

Auszug aus assessment.json für vier der fünf Einheiten: die beiden azapi-Einheiten, den azurerm-Storage-Account und das Subnetz. Gezeigt sind nur die id sowie Klasse, Konfidenz und Zieldienst jedes Ergebnisses, mit den Werten, wie der Lauf sie geschrieben hat.

StackToIT-Bewertung (Auszug)assessment.json
[
  {
    "id": "azapi_resource.queue_namespace",
    "result": {
      "class": "REPLATFORM",
      "confidence": "MEDIUM",
      "target": {
        "service": "STACKIT RabbitMQ"
      }
    }
  },
  {
    "id": "azapi_resource.app_insights",
    "result": {
      "class": "RECONFIGURE",
      "confidence": "MEDIUM",
      "target": {
        "service": "STACKIT Observability (OpenTelemetry traces, metrics, logs)"
      }
    }
  },
  {
    "id": "azurerm_storage_account.assets",
    "result": {
      "class": "REPLATFORM",
      "confidence": "MEDIUM",
      "target": {
        "service": "STACKIT Object Storage"
      }
    }
  },
  {
    "id": "azurerm_subnet.app",
    "result": {
      "class": "RECONFIGURE",
      "confidence": "MEDIUM",
      "target": {
        "service": "STACKIT network"
      }
    }
  }
]

Wie jeder Eingabetyp gelesen wird

QuellressourceSTACKIT-ZielKlasse
azapi_resource, Microsoft.ServiceBus/namespacesRabbitMQ-InstanzReplatforming
azapi_resource, Microsoft.Insights/componentsObservability-InstanzRekonfigurieren
azurerm_storage_accountObject-Storage-BucketReplatforming
azurerm_subnetSTACKIT-Netzwerk, gleiches IPv4-PräfixRekonfigurieren
azurerm_virtual_networkKeine Ressource; Network Area nur, wenn Netzwerke privat routen müssenRekonfigurieren
azapi_update_resourceSupport-Ressource: keine Einheit, kritische Einstellungen für eine Person aufgeführtKeine

Klassen so, wie der Lauf sie entschieden hat, je Einheit Konfidenz MEDIUM. Die Update-Ressource steht unter den Support-Ressourcen in terraform/README.md.

Der Ablauf in der Reihenfolge

  1. Provider pinnen

    Deklarieren Sie azurerm- und azapi-Versionen in required_providers und committen Sie die Lock-Datei. Ohne Lock-Eintrag warnt der Lauf, dass die Version nicht belegt ist, und begrenzt die Konfidenz auf MEDIUM.

  2. Bewerten

    Starten Sie den Befehl im Ordner mit dem Root-Modul. Nutzen Sie die Offline-Option, wenn der Rechner keinen Netzwerkzugang hat.

  3. Den ersten Blocker lesen

    Die Konsole nennt den ersten Blocker und die nächste Aktion mit einer verantwortlichen Rolle. In diesem Lauf verweisen beide auf die Application-Insights-Einheit; ihre offene Einstellung in decisions.json ist der Resource-Group-Scope, verantwortet vom Identity Architect. Unabhängig davon markiert inputs-template.yaml die Zielregion als die eine Anfrage, die den Entwurf blockiert: Bis sie beantwortet ist, leitet der Lauf regionsabhängige Anfragen aus dem eu01-Katalog ab.

  4. In der Inputs-Datei antworten

    Kopieren Sie inputs-template.yaml aus dem Lauf-Ordner, füllen Sie die „value“-Zeilen, etwa die Region, übergeben Sie die Datei mit --inputs und starten Sie den Lauf erneut mit demselben Ausgabeordner. Der frühere Lauf wird ersetzt.

  5. Zielwerte eintragen

    Variablen ohne Default, etwa RabbitMQ-Plan und -Version, tragen Sie in die Kopie von target-values-template.tfvars ein; beim nächsten Lauf schreibt StackToIT die übernommenen Werte nach terraform/. Eine eigene Variablendatei geht ebenso.

  6. Entwürfe prüfen, dann planen

    Lesen Sie terraform/ mit dem Plattform-Team und führen Sie dann tofu init, validate und plan in einem Testprojekt aus. StackToIT führt nie apply aus.

AzAPI-Besonderheiten

  • Der Body ist dynamisch

    Der azapi-Provider nimmt den Request-Body als dynamischen Wert; ein Ressourcentyp kann daher jede Eigenschaft der Azure-API tragen. Einstellungen kommen als verschachtelte Schlüssel, und der Lauf listet sie in Punktschreibweise, etwa body.properties.minimumTlsVersion.

  • Updates sind keine eigenen Ressourcen

    azapi_update_resource ändert Eigenschaften einer bestehenden Ressource, und sein Löschen ändert nichts. In diesem Lauf hat es keine Einheit; Body, Typ und Ressourcen-ID sind als Einstellungen für eine Person aufgeführt.

  • Die verknüpfte Storage-Einstellung ist keiner Einheit zugeordnet

    Das Update setzt ein TLS-Minimum am Storage Account, doch der Lauf führt es als von keiner Einheit gelesen. Entscheiden und übernehmen Sie diese Einstellung von Hand.

  • Typen ohne Zuordnung

    Dieser Lauf zeigt Typen, die er abdeckt. Taucht ein von Ihnen genutzter azapi-Typ in der Ausgabe nicht auf, suchen Sie ihn in der Liste der Einheiten und Support-Ressourcen des Laufs, bevor Sie annehmen, er sei zugeordnet worden.

Fragen von Plattform-Teams

Brauchen wir Azure-Zugangsdaten?

Nein. Die StackToIT-Dokumentation hält fest, dass das Tool das Terraform liest und sich nicht mit einem Azure-Konto verbindet.

Liest es azapi genauso wie azurerm?

Ja. Die Dokumentation nennt beide Provider, und dieser Lauf hat azapi-Ressourcen für Service Bus und Application Insights neben azurerm-Ressourcen bewertet.

Warum erwähnt der Lauf eine Lock-Datei?

Ohne Lock-Eintrag kann der Lauf nicht belegen, welche Provider-Version der Plan nutzen würde. Er begrenzt die Konfidenz auf MEDIUM und sagt das einmal für die ganze Umgebung.

Können wir den Entwurf direkt anwenden?

Nein. Er ist ein Vorschlag zur Prüfung. Füllen Sie die Variablen, planen Sie in einem Testprojekt und lassen Sie zuerst einen Architekten die offenen Einstellungen entscheiden.

Quellen

Ihr nächster Schritt: STACKIT.

Erzählen Sie uns von Ihrer Umgebung. Wir zeigen Ihnen, was StackToIT dafür liefert: Zielarchitektur, Terraform-Artefakte und einen strukturierten Migrationsplan.