연습 - 템플릿 사양 업데이트 및 버전

완료됨

이제 조직 전체에서 Azure Cosmos DB 템플릿 사양을 사용하여 많은 새 Azure Cosmos DB 계정을 프로비전합니다. 따라서 모두 연속 백업을 사용하도록 구성됩니다.

보안 팀에서 최근 Azure Cosmos DB 보안 기능을 검토했습니다. 새 계정은 Microsoft Entra 인증 및 Azure Cosmos DB 역할 기반 액세스 제어를 사용해야 하기로 결정했습니다.

이 연습에서는 업데이트된 인증 구성을 포함하는 새 버전으로 템플릿 사양을 업데이트합니다.

프로세스 중에 다음을 수행합니다.

  • 템플릿을 업데이트하여 백업 정책을 다시 구성하세요.
  • 새 버전의 템플릿 사양을 게시하세요.
  • 템플릿 사양이 업데이트 되었는지 확인합니다.
  • 다른 Azure Cosmos DB 계정을 배포하여 새 버전의 템플릿 사양을 테스트합니다.

템플릿 업데이트

  1. Visual Studio Code에서 azuredeploy.json 파일을 엽니다.

  2. 다음 변경 내용을 포함하도록 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'))]"
          ]
        }
      ]
    }
    
  3. 파일을 저장합니다.

  1. Visual Studio Code에서 main.bicep 파일을 엽니다.

  2. 다음 변경 내용을 포함하도록 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
      }
    }
    
  3. 파일을 저장합니다.

새로운 버전의 템플릿 사양 게시

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

템플릿 사양을 확인합니다.

  1. 브라우저에서 Azure Portal로 돌아갑니다. 리소스 그룹으로 이동합니다.

  2. 템플릿 사양을 선택합니다. 이제 최신 버전이 2.0으로 나열되는 것을 볼 수 있습니다.

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

  3. 버전 메뉴 항목을 선택합니다. 이제 두 버전이 모두 나열되는 것을 볼 수 있습니다.

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

    템플릿 사양 버전을 사용하면 필요한 경우 템플릿 사양의 이전 버전으로 돌아갈 수 있습니다.

새 템플릿 사양 버전 배포

  1. 다음 Azure PowerShell 명령을 실행하여 새 템플릿 사양 버전의 리소스 ID를 가져옵니다.

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

    Versions 속성을 사용하여 템플릿 사양 버전의 리소스 ID를 가져옵니다.

  2. 새 템플릿 사양 버전에는 사용자 계정 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를 사용하여 귀하의 사용자 프로필을 쿼리합니다.

  3. Visual Studio Code 터미널에서 이 Azure PowerShell 명령을 사용하여 템플릿 사양을 배포합니다.

    New-AzResourceGroupDeployment `
      -TemplateSpecId $templateSpecVersionResourceId `
      -roleAssignmentPrincipalId $userObjectId
    
  1. 다음 Azure CLI 명령을 실행하여 템플릿 사양 버전의 리소스 ID를 가져옵니다.

    id=$(az ts show \
     --name ToyCosmosDBAccount \
     --resource-group "<rgn>[sandbox resource group name]</rgn>" \
     --version "2.0" \
     --query "id")
    
  2. Visual Studio Code 터미널에서 이 Azure CLI 명령을 사용하여 템플릿 사양을 배포합니다.

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

배포를 완료하는 데 1~2분 정도 걸릴 수 있습니다.

배포 확인

  1. 브라우저에서 Azure Portal로 돌아갑니다. 리소스 그룹으로 이동합니다.

  2. 배포 옆에 있는 2 성공을 선택합니다.

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

  3. 가장 최근의 배포를 선택합니다.

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

  4. 배포 세부 정보를 선택하여 확장합니다. Azure Cosmos DB 역할 기반 액세스 제어에 대한 리소스가 배포되는지 확인합니다.

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