Übung: Aktualisierung und Versionsverwaltung einer Vorlagenspezifikation

Abgeschlossen

Ihre Azure Cosmos DB-Vorlagenspezifikation wird jetzt in Ihrer gesamten Organisation verwendet, um viele neue Azure Cosmos DB-Konten bereitzustellen. Dementsprechend sind alle so konfiguriert, dass fortlaufende Sicherungen verwendet werden.

Ihr Sicherheitsteam hat vor Kurzem die Sicherheitsfunktionen von Azure Cosmos DB überprüft. Es wurde entschieden, dass neue Konten die Microsoft Entra-Authentifizierung und die rollenbasierte Zugriffssteuerung von Azure Cosmos DB verwenden sollten.

In dieser Übung aktualisieren Sie Ihre Vorlagenspezifikation mit einer neuen Version, welche die aktualisierte Authentifizierungskonfiguration enthält.

In dem Prozess gehen Sie wie folgt vor:

  • Aktualisieren Sie Ihre Vorlage, um die Sicherungsrichtlinie neu zu konfigurieren.
  • Veröffentlichen Sie eine neue Version Ihrer Vorlagenspezifikation.
  • Überprüfen Sie, ob die Vorlagenspezifikation aktualisiert wurde.
  • Testen Sie die neue Version Ihrer Vorlagenspezifikation, indem Sie ein weiteres Azure Cosmos DB-Konto bereitstellen.

