연습 - 템플릿 사양 업데이트 및 버전
이제 조직 전체에서 Azure Cosmos DB 템플릿 사양을 사용하여 많은 새 Azure Cosmos DB 계정을 프로비전합니다. 따라서 모두 연속 백업을 사용하도록 구성됩니다.
보안 팀에서 최근 Azure Cosmos DB 보안 기능을 검토했습니다. 새 계정은 Microsoft Entra 인증 및 Azure Cosmos DB 역할 기반 액세스 제어를 사용해야 하기로 결정했습니다.
이 연습에서는 업데이트된 인증 구성을 포함하는 새 버전으로 템플릿 사양을 업데이트합니다.
프로세스 중에 다음을 수행합니다.
- 템플릿을 업데이트하여 백업 정책을 다시 구성하세요.
- 새 버전의 템플릿 사양을 게시하세요.
- 템플릿 사양이 업데이트 되었는지 확인합니다.
- 다른 Azure Cosmos DB 계정을 배포하여 새 버전의 템플릿 사양을 테스트합니다.
템플릿 업데이트
Visual Studio Code에서 azuredeploy.json 파일을 엽니다.
다음 변경 내용을 포함하도록 azuredeploy.json 파일을 업데이트합니다.
{ "$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'))]" ] } ] }
파일을 저장합니다.
Visual Studio Code에서 main.bicep 파일을 엽니다.
다음 변경 내용을 포함하도록 main.bicep 파일을 업데이트합니다.
@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 } }
파일을 저장합니다.
새로운 버전의 템플릿 사양 게시
Visual Studio Code 터미널에서 이 Azure PowerShell cmdlet을 사용하여 템플릿 사양을 게시합니다.
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
Visual Studio Code 터미널에서 이 Azure CLI 명령을 사용하여 템플릿 사양을 게시합니다.
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
템플릿 사양을 확인합니다.
브라우저에서 Azure Portal로 돌아갑니다. 리소스 그룹으로 이동합니다.
템플릿 사양을 선택합니다. 이제 최신 버전이 2.0으로 나열되는 것을 볼 수 있습니다.
버전 메뉴 항목을 선택합니다. 이제 두 버전이 모두 나열되는 것을 볼 수 있습니다.
템플릿 사양 버전을 사용하면 필요한 경우 템플릿 사양의 이전 버전으로 돌아갈 수 있습니다.
새 템플릿 사양 버전 배포
다음 Azure PowerShell 명령을 실행하여 새 템플릿 사양 버전의 리소스 ID를 가져옵니다.
$templateSpecVersionResourceId = ( ` Get-AzTemplateSpec ` -ResourceGroupName <rgn>[sandbox resource group name]</rgn> ` -Name ToyCosmosDBAccount ` -Version 2.0 ` ).Versions[0].Id
Versions
속성을 사용하여 템플릿 사양 버전의 리소스 ID를 가져옵니다.새 템플릿 사양 버전에는 사용자 계정 ID에 대한 매개 변수가 있습니다. 다음 명령을 사용하여 귀하의 사용자 계정의 보안 주체 ID를 가져옵니다.
$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
명령은 Microsoft Graph API를 사용하여 귀하의 사용자 프로필을 쿼리합니다.
Visual Studio Code 터미널에서 이 Azure PowerShell 명령을 사용하여 템플릿 사양을 배포합니다.
New-AzResourceGroupDeployment ` -TemplateSpecId $templateSpecVersionResourceId ` -roleAssignmentPrincipalId $userObjectId
다음 Azure CLI 명령을 실행하여 템플릿 사양 버전의 리소스 ID를 가져옵니다.
id=$(az ts show \ --name ToyCosmosDBAccount \ --resource-group "<rgn>[sandbox resource group name]</rgn>" \ --version "2.0" \ --query "id")
Visual Studio Code 터미널에서 이 Azure CLI 명령을 사용하여 템플릿 사양을 배포합니다.
az deployment group create \ --template-spec $id \ --parameters roleAssignmentPrincipalId="d68d19b3-d7ef-4ae9-9ee4-90695a4e417d"
배포를 완료하는 데 1~2분 정도 걸릴 수 있습니다.
배포 확인
브라우저에서 Azure Portal로 돌아갑니다. 리소스 그룹으로 이동합니다.
배포 옆에 있는 2 성공을 선택합니다.
가장 최근의 배포를 선택합니다.
배포 세부 정보를 선택하여 확장합니다. Azure Cosmos DB 역할 기반 액세스 제어에 대한 리소스가 배포되는지 확인합니다.