Развертывание шаблона Azure Resource Manager с помощью пакета SDK Azure для Go

В этом руководстве вы используете пакет SDK Azure для Go для развертывания шаблона Azure Resource Manager.

Azure Resource Manager — это служба развертывания и управления для Azure. Он позволяет создавать, обновлять и удалять ресурсы в учетной записи Azure. Шаблоны Azure Resource Manager декларативно описывают инфраструктуру как код в документах JSON.

В конце этого руководства вы напишете и развернете шаблон Azure Resource Manager с помощью Go.

Предпосылки

Создание модуля

В этом разделе описано, как создать модуль Go и установить необходимые пакеты azure SDK. Затем вы создадите основной файл приложения и добавьте код, который развертывает шаблон Azure Resource Manager.

  1. Создайте новый каталог с именем deployARM-how-to. Затем перейдите в этот каталог.

    mkdir deployARM-how-to
    cd deployARM-how-to
    
  2. go mod init Выполните команду, чтобы создать файл go.mod и файл go.sum.

    go mod init deployARM-how-to
    
  3. Пакет SDK Azure для Go содержит несколько пакетов для работы с Azure. Для прохождения этого руководства вам понадобятся пакеты azcore/to, azidentity и armresources.

    go get Выполните команду, чтобы скачать эти пакеты:

    go get github.com/Azure/azure-sdk-for-go/sdk/azcore/to
    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
    go get github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources
    
  4. Создайте файл с именем main.go.

    touch main.go
    
  5. Откройте main.go в редакторе и добавьте следующий код, который проходит проверку подлинности в Azure, создает группу ресурсов и развертывает шаблон Azure Resource Manager:

    package main
    
    import (
    	"context"
    	"encoding/json"
    	"fmt"
    	"log"
    	"os"
    
    	"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
    	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    	"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
    )
    
    const (
    	resourceGroupName     = "deployARM-how-to"
    	resourceGroupLocation = "eastus"
    	deploymentName        = "deployARM-how-to"
    	templateFile          = "template.json"
    )
    
    var (
    	ctx = context.Background()
    )
    
    // Read a JSON file from the given path.
    
    func readJSON(path string) (map[string]interface{}, error) {
    	data, err := os.ReadFile(path)
    	if err != nil {
    		log.Fatalf("failed to read file: %v", err)
    	}
    	contents := make(map[string]interface{})
    	_ = json.Unmarshal(data, &contents)
    	return contents, nil
    }
    
    func main() {
    	subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID")
    
    	// Authenticate to Azure
    
    	cred, err := azidentity.NewDefaultAzureCredential(nil)
    	if err != nil {
    		log.Fatalf("failed to obtain a credential: %v", err)
    	}
    
     	// Create a resource group.
    
    	client, err := armresources.NewResourceGroupsClient(subscriptionId, cred, nil)
    	if err != nil {
    		log.Fatalf("failed to create client: %v", err)
    	}
    	resp, err := client.CreateOrUpdate(context.Background(), resourceGroupName, armresources.ResourceGroup{
    		Location: to.Ptr(resourceGroupLocation),
    	}, nil)
    	if err != nil {
    		log.Fatalf("failed to obtain a response: %v", err)
    	}
    	log.Printf("resource group ID: %s\n", *resp.ResourceGroup.ID)
    
    	// Read the template file.
    
    	template, err := readJSON(templateFile)
    	if err != nil {
    		return
    	}
    
    	// Deploy the Azure Resource Manager template.
    
    	deploymentsClient, err := armresources.NewDeploymentsClient(subscriptionId, cred, nil)
    	if err != nil {
    		log.Fatalf("failed to create client: %v", err)
    	}
    	deploy, err := deploymentsClient.BeginCreateOrUpdate(
    		ctx,
    		resourceGroupName,
    		deploymentName,
    		armresources.Deployment{
    			Properties: &armresources.DeploymentProperties{
    				Template: template,
    				Mode:     to.Ptr(armresources.DeploymentModeIncremental),
    			},
    		},
    		nil,
    	)
    	if err != nil {
    		log.Fatalf("failed to deploy template: %v", err)
    	}
    
    	fmt.Println(deploy)
    }
    

Создание шаблона Azure Resource Manager

  1. В каталоге deployARM-how-to создайте другой файл с именем template.json.

  2. template.json Откройте файл и добавьте следующий код шаблона Azure Resource Manager, создающий учетную запись хранения Azure:

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
        },
        "functions": [],
        "variables": {},
        "resources": [{
            "name": "<StorageAccountName>",
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2021-04-01",
            "tags": {
                "displayName": "<StorageAccountDisplayName>"
            },
            "location": "EastUS",
            "kind": "StorageV2",
            "sku": {
                "name": "Premium_LRS",
                "tier": "Premium"
            }
        }],
        "outputs": {}
    }
    
  3. Замените <StorageAccountName> и <StorageAccountDisplayName> на допустимое значение имени хранилища.

Дополнительные сведения о шаблонах Azure Resource Manager см. в обзоре шаблонов Azure Resource Manager.

Вход в Azure

