Ćwiczenie — wdrażanie zasobu objętego zakresem subskrypcji

Ukończone

Ważne

Do wykonania tego ćwiczenia potrzebna jest własna subskrypcja platformy Azure. Ponadto mogą zostać naliczone opłaty. Jeśli nie masz jeszcze subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Projekt Teddybear jest w pełnym rozkwicie, a zespół badawczy czeka na udzielenie mu dostępu do nowej subskrypcji platformy Azure. Subskrypcja została już utworzona, ale przed udzieleniem zespołowi dostępu należy upewnić się, że wdraża tylko maszyny wirtualne zgodne z zasadami zespołu. Zespół powiedział, że nie chce wdrażać maszyn wirtualnych serii F ani G.

W tym ćwiczeniu utworzysz szablon Bicep, który konfiguruje subskrypcję na podstawie zasad zespołu.

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

  • Utwórz szablon Bicep, który ma zostać wdrożony w zakresie subskrypcji.
  • Dodaj definicję i przypisanie usługi Azure Policy.
  • Wdróż szablon i sprawdź wynik.

To ćwiczenie wymaga uprawnień do wdrażania zasobów w zakresie subskrypcji. Jeśli nie możesz spełnić tego wymagania przy użyciu bieżącego konta platformy Azure, możesz uzyskać bezpłatną wersję próbną i utworzyć nową subskrypcję i dzierżawę platformy Azure. Możesz też pominąć kroki wdrażania w tym ćwiczeniu.

W tym ćwiczeniu jest używane rozszerzenie Bicep dla programu Visual Studio Code. Pamiętaj, aby zainstalować to rozszerzenie w programie Visual Studio Code.

Tworzenie szablonu o zakresie subskrypcji

  1. Otwórz Visual Studio Code.

  2. Utwórz nowy plik o nazwie main.bicep.

  3. Zapisz pusty plik, aby program Visual Studio Code ładował narzędzia Bicep.

    Możesz wybrać pozycję Plik>Zapisz jako lub wybrać klawisze Ctrl+S w systemie Windows (⌘+S w systemie macOS). Pamiętaj, gdzie został zapisany plik. Na przykład możesz utworzyć folder scripts , aby go zapisać.

  4. Dodaj następującą zawartość do pliku main.bicep . Szablon zostanie wdrożony wkrótce. Dobrym pomysłem jest wpisanie go ręcznie zamiast kopiowania i wklejania, dzięki czemu można zobaczyć, jak narzędzie pomaga w pisaniu plików Bicep.

    targetScope = 'subscription'
    

    Ten wiersz kodu informuje Bicep, że szablon zostanie wdrożony w zakresie subskrypcji.

Dodawanie definicji zasad

  1. Poniżej dodanego wiersza dodaj następującą definicję zmiennej:

    var policyDefinitionName = 'DenyFandGSeriesVMs'
    
  2. W dolnej części pliku dodaj następującą definicję usługi Azure Policy:

    resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2020-03-01' = {
      name: policyDefinitionName
      properties: {
        policyType: 'Custom'
        mode: 'All'
        parameters: {}
        policyRule: {
          if: {
            allOf: [
              {
                field: 'type'
                equals: 'Microsoft.Compute/virtualMachines'
              }
              {
                anyOf: [
                  {
                    field: 'Microsoft.Compute/virtualMachines/sku.name'
                    like: 'Standard_F*'
                  }
                  {
                    field: 'Microsoft.Compute/virtualMachines/sku.name'
                    like: 'Standard_G*'
                  }
                ]
              }
            ]
          }
          then: {
            effect: 'deny'
          }
        }
      }
    }
    

    Zwróć uwagę, że definicja zasad ma zastosowanie tylko do zasobów, w których:

    • Typ zasobu jest równy Microsoft.Compute/virtualMachines.
    • Właściwość sku.name zaczyna się od Standard_F lub Standard_G.

    Podczas próby utworzenia zasobu zgodnego z tymi warunkami platforma Azure odmówi utworzenia zasobu.

    Ostrzeżenie

    Należy zachować ostrożność w przypadku używania efektu zasad odmowy dla definicji zasad, szczególnie w szerokim zakresie, takim jak subskrypcje i grupy zarządzania. Jeśli definicja nie została utworzona poprawnie, może mieć nieoczekiwane skutki, które mogą prowadzić do awarii. Lepiej zacząć od efektu zasad inspekcji , a następnie przełączyć się na efekt odmowy dopiero po tym, jak widziałeś, że działa dobrze w danym okresie.

    Tworzysz definicję zasad w zakresie subskrypcji. Oznacza to, że po wdrożeniu definicji będzie ona dostępna we wszystkich grupach zasobów w subskrypcji.

