Oefening: een sjabloonspecificatie bijwerken en versien

Voltooid

De sjabloonspecificatie van Azure Cosmos DB wordt nu overal in uw organisatie gebruikt om veel nieuwe Azure Cosmos DB-accounts in te richten. Daarom zijn ze allemaal geconfigureerd voor het gebruik van continue back-up.

Uw beveiligingsteam heeft onlangs de beveiligingsmogelijkheden van Azure Cosmos DB beoordeeld. Er is besloten dat nieuwe accounts gebruikmaken van Microsoft Entra-verificatie en op rollen gebaseerd toegangsbeheer van Azure Cosmos DB.

In deze oefening werkt u de sjabloonspecificatie bij met een nieuwe versie die de bijgewerkte verificatieconfiguratie bevat.

Tijdens het proces gaat u het volgende doen:

  • Werk uw sjabloon bij om het back-upbeleid opnieuw te configureren.
  • Publiceer een nieuwe versie van de sjabloonspecificatie.
  • Controleer of de sjabloonspecificatie is bijgewerkt.
  • Test de nieuwe versie van de sjabloonspecificatie door een ander Azure Cosmos DB-account te implementeren.

De sjabloon bijwerken

  1. Open in Visual Studio Code het bestand azuredeploy.json .

  2. Werk het azuredeploy.json-bestand bij met de volgende wijzigingen:

    {
      "$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. Sla het bestand op.

  1. Open in Visual Studio Code het bestand main.bicep .

  2. Werk het bestand main.bicep bij met de volgende wijzigingen:

    @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. Sla het bestand op.

Een nieuwe versie van de sjabloonspecificatie publiceren

Publiceer de sjabloonspecificatie met behulp van deze Azure PowerShell-cmdlet in de 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

Publiceer de sjabloonspecificatie met behulp van deze Azure CLI-opdracht in de 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

De sjabloonspecificatie controleren

  1. Ga in uw browser terug naar Azure Portal. Ga naar uw resourcegroep.

  2. Selecteer de sjabloonspecificatie. U ziet dat de nieuwste versie nu wordt vermeld als 2.0.

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

  3. Selecteer het menu-item Versies . U ziet dat beide versies nu worden vermeld.

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

    Met sjabloonspecificatieversies kunt u teruggaan naar eerdere versies van de sjabloonspecificatie als dat nodig is.

De nieuwe sjabloonspecificatieversie implementeren

  1. Haal de resource-id van de nieuwe sjabloonspecificatieversie op door de volgende Azure PowerShell-opdracht uit te voeren:

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

    U ziet dat u de Versions eigenschap gebruikt om de resource-id van de sjabloonspecificatieversie op te halen.

  2. De nieuwe versie van de sjabloonspecificatie heeft een parameter voor de gebruikers-principal-id. Gebruik de volgende opdrachten om de principal-id van uw eigen gebruikersaccount op te halen:

    $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
    

    De opdrachten gebruiken de Microsoft Graph API om een query uit te voeren op uw eigen gebruikersprofiel.

  3. Implementeer de sjabloonspecificatie met behulp van deze Azure PowerShell-opdracht in de Visual Studio Code-terminal:

    New-AzResourceGroupDeployment `
      -TemplateSpecId $templateSpecVersionResourceId `
      -roleAssignmentPrincipalId $userObjectId
    
  1. Haal de resource-id van de sjabloonspecificatieversie op door de volgende Azure CLI-opdracht uit te voeren:

    id=$(az ts show \
     --name ToyCosmosDBAccount \
     --resource-group "<rgn>[sandbox resource group name]</rgn>" \
     --version "2.0" \
     --query "id")
    
  2. Implementeer de sjabloonspecificatie met behulp van deze Azure CLI-opdracht in de Visual Studio Code-terminal:

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

Het kan een paar minuten duren voordat de implementatie is voltooid.

De implementatie controleren

  1. Ga in uw browser terug naar Azure Portal. Ga naar uw resourcegroep.

  2. Selecteer naast Implementaties 2 Geslaagd.

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

  3. Selecteer de meest recente implementatie.

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

  4. Selecteer Implementatiedetails om deze uit te vouwen. Controleer of de resources voor op rollen gebaseerd toegangsbeheer van Azure Cosmos DB zijn geïmplementeerd.

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