В этом коде используется тип DefaultAzureCredential из модуля удостоверений Azure для Go для проверки подлинности в Azure. DefaultAzureCredential поддерживает множество типов учетных данных для проверки подлинности в Azure с помощью OAuth с идентификатором Microsoft Entra. В этой статье используются учетные данные пользователя, с которыми вы входите в Azure CLI.

Если вы еще не сделали этого, войдите в Azure CLI:

az login

Если несколько подписок связаны с вашей учетной записью, используйте команду az account list , чтобы получить список этих подписок. Используйте команду az account set , чтобы задать активную подписку. Установив активную подписку, вы гарантируете, что все команды CLI, выполняемые в остальной части этой статьи, выполняются в вашей предполагаемой подписке.

Замечание

При локальном запуске DefaultAzureCredential также поддерживает учетные данные для входа в Azure Developer CLI (AZD) или служебного принципала Azure, настроенного в переменных среды. Дополнительные сведения обо всех поддерживаемых типах учетных данных см. в статье "Проверка подлинности Azure" с помощью модуля удостоверений Azure для Go.

Запуск приложения

Прежде чем развернуть шаблон, необходимо определить идентификатор подписки Azure в качестве переменной среды.

  1. Чтобы получить идентификатор подписки, выполните следующую команду az account show .

    az account show --query id --output tsv
    
  2. Задайте переменную среды AZURE_SUBSCRIPTION_ID с идентификатором подписки. Замените <AzureSubscriptionId> идентификатором своей подписки.

    export AZURE_SUBSCRIPTION_ID=<AzureSubscriptionId>
    
  3. go run Выполните команду, чтобы развернуть шаблон:

    go run main.go
    

Troubleshoot

Если развертывание учетной записи хранения завершается ошибкой, убедитесь, что вы использовали допустимое значение имени хранилища. Имена учетных записей хранения должны быть от 3 до 24 символов длиной и могут содержать только строчные буквы и цифры.

Если программа возвращает ошибку, связанную с проверкой подлинности или авторизацией, проверьте следующие элементы:

  • Если ошибка начинается с метки времени и следующего текста: "Не удалось получить ответ: DefaultAzureCredential: не удалось получить токен". Убедитесь, что вы вошли в Azure CLI, как показано ранее.

  • Если ошибка является ошибкой авторизации или запрещена (код состояния 401 или 403), убедитесь, что учетная запись пользователя находится в роли Azure, которая предоставляет ему права на создание групп ресурсов и добавление ресурсов в подписку. Примерами являются встроенные ролиучастника или владельца Azure. Сведения о назначении ролей Azure пользователю см. в статье "Назначение ролей Azure с помощью Azure CLI".

Дополнительные сведения об устранении неполадок см. в статье "Устранение неполадок с проверкой подлинности удостоверений Azure".

Проверка ресурсов в Azure

Для проверки успешности создания ресурсов в Azure можно использовать несколько команд Azure CLI. Следующие команды — это некоторые примеры.

Чтобы убедиться, что группа ресурсов существует, выполните команду az group.

az group exists --name deployARM-how-to

Вы можете перечислить ресурсы в группе с помощью команды az resource list .

az resource list --resource-group deployARM-how-to

Можно проверить результаты развертывания (outputResources) и свойства с помощью команды az deployment group show.

az deployment group show -g deployARM-how-to -n deployARM-how-to

Очистите ресурсы

Ресурсы в Azure могут приводить к текущим расходам. Не забудьте очистить ресурсы, созданные в этой статье.

Развертывание пустого шаблона в полном режиме удаляет все ресурсы в группе ресурсов. Это простой способ очистки ресурсов без удаления самой группы ресурсов.

  1. Создайте пустой шаблон с именем empty-template.json.

  2. Откройте empty-template.json в редакторе и добавьте следующий код:

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {},
        "variables": {},
        "resources": [],
        "outputs": {}
    }
    
  3. main.go Откройте файл.

  4. Обновите значение константы templateFile на empty-template.json.

    const (
    	resourceGroupName     = "deployARM-how-to"
    	resourceGroupLocation = "eastus"
    	deploymentName        = "deployARM-how-to"
    	templateFile          = "empty-template.json"
    )
    
  5. Измените время развертывания с инкрементного на полное, изменив свойства режима Mode на DeploymentModeComplete. Дополнительные сведения о режимах развертывания см. в режимах развертывания в Azure Resource Manager.

    deploy, err = deploymentsClient.BeginCreateOrUpdate(
    	ctx,
    	resourceGroupName,
    	deploymentName,
    	armresources.Deployment{
    		Properties: &armresources.DeploymentProperties{
    			Template: template,
    			Mode:     to.Ptr(armresources.DeploymentModeComplete), //Deployment Mode is here
    		},
    	},
    	nil,
    )
    
  6. go run Выполните команду, чтобы развернуть пустой шаблон и удалить созданную ранее учетную запись хранения.

    go run main.go
    

Вместо использования развертывания можно удалить группу ресурсов и все ее ресурсы, выполнив следующую команду Azure CLI:

az group delete --resource-group deployARM-how-to

Дальнейшие шаги