Przypisywanie zasad

Definicja zasad nie ma wpływu, dopóki nie zostanie zastosowana. W tym kroku wdrożysz drugi zasób o zakresie subskrypcji, który stosuje definicję zasad do subskrypcji.

  1. Poniżej definicji zmiennej policyDefinitionName dodaj następującą definicję zmiennej:

    var policyAssignmentName = 'DenyFandGSeriesVMs'
    
  2. W dolnej części pliku w obszarze zasobu definicji zasad dodaj następujące przypisanie zasad:

    resource policyAssignment 'Microsoft.Authorization/policyAssignments@2020-03-01' = {
      name: policyAssignmentName
      properties: {
        policyDefinitionId: policyDefinition.id
      }
    }
    

    Zwróć uwagę, że nie konfigurujesz jawnie przypisania zasad do zastosowania do całej subskrypcji. Bicep rozumie to, ponieważ szablon zostanie wdrożony w zakresie subskrypcji.

  3. Zapisz zmiany w pliku.

Weryfikowanie szablonu

Szablon powinien wyglądać następująco:

targetScope = 'subscription'

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2020-03-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2020-03-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

Jeśli tak nie jest, skopiuj przykład lub dostosuj szablon tak, aby był zgodny z przykładem.

Wdrażanie szablonu

Aby wdrożyć ten szablon na platformie Azure, musisz zalogować się na konto platformy Azure z poziomu terminalu programu Visual Studio Code. Upewnij się, że zainstalowano narzędzia interfejsu wiersza polecenia platformy Azure.

  1. W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.

  2. Jeśli powłoka wyświetlana po prawej stronie okna terminalu jest powłoka bash, prawidłowa powłoka jest otwarta i możesz przejść do następnej sekcji.

    Screenshot of the Visual Studio Code terminal window, with the bash option shown.

  3. Jeśli zostanie wyświetlona powłoka inna niż powłoka bash , wybierz strzałkę listy rozwijanej powłoki, a następnie wybierz pozycję Git Bash.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown shown and Git Bash Default selected.

  4. Na liście powłok terminali wybierz pozycję bash.

    Screenshot of the Visual Studio Code terminal window, with the bash terminal selected.

  5. W terminalu przejdź do katalogu, w którym zapisano szablon. Jeśli na przykład szablon został zapisany w folderze templates , możesz użyć następującego polecenia:

    cd templates
    

Instalowanie aplikacji Bicep

Uruchom następujące polecenie, aby upewnić się, że masz najnowszą wersję aplikacji Bicep:

az bicep install && az bicep upgrade

Logowanie się do platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure

  1. W terminalu programu Visual Studio Code zaloguj się do platformy Azure, uruchamiając następujące polecenie:

    az login
    
  2. W przeglądarce, która zostanie otwarta, zaloguj się do konta platformy Azure.

    W terminalu programu Visual Studio Code zostanie wyświetlona lista subskrypcji skojarzonych z tym kontem.

  3. Na liście znajdź subskrypcję, której chcesz użyć w tym ćwiczeniu.

    Jeśli pominięto listę z logowania, możesz użyć poniższego fragmentu kodu, aby ponownie wyświetlić listę subskrypcji.

    az account list --output table
    
  4. Ustaw domyślną subskrypcję dla wszystkich poleceń interfejsu wiersza polecenia platformy Azure uruchamianych w tej sesji.

    az account set --subscription "Your Subscription Name or ID"
    

Aby wdrożyć ten szablon na platformie Azure, zaloguj się do konta platformy Azure z poziomu terminalu programu Visual Studio Code. Upewnij się, że zainstalowano program Azure PowerShell.

  1. W menu Terminal wybierz polecenie New Terminal (Nowy terminal). Okno terminalu zwykle otwiera się w dolnej połowie ekranu.

  2. Jeśli powłoka wyświetlana po prawej stronie okna terminalu to powershell lub pwsh, prawidłowa powłoka jest otwarta i możesz przejść do następnej sekcji.

    Screenshot of the Visual Studio Code terminal window, with the pwsh option displayed in the shell dropdown list.

  3. Jeśli zostanie wyświetlona powłoka inna niż powershell lub pwsh , wybierz strzałkę listy rozwijanej powłoki, a następnie wybierz pozycję PowerShell.

    Screenshot of the Visual Studio Code terminal window, with the terminal shell dropdown list shown and PowerShell selected.

  4. Na liście powłok terminali wybierz pozycję powershell lub pwsh.

    Screenshot of the Visual Studio Code terminal window, with the PowerShell terminal selected.

  5. W terminalu przejdź do katalogu, w którym zapisano szablon. Jeśli na przykład szablon został zapisany w folderze templates , możesz użyć tego polecenia:

    Set-Location -Path templates
    

