Ćwiczenie — aktualizowanie i wersja specyfikacji szablonu

Ukończone

Specyfikacja szablonu usługi Azure Cosmos DB jest teraz używana w całej organizacji do aprowizowania wielu nowych kont usługi Azure Cosmos DB. W związku z tym wszystkie z nich są skonfigurowane do używania ciągłej kopii zapasowej.

Twój zespół ds. zabezpieczeń niedawno przejrzał możliwości zabezpieczeń usługi Azure Cosmos DB. Podjęto decyzję, że nowe konta powinny używać uwierzytelniania microsoft Entra i kontroli dostępu opartej na rolach usługi Azure Cosmos DB.

W tym ćwiczeniu zaktualizujesz specyfikację szablonu przy użyciu nowej wersji zawierającej zaktualizowaną konfigurację uwierzytelniania.

Podczas tego procesu wykonasz następujące czynności:

  • Zaktualizuj szablon, aby ponownie skonfigurować zasady tworzenia kopii zapasowych.
  • Opublikuj nową wersję specyfikacji szablonu.
  • Sprawdź, czy specyfikacja szablonu została zaktualizowana.
  • Przetestuj nową wersję specyfikacji szablonu, wdrażając inne konto usługi Azure Cosmos DB.

Aktualizowanie szablonu

  1. W programie Visual Studio Code otwórz plik azuredeploy.json .

  2. Zaktualizuj plik azuredeploy.json, aby uwzględnić następujące zmiany:

    {
      "$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. Zapisz plik.

  1. W programie Visual Studio Code otwórz plik main.bicep .

  2. Zaktualizuj plik main.bicep, aby uwzględnić następujące zmiany:

    @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. Zapisz plik.

Publikowanie nowej wersji specyfikacji szablonu

Opublikuj specyfikację szablonu przy użyciu tego polecenia cmdlet programu Azure PowerShell w terminalu programu Visual Studio Code:

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

Opublikuj specyfikację szablonu przy użyciu tego polecenia interfejsu wiersza polecenia platformy Azure w terminalu programu Visual Studio Code:

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

Weryfikowanie specyfikacji szablonu

  1. W przeglądarce wróć do witryny Azure Portal. Przejdź do grupy zasobów.

  2. Wybierz specyfikację szablonu. Zwróć uwagę, że najnowsza wersja jest teraz wyświetlana jako 2.0.

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

  3. Wybierz element menu Wersje. Zwróć uwagę, że obie wersje są teraz wyświetlane.

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

    Wersje specyfikacji szablonu umożliwiają powrót do poprzednich wersji specyfikacji szablonu, jeśli zajdzie taka potrzeba.

Wdrażanie nowej wersji specyfikacji szablonu

  1. Pobierz identyfikator zasobu nowej wersji specyfikacji szablonu, uruchamiając następujące polecenie programu Azure PowerShell:

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

    Zwróć uwagę, że używasz Versions właściwości , aby uzyskać identyfikator zasobu wersji specyfikacji szablonu.

  2. Nowa wersja specyfikacji szablonu zawiera parametr identyfikatora głównego użytkownika. Użyj następujących poleceń, aby uzyskać identyfikator podmiotu zabezpieczeń konta użytkownika:

    $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
    

    Polecenia używają interfejsu API programu Microsoft Graph do wykonywania zapytań dotyczących własnego profilu użytkownika.

  3. Wdróż specyfikację szablonu przy użyciu tego polecenia programu Azure PowerShell w terminalu programu Visual Studio Code:

    New-AzResourceGroupDeployment `
      -TemplateSpecId $templateSpecVersionResourceId `
      -roleAssignmentPrincipalId $userObjectId
    
  1. Pobierz identyfikator zasobu wersji specyfikacji szablonu, uruchamiając następujące polecenie interfejsu wiersza polecenia platformy Azure:

    id=$(az ts show \
     --name ToyCosmosDBAccount \
     --resource-group "<rgn>[sandbox resource group name]</rgn>" \
     --version "2.0" \
     --query "id")
    
  2. Wdróż specyfikację szablonu przy użyciu tego polecenia interfejsu wiersza polecenia platformy Azure w terminalu programu Visual Studio Code:

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

Ukończenie wdrożenia może potrwać minutę lub dwie.

Weryfikowanie wdrożenia

  1. W przeglądarce wróć do witryny Azure Portal. Przejdź do grupy zasobów.

  2. Obok pozycji Wdrożenia wybierz pozycję 2 Powodzenie.

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

  3. Wybierz najnowsze wdrożenie.

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

  4. Wybierz pozycję Szczegóły wdrożenia, aby ją rozwinąć. Upewnij się, że wdrożono zasoby kontroli dostępu opartej na rolach usługi Azure Cosmos DB.

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