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.
stacktoit assess . ./stacktoit-out --offline --no-validateSource 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.
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"
}
}
}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)
}
}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.
[
{
"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
| Quellressource | STACKIT-Ziel | Klasse |
|---|---|---|
| azapi_resource, Microsoft.ServiceBus/namespaces | RabbitMQ-Instanz | Replatforming |
| azapi_resource, Microsoft.Insights/components | Observability-Instanz | Rekonfigurieren |
| azurerm_storage_account | Object-Storage-Bucket | Replatforming |
| azurerm_subnet | STACKIT-Netzwerk, gleiches IPv4-Präfix | Rekonfigurieren |
| azurerm_virtual_network | Keine Ressource; Network Area nur, wenn Netzwerke privat routen müssen | Rekonfigurieren |
| azapi_update_resource | Support-Ressource: keine Einheit, kritische Einstellungen für eine Person aufgeführt | Keine |
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
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.
Bewerten
Starten Sie den Befehl im Ordner mit dem Root-Modul. Nutzen Sie die Offline-Option, wenn der Rechner keinen Netzwerkzugang hat.
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.
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.
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.
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.