Aktualisieren der Vorlage

  1. Öffnen Sie in Visual Studio Code die Datei azuredeploy.json.

  2. Aktualisieren Sie die azuredeploy.json-Datei, sodass sie die folgenden Änderungen enthält:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "location": {
          "type": "string",
          "defaultValue": "[resourceGroup().location]",
          "metadata": {
            "description": "The Azure region into which the Cosmos DB resources should be deployed."
          }
        },
        "cosmosDBAccountName": {
          "type": "string",
          "defaultValue": "[concat('toy-', uniqueString(resourceGroup().id))]",
          "maxLength": 44,
          "minLength": 3,
          "metadata": {
            "description": "The name of the Cosmos DB account. This name must be globally unique, and it must only include lowercase letters, numbers, and hyphens."
          }
        },
        "roleDefinitionFriendlyName": {
          "type": "string",
          "defaultValue": "Read and Write",
          "metadata": {
            "description": "A descriptive name for the role definition."
          }
        },
        "roleDefinitionDataActions": {
          "type": "array",
          "defaultValue": [
            "Microsoft.DocumentDB/databaseAccounts/readMetadata",
            "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*"
          ],
          "metadata": {
            "description": "The list of actions that the role definition permits."
          }
        },
        "roleAssignmentPrincipalId": {
          "type": "string",
          "metadata": {
            "description": "The object ID of the Azure AD principal that should be granted access using the role definition."
          }
        }
      },
      "variables": {
        "roleDefinitionName": "[guid('sql-role-definition', resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDBAccountName')))]",
        "roleAssignmentName": "[guid('sql-role-assignment', resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDBAccountName')))]"
      },
      "resources": [
        {
          "type": "Microsoft.DocumentDB/databaseAccounts",
          "apiVersion": "2021-04-15",
          "name": "[parameters('cosmosDBAccountName')]",
          "kind": "GlobalDocumentDB",
          "location": "[parameters('location')]",
          "properties": {
            "consistencyPolicy": {
              "defaultConsistencyLevel": "Session"
            },
            "locations": [
              {
                "locationName": "[parameters('location')]",
                "failoverPriority": 0,
                "isZoneRedundant": false
              }
            ],
            "databaseAccountOfferType": "Standard",
            "enableAutomaticFailover": false,
            "enableMultipleWriteLocations": false,
            "backupPolicy": {
              "type": "Continuous"
            }
          }
        },
        {
          "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions",
          "apiVersion": "2021-04-15",
          "name": "[format('{0}/{1}', parameters('cosmosDBAccountName'), variables('roleDefinitionName'))]",
          "properties": {
            "roleName": "[parameters('roleDefinitionFriendlyName')]",
            "type": "CustomRole",
            "assignableScopes": [
              "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDBAccountName'))]"
            ],
            "permissions": [
              {
                "dataActions": "[parameters('roleDefinitionDataActions')]"
              }
            ]
          },
          "dependsOn": [
            "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDBAccountName'))]"
          ]
        },
        {
          "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments",
          "apiVersion": "2021-04-15",
          "name": "[format('{0}/{1}', parameters('cosmosDBAccountName'), variables('roleAssignmentName'))]",
          "properties": {
            "roleDefinitionId": "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions', parameters('cosmosDBAccountName'), variables('roleDefinitionName'))]",
            "principalId": "[parameters('roleAssignmentPrincipalId')]",
            "scope": "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDBAccountName'))]"
          },
          "dependsOn": [
            "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDBAccountName'))]",
            "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions', parameters('cosmosDBAccountName'), variables('roleDefinitionName'))]"
          ]
        }
      ]
    }
    
  3. Speichern Sie die Datei .

  1. Öffnen Visual Studio Code die Datei main.bicep.

  2. Aktualisieren Sie die main.bicep-Datei so, dass sie die folgenden Änderungen enthält:

    @description('The Azure region into which the Cosmos DB resources should be deployed.')
    param location string = resourceGroup().location
    
    @description('The name of the Cosmos DB account. This name must be globally unique, and it must only include lowercase letters, numbers, and hyphens.')
    @minLength(3)
    @maxLength(44)
    param cosmosDBAccountName string = 'toy-${uniqueString(resourceGroup().id)}'
    
    @description('A descriptive name for the role definition.')
    param roleDefinitionFriendlyName string = 'Read and Write'
    
    @description('The list of actions that the role definition permits.')
    param roleDefinitionDataActions array = [
      'Microsoft.DocumentDB/databaseAccounts/readMetadata'
      'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*'
    ]
    
    @description('The object ID of the Azure AD principal that should be granted access using the role definition.')
    param roleAssignmentPrincipalId string
    
    var roleDefinitionName = guid('sql-role-definition', cosmosDBAccount.id)
    var roleAssignmentName = guid('sql-role-assignment', cosmosDBAccount.id)
    
    resource cosmosDBAccount 'Microsoft.DocumentDB/databaseAccounts@2021-04-15' = {
      name: cosmosDBAccountName
      kind: 'GlobalDocumentDB'
      location: location
      properties: {
        consistencyPolicy: {
          defaultConsistencyLevel: 'Session'
        }
        locations: [
          {
            locationName: location
            failoverPriority: 0
            isZoneRedundant: false
          }
        ]
        databaseAccountOfferType: 'Standard'
        enableAutomaticFailover: false
        enableMultipleWriteLocations: false
      }
    }
    
    resource roleDefinition 'Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions@2021-04-15' = {
      parent: cosmosDBAccount
      name: roleDefinitionName
      properties: {
        roleName: roleDefinitionFriendlyName
        type: 'CustomRole'
        assignableScopes: [
          cosmosDBAccount.id
        ]
        permissions: [
          {
            dataActions: roleDefinitionDataActions
          }
        ]
      }
    }
    
    resource roleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2021-04-15' = {
      parent: cosmosDBAccount
      name: roleAssignmentName
      properties: {
        roleDefinitionId: roleDefinition.id
        principalId: roleAssignmentPrincipalId
        scope: cosmosDBAccount.id
      }
    }
    
  3. Speichern Sie die Datei .

Veröffentlichen einer neuen Version der Vorlagenspezifikation

Veröffentlichen Sie die Vorlagenspezifikation mithilfe dieses Azure PowerShell-Cmdlets im Visual Studio Code-Terminal:

New-AzTemplateSpec `
  -ResourceGroupName <rgn>[sandbox resource group name]</rgn> `
  -Name ToyCosmosDBAccount `
  -Version '2.0' `
  -VersionDescription 'Adds Cosmos DB role-based access control.' `
  -TemplateFile main.bicep
New-AzTemplateSpec `
  -ResourceGroupName <rgn>[sandbox resource group name]</rgn> `
  -Name ToyCosmosDBAccount `
  -Version '2.0' `
  -VersionDescription 'Adds Cosmos DB role-based access control.' `
  -TemplateFile azuredeploy.json

Veröffentlichen Sie die Vorlagenspezifikation mithilfe dieses Azure-CLI-Befehls im Visual Studio Code-Terminal:

az ts create \
  --name ToyCosmosDBAccount \
  --version 2.0 \
  --version-description "Adds Cosmos DB role-based access control." \
  --template-file main.bicep
