← Alle Beiträge
Artikel · 2 Min. Lesezeit

Warum sind Managed Resource Groups ein Problem?

Wer seine Cloud-Reise beginnt, nutzt am besten das Microsoft Cloud Adoption Framework, das sich auf die folgenden Kernbereiche konzentriert:

AzureAzurePolicyCAFEnterpriseScale

Das Wichtigste zum Start der Cloud-Reise

Jeder Schritt ist sehr wichtig, aber ich möchte mich auf den Schritt „Ready“ konzentrieren.

In diesem Bereich ist es wichtig, das Betriebsmodell zu definieren, da es sich auf das „Landing Zone Concept“ auswirkt. Ich bevorzuge immer die Umsetzung des „Enterprise-Scale Framework“, das etwa so aussieht:

Dieses Konzept enthält im Bereich Management einen sehr wichtigen Design-Bereich namens „Naming Standard and Tagging“. Für die künftigen Design-Prinzipien ist es entscheidend, einen robusten Naming- und Tagging-Standard festzulegen.

Ich empfehle immer, das Azure-Naming-Standard-Tool zu verwenden und Azure Policies und Initiativen zu definieren, um Tagging-Standards auf Resource Groups durchzusetzen und Tags in Subscriptions zu auditieren.

Das macht die Durchsetzung von Tags und des Naming-Standards deutlich schwieriger. Ich glaube allerdings, dass ich eine brauchbare Lösung für euch habe. Ich bin auf eine ältere Diskussion zu diesem Thema gestoßen, die ihr hier findet.

Die Lösung erfüllt meine Anforderungen nicht, deshalb habe ich mein Bestes gegeben, das Problem zu lösen, und hier sind wir.

Folgendes habe ich erreicht:

  • Eine globale Policy definieren, die die wichtigsten Tags auf Resource-Group-Ebene erzwingt
  • Eine Ausnahme für die (mir bekannten) Managed Resource Groups einrichten
  • Den Managed Resource Groups die erzwungenen Tags automatisch mit einem Standardwert zuweisen

Warum funktioniert meine Lösung? Ich habe die integrierte Policy „Require a Tag and Its Value on Resource Groups“ geklont und so angepasst, dass sie eine Ausnahme für Managed Resource Groups enthält. Die Policy sieht jetzt so aus:

{
  "mode": "All",
  "parameters": {
      "tagName": {
        "type": "String",
        "metadata": {
          "displayName": "Tag Name",
          "description": "Name of the tag, such as 'environment'"
        }
      }
    },
    "policyRule": {
      "if": {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.Resources/subscriptions/resourceGroups"
          },
          {
            "field": "[concat('tags[', parameters('tagName'), ']')]",
            "exists": "false"
          },
          {
            "field": "name",
            "notLike": "AVNM*"
          },
          {
            "field": "name",
            "match": "NetworkWatcherRG"
          },
          {
            "field": "name",
            "match": "test"
          }
        ]
      },
      "then": {
        "effect": "deny"
      }
    }
  }

Zusätzlich eine Policy, die das erforderliche Tag mit einem vordefinierten Wert hinzufügt.

{
  "mode": "All",
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Resources/subscriptions/resourceGroups"
        },
        {
          "field": "[concat('tags[', parameters('tagName'), ']')]",
          "exists": "false"
        }
      ]
    },
    "then": {
      "effect": "modify",
      "details": {
        "roleDefinitionIds": [
          "/providers/microsoft.authorization/roleDefinitions/4a9ae827-6dc8-4573-8ac7-8239d42aa03f"
        ],
        "operations": [
          {
            "operation": "add",
            "field": "[concat('tags[', parameters('tagName'), ']')]",
            "value": "[parameters('tagValue')]"
          }
        ]
      }
    }
  },
  "parameters": {
    "tagName": {
      "type": "String",
      "metadata": {
        "displayName": "Tag Name",
        "description": "Name of the tag, such as 'environment'"
      }
    },
    "tagValue": {
      "type": "String",
      "metadata": {
        "displayName": "Tag Value",
        "description": "Value of the tag, such as 'automatic'"
      }
    }
  }
}

Wenn ihr versucht, eine Resource Group ohne das erforderliche Tag zu erstellen und der Name nicht ausgenommen ist, erhaltet ihr folgenden Fehler:

Alles funktioniert einwandfrei, wenn eine Managed Resource Group aus der Liste erstellt wird. Hier ein Beispiel zum Testen: Wechselt zum Dienst Azure Network Manager und erstellt in eurer Subscription einen neuen. Der Dienst erstellt automatisch eine Managed Resource Group mit dem Namen „NetworkWatcherRG“. Die oben beschriebene Policy erlaubt deren Erstellung und weist das erforderliche Tag mit einem vordefinierten Wert zu:

Zum Schluss

Meine abschließenden Gedanken zu diesem Blogpost: Wer mit Azure startet, sollte unbedingt eine gut strukturierte Reise unternehmen und dabei das Cloud Adoption Framework nutzen. Letztlich sorgt die Umsetzung einer soliden Landing-Zone-Architektur für langfristigen Erfolg.

Fakt ist, dass Microsofts Rollout von Diensten, die Managed Resource Groups erfordern, bestimmte Design-Bereiche innerhalb der Landing-Zone-Implementierung aushebeln kann. Aber so ist es derzeit nun mal, und ich hoffe, dass Microsoft dies entweder überarbeitet oder die Möglichkeit ergänzt, die Resource Group während der Bereitstellung selbst festzulegen.

Nach meinem aktuellen Wissensstand gibt es derzeit die folgenden Managed Resource Groups:

  • Azure Network Watcher
  • Azure Network Manager
  • Azure Synaps
  • Azure Kubernetis services

Wenn ihr weitere Dienste kennt, gebt mir bitte Bescheid, damit ich die Policy erweitern kann.