Ćwiczenie — aktualizowanie i wersja specyfikacji szablonu
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
W programie Visual Studio Code otwórz plik azuredeploy.json .
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'))]" ] } ] }
Zapisz plik.
W programie Visual Studio Code otwórz plik main.bicep .
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 } }
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
W przeglądarce wróć do witryny Azure Portal. Przejdź do grupy zasobów.
Wybierz specyfikację szablonu. Zwróć uwagę, że najnowsza wersja jest teraz wyświetlana jako 2.0.
Wybierz element menu Wersje. Zwróć uwagę, że obie wersje są teraz wyświetlane.
Wersje specyfikacji szablonu umożliwiają powrót do poprzednich wersji specyfikacji szablonu, jeśli zajdzie taka potrzeba.
Wdrażanie nowej wersji specyfikacji szablonu
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.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.
Wdróż specyfikację szablonu przy użyciu tego polecenia programu Azure PowerShell w terminalu programu Visual Studio Code:
New-AzResourceGroupDeployment ` -TemplateSpecId $templateSpecVersionResourceId ` -roleAssignmentPrincipalId $userObjectId
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")
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
W przeglądarce wróć do witryny Azure Portal. Przejdź do grupy zasobów.
Obok pozycji Wdrożenia wybierz pozycję 2 Powodzenie.
Wybierz najnowsze wdrożenie.
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.