az ts create \
  --name ToyCosmosDBAccount \
  --version 2.0 \
  --version-description "Adds Cosmos DB role-based access control." \
  --template-file azuredeploy.json

Überprüfen der Vorlagenspezifikation

  1. Navigieren Sie in Ihrem Browser zum Azure-Portal zurück. Wechseln Sie zu Ihrer Ressourcengruppe.

  2. Wählen Sie die Vorlagenspezifikation aus. Beachten Sie, dass die neueste Version jetzt als 2.0aufgeführt ist.

    Screenshot of the Azure portal interface for the template spec, showing the latest version as 2.0.

  3. Wählen Sie das Menüelement Versionen aus. Beachten Sie, dass jetzt beide Versionen aufgeführt sind.

    Screenshot of the Azure portal interface for the template spec, showing the list of versions as 1.0 and 2.0.

    Mit Versionen von Vorlagenspezifikationen können Sie zu früheren Versionen Ihrer Vorlagenspezifikation zurückkehren, wenn dies erforderlich ist.

Bereitstellen der neuen Version der Vorlagenspezifikation

  1. Rufen Sie die Ressourcen-ID der neuen Version der Vorlagenspezifikation ab, indem Sie den folgenden Azure PowerShell-Befehl ausführen:

    $templateSpecVersionResourceId = ( `
       Get-AzTemplateSpec `
          -ResourceGroupName <rgn>[sandbox resource group name]</rgn> `
          -Name ToyCosmosDBAccount `
          -Version 2.0 `
       ).Versions[0].Id
    

    Beachten Sie, dass Sie die Versions-Eigenschaft verwenden, um die Ressourcen-ID der Vorlagenspezifikationsversion abzurufen.

  2. Ihre neue Version der Vorlagenspezifikation verfügt über einen Parameter für die Benutzerprinzipal-ID. Verwenden Sie die folgenden Befehle, um die Prinzipal-ID Ihres eigenen Benutzerkontos abzurufen:

    $token = (Get-AzAccessToken -ResourceUrl "https://graph.windows.net/").Token
    $userObjectId = (Invoke-RestMethod -Uri 'https://graph.windows.net/me?api-version=1.6' -Headers @{ 'Authorization' = "Bearer $token"}).objectID
    

    Die Befehle verwenden die Microsoft Graph-API, um Ihr eigenes Benutzerprofil abzufragen.

  3. Stellen Sie die Vorlagenspezifikation mithilfe dieses Azure PowerShell-Befehls im Visual Studio Code-Terminal bereit:

    New-AzResourceGroupDeployment `
      -TemplateSpecId $templateSpecVersionResourceId `
      -roleAssignmentPrincipalId $userObjectId
    
  1. Rufen Sie die Ressourcen-ID der Vorlagenspezifikation ab, indem Sie den folgenden Azure CLI-Befehl ausführen:

    id=$(az ts show \
     --name ToyCosmosDBAccount \
     --resource-group "<rgn>[sandbox resource group name]</rgn>" \
     --version "2.0" \
     --query "id")
    
  2. Stellen Sie die Vorlagenspezifikation mithilfe dieses Azure-CLI-Befehls im Visual Studio Code-Terminal bereit:

    az deployment group create \
     --template-spec $id \
     --parameters roleAssignmentPrincipalId="d68d19b3-d7ef-4ae9-9ee4-90695a4e417d"
    

Die Bereitstellung dauert bis zum Abschluss ein bis zwei Minuten.

Überprüfen der Bereitstellung

  1. Navigieren Sie in Ihrem Browser zum Azure-Portal zurück. Wechseln Sie zu Ihrer Ressourcengruppe.

  2. Wählen Sie neben Bereitstellungen die Option 2 Erfolgreich aus.

    Screenshot of the Azure portal interface for the resource group overview, with the deployments section showing that two succeeded.

  3. Wählen Sie die aktuellste Bereitstellung aus.

    Screenshot of the Azure portal interface for the deployments, with two deployments listed.

  4. Wählen Sie Bereitstellungsdetails aus, um die Angaben zu erweitern. Stellen Sie sicher, dass die Ressourcen für die rollenbasierte Zugriffssteuerung von Azure Cosmos DB bereitgestellt werden.

    Screenshot of the Azure portal interface for the specific deployment, with the Azure Cosmos DB resources listed.