Instalowanie interfejsu wiersza polecenia Bicep

Aby użyć aplikacji Bicep z poziomu programu Azure PowerShell, zainstaluj interfejs wiersza polecenia Bicep.

Logowanie się na platformie Azure przy użyciu programu Azure PowerShell

  1. W terminalu programu Visual Studio Code zaloguj się do platformy Azure, uruchamiając następujące polecenie:

    Connect-AzAccount
    
  2. W przeglądarce, która zostanie otwarta, zaloguj się do konta platformy Azure.

  3. Pobierz identyfikator subskrypcji, której chcesz użyć w tym ćwiczeniu, uruchamiając następujące polecenie:

    Get-AzSubscription
    

    Identyfikatory subskrypcji znajdują się w drugiej kolumnie. Skopiuj drugą kolumnę. Wygląda na to, że cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. Ustaw domyślną subskrypcję dla wszystkich poleceń programu Azure PowerShell uruchamianych w tej sesji.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Wdrażanie szablonu na platformie Azure

W terminalu programu Visual Studio Code wdróż szablon przy użyciu następujących poleceń interfejsu wiersza polecenia platformy Azure:

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile

Zwróć uwagę, że tworzysz wdrożenie w zakresie subskrypcji przy użyciu az deployment sub create polecenia , a nie az deployment group create polecenia, do którego można użyć polecenia .

W terminalu programu Visual Studio Code wdróż szablon przy użyciu następujących poleceń programu Azure PowerShell:

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile

Zwróć uwagę, że zamiast polecenia cmdlet , do którego można użyć polecenia cmdlet, zamiast New-AzResourceGroupDeployment polecenia cmdlet, które można użyć do tworzenia wdrożenia New-AzSubscriptionDeployment w zakresie subskrypcji.

Należy również zauważyć, że jawnie określasz nazwę i lokalizację wdrożenia. Platforma Azure używa tych informacji do przechowywania metadanych wdrożenia.

Napiwek

Nazwa wdrożenia zawiera bieżącą datę. Dzięki temu będzie mniej prawdopodobne, że przypadkowo użyjesz tej samej nazwy co inne wdrożenie.

Wdrożenie może potrwać minutę lub dwie, a następnie zobaczysz pomyślne wdrożenie.

Uwaga

Jeśli zostanie wyświetlony komunikat o błędzie z kodem AuthorizationFailed, prawdopodobnie nie masz uprawnień do wdrażania zasobów w zakresie subskrypcji. Poproś administratora platformy Azure o przyznanie Ci uprawnień. Alternatywnie, jeśli nie możesz spełnić tego wymagania przy użyciu bieżącego konta platformy Azure, możesz uzyskać bezpłatną wersję próbną i utworzyć nową subskrypcję i dzierżawę platformy Azure.

Weryfikowanie wdrożenia

Wdrożenia w zakresie subskrypcji można wyświetlić w witrynie Azure Portal. Może to być przydatne, aby sprawdzić, czy wdrożenie zakończyło się pomyślnie i sprawdzić wyniki.

  1. Przejdź do portalu Azure Portal.

  2. W okienku po lewej stronie wybierz pozycję Subskrypcje.

  3. Wybierz subskrypcję.

  4. W polu Wyszukaj wprowadź ciąg Wdrożenia, a następnie wybierz element menu Wdrożenia.

    Screenshot of the Azure portal Search box and the Deployments menu item.

  5. W kolumnie Nazwa wdrożenia wybierz wdrożenie rozpoczynające się od zakresu podrzędnego, aby zobaczyć, jakie zasoby zostały wdrożone.

    Screenshot of the Azure portal interface showing the list of deployments.

  6. Wybierz pozycję Szczegóły wdrożenia, aby ją rozwinąć. W tym przypadku są wyświetlane dwa zasoby usługi Azure Policy.

    Screenshot of the Azure portal overview pane for the selected deployment.

Oczyszczanie zasobów

Pomyślnie wdrożono zasoby o zakresie subskrypcji. Możesz usunąć utworzone zasoby zasad, uruchamiając następujące polecenia:

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId

W następnej lekcji ćwiczenia ponownie wdrożysz te same zasoby zasad. Zostaną one utworzone ponownie, ale można je wyczyścić ponownie później.