Используйте Azure SDK для Go для управления контрольными плоскостями

Узнайте, как подготовить, настроить и управлять ресурсами Azure программным способом с помощью Azure SDK для библиотек управления Go. Распространенные рабочие процессы уровня управления включают создание групп ресурсов, управление инфраструктурой хранилища и сетевой инфраструктурой, а также обработку операций жизненного цикла виртуальной машины, таких как создание, запуск, остановка, изменение размера, обновление и удаление. Если вы хотите ознакомиться с общими сведениями о том, как библиотеки управления интегрируются в Azure SDK для Go, начните с Обзор библиотек управления SDK Azure для Go. В этой статье рассматриваются шаблоны уровня управления Go, которые повторно используются в службах, а также ссылки на инструкции по плоскости данных, когда путь среды выполнения переходит от управления ресурсами к работе с данными службы.

Что такое плоскость управления Azure?

Плоскость управления Azure — это набор API, которые управляют жизненным циклом ресурсов Azure — создание, обновление, настройка и удаление. Каждая операция, выполняемая на портале Azure, Azure CLI или инструменте инфраструктуры как кода, в конечном итоге вызывает эти API уровня управления.

Azure SDK для Go предоставляет уровень управления через семейство пакетов arm* в github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/. Каждый пакет сопоставляется с поставщиком ресурсов Azure и соответствует согласованному шаблону:

  1. Проверка подлинности с помощью azidentity пакета.
  2. Создайте типизированный клиент для ресурса, которым требуется управлять.
  3. Вызов методов на клиенте для создания, чтения, обновления или удаления ресурсов.
  4. Обработка длительных операций с использованием поллеров.

Распространенные сценарии автоматизации плоскости управления Go:

  • Предоставление инфраструктуры для конвейеров развертывания
  • Управление операциями жизненного цикла виртуальной машины, такими как создание, обновление, удаление, запуск, остановка и изменение размера
  • Создание кастомных CLI и операторов для платформенных команд
  • Реализация выверки инфраструктуры в стиле GitOps
  • Автоматизация аудита соответствия требованиям и обнаружения смещения

Аутентификация

Для всех операций управления требуются учетные данные, прошедшие проверку подлинности, из пакета azidentity. Пакет предоставляет типы учетных данных для каждой среды, включая локальные разработки, конвейеры CI/CD и рабочие нагрузки, выполняемые в Azure. Все типы учетных данных реализуют один и тот же azcore.TokenCredential интерфейс, поэтому их можно заменить без изменения клиентского кода.

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

// Create credential that auto-discovers authentication (Azure CLI, env vars, managed identity)
cred, err := azidentity.NewDefaultAzureCredential(nil)

// Construct a client factory, then the typed client for management operations
clientFactory, err := armresources.NewClientFactory(subscriptionID, cred, nil)
rgClient := clientFactory.NewResourceGroupsClient()

В текущих arm* документах пакета обычно отображается шаблон фабрики клиентов, так как он централизованно распределяет общую конфигурацию для связанных клиентов. Многие пакеты также предоставляют прямые New<ResourceType>Client(subscriptionID, credential, options) конструкторы, но NewClientFactory(...).New<ResourceType>Client() это шаблон, который чаще всего отображается на pkg.go.dev. Для локальной разработки DefaultAzureCredential обычно распознает ваш вход в Azure CLI. В CI/CD и развернутых рабочих нагрузках можно переключаться на учетные данные на основе среды или управляемое удостоверение, не изменяя остальную часть клиентского кода.

Полное руководство по типам учетных данных и рекомендациям см. в разделе Аутентификация при помощи Azure SDK для Go и документации по пакету azidentity.

Клиентские пакеты и типизированные клиенты

Пакеты управления находятся в github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/<service>/arm<service>. Установите идентификационный пакет и только arm* пакеты, которые планируется использовать. Например, если вы управляете только виртуальными машинами и группами ресурсов, вам потребуется armcompute только и armresources. Каждый пакет содержит клиентов для ресурсов в этом сервисе. Например, armcompute имеет клиенты для виртуальных машин, дисков, образов и связанных вычислительных ресурсов.

Один пакет управления часто содержит несколько клиентов, при этом каждый клиент ориентирован на один тип ресурса или группу операций. Например, armcompute включает клиенты для виртуальных машин, дисков, образов и связанных ресурсов. Выбрав пакет для службы, создайте одну фабрику клиентов и повторно используйте ее для создания типизированных клиентов, соответствующих ресурсам, которым требуется управлять.

clientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)
if err != nil {
	return err
}
vmClient := clientFactory.NewVirtualMachinesClient()

Паттерн пакета и фабрики клиентов применим во всех resourcemanager модулях. Это полезная комбинация клавиш при просмотре pkg.go.dev или при просьбе агента подобрать подходящего клиента для задачи.

Длительные операции

Многие операции управления, такие как создание кластеров, удаление групп ресурсов и обновление инфраструктуры, асинхронно выполняются. Методы, имеющие префикс Begin, начинают выполнение на стороне сервера и немедленно возвращают средство опроса. Код может решить, следует ли ждать или продолжать выполнять другие действия:

// Start an asynchronous operation (returns immediately)
poller, err := client.BeginCreateOrUpdate(ctx, resourceGroupName, parameters, nil)
if err != nil {
	return err
}

// Block until the operation completes or fails
result, err := poller.PollUntilDone(ctx, nil)
if err != nil {
	return err
}

Успешный вызов Begin* только означает, что Azure принял запрос. Операция по-прежнему может завершиться ошибкой позже во время выполнения опроса. Поэтому и начальный вызов, и PollUntilDone требуют обработки ошибок. Используйте PollUntilDone, когда вам нужен самый простой процесс. Используйте poller.Poll и poller.Done когда вам нужна настраиваемая логика ожидания или отчеты о ходе выполнения.

Дополнительные сведения о шаблонах см. в разделе Общие шаблоны использования в Azure SDK для Go.

Обработка ошибок

Операции управления возвращают структурированные ошибки, которые можно проверить для определенных кодов ошибок:

import "github.com/Azure/azure-sdk-for-go/sdk/azcore"

// Check if the error is an Azure service error with structured details
var respErr *azcore.ResponseError
if errors.As(err, &respErr) {
	fmt.Printf("Error code: %s\n", respErr.ErrorCode)
	fmt.Printf("Status code: %d\n", respErr.StatusCode)
}

Большинство CreateOrUpdate операций являются идемпотентными. Вызов их на существующий ресурс не приводит к сбою, а обновляет ресурс.

Подготовка примера ресурса

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

package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"time"

	"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"
)

func main() {
	// Read subscription ID from environment (avoid hardcoding)
	subscriptionID := os.Getenv("AZURE_SUBSCRIPTION_ID")
	if subscriptionID == "" {
		log.Fatal("AZURE_SUBSCRIPTION_ID not set")
	}

	// Create credential that auto-discovers authentication
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	if err != nil {
		log.Fatalf("failed to create credential: %v", err)
	}

	// Set a timeout for the entire operation (prevents hanging indefinitely)
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
	defer cancel()

	// Create a client factory for this management package
	clientFactory, err := armresources.NewClientFactory(subscriptionID, cred, nil)
	if err != nil {
		log.Fatalf("failed to create client factory: %v", err)
	}

	// Create the typed client for resource groups
	rgClient := clientFactory.NewResourceGroupsClient()

	// Many ARM models use pointer fields for optional values.
	resp, err := rgClient.CreateOrUpdate(ctx, "example-rg", armresources.ResourceGroup{
		Location: to.Ptr("eastus"),
		Tags: map[string]*string{
			"env":  to.Ptr("dev"),
			"team": to.Ptr("platform"),
		},
	}, nil)
	if err != nil {
		log.Fatalf("failed to create or update resource group: %v", err)
	}

	fmt.Printf("resource group %s ready in %s\n", *resp.Name, *resp.Location)
}

Группы ресурсов

Пакет armresources управляет группами ресурсов — основными контейнерами организации в Azure. Каждый ресурс Azure существует в группе ресурсов, которая служит отправной точкой для любого рабочего процесса.

Используйте его для создания и обновления групп ресурсов с расположением и тегами, списка групп в подписке и удаления групп вместе со всеми содержащимися ресурсами. Создание группы ресурсов является синхронным и идемпотентным. Удаление является асинхронным и постоянным.

Перечисление групп ресурсов также представляет собой важный шаблон управления: для многих операций чтения используется механизм пейджинга. При перечислении групп ресурсов или других крупных коллекций ARM создайте пейджер и итерацию, пока pager.More() не завершится false.

pager := rgClient.NewListPager(nil)
for pager.More() {
	page, err := pager.NextPage(ctx)
	if err != nil {
		return err
	}

	for _, group := range page.ResourceGroupListResult.Value {
		fmt.Println(*group.Name)
	}
}

Пример кода управления группами ресурсов.

Руководство по началу работы см. в документации по пакету armresources.

Виртуальные машины

Пакет armcompute является каноническим примером управления контрольной плоскостью, поскольку управление жизненным циклом виртуальных машин включает в себя в основном задачи: создание или обновление виртуальной машины, запуск или остановка, изменение ее размера и удаление. В Go эти рабочие процессы используют тот же шаблон и шаблон фабрики клиентов, показанные в примере группы ресурсов, и как только этот шаблон применяется, его можно использовать для вычислительных операций, не изменяя подход к аутентификации.

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

clientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)
if err != nil {
	return err
}
vmClient := clientFactory.NewVirtualMachinesClient()

Полные примеры виртуальных машин и рекомендации, специфичные для операций, см. в существующих примерах управления виртуальными машинами и документации по пакету armcompute. Используйте эти ссылки для полных моделей запросов и подробных сведений о длительных операциях вместо дублирования шаблонов больших виртуальных машин в этой статье.

Key Vault

Пакет armkeyvault управляет жизненным циклом экземпляров Azure Key Vault. Этот пакет обрабатывает плоскость управления для инфраструктуры хранилища. Используйте отдельные azsecretsazkeysazcertificates пакеты плоскости данных для чтения и записи секретов, ключей и сертификатов.

Используйте этот пакет для подготовки хранилищ с соответствующим номером SKU и параметрами безопасности, такими как обратимое удаление и защита от очистки. Вы также можете управлять политиками доступа для субъектов, настраивать сетевой доступ и частные конечные точки и включать ведение журнала диагностики. Вы можете интегрировать подготовку хранилища в рабочие процессы подключения приложений.

пример кода управления Key Vault.

Сведения о клиентах Key Vault на стороне среды выполнения см. в разделе Использование Azure SDK для операций плоскости данных.

Руководство по началу работы см. в документации по пакету armkeyvault.

AKS-кластеры

Пакет armcontainerservice управляет кластерами Служба Azure Kubernetes в течение всего жизненного цикла.

Используйте этот пакет для создания кластеров с настраиваемой сетью, версией Kubernetes и управляемым удостоверением. Вы можете добавлять и масштабировать пулы узлов, обновлять версии уровня управления и узлов, включать такие надстройки, как Политика Azure и мониторинг, а также запрашивать работоспособность кластера для оперативных панелей мониторинга. Все операции кластера являются длительными и следуют шаблону опроса.

пример кода управления AKS.

Руководство по началу работы см. в документации по пакету armcontainerservice.

RBAC и авторизация

Пакет armauthorization управляет Azure Role-Based контроль доступа. Используйте его для автоматизации политик доступа с минимальными привилегиями в подписках и группах ресурсов.

Используйте его для перечисления и поиска предопределенных ролей, назначения ролей субъектам (пользователям, служебным субъектам, управляемым удостоверениям или группам) в любой области, создания настраиваемых определений ролей с подробными разрешениями, а также аудита назначений для отчетов о соответствии требованиям и обнаружения дрифтов. Назначьте роли группам, а не отдельным лицам, и используйте встроенные роли, где это возможно.

Руководство по началу работы см. в документации по пакету armauthorization.

Виртуальные сети и безопасность сети

Пакет armnetwork управляет инфраструктурой виртуальных сетей Azure.

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

пример кода управления сетью.

Руководство по началу работы см. в документации по пакету armnetwork.

Реестр контейнеров

Пакет armcontainerregistry управляет Реестр контейнеров Azure экземплярами.

Используйте его для подготовки реестров с соответствующим SKU и георепликацией, настройки проверки подлинности (администратора, субъекта-службы или управляемого удостоверения), управления веб-перехватчиками для CI/CD, включения сканирования уязвимостей и применения политик хранения к изображениям. Реестр контейнеров часто используется вместе с Служба Azure Kubernetes. Сначала подготовьте реестр, а затем сошлитесь на него во время создания кластера.

пример кода управления реестром Container Registry.

Руководство по началу работы см. в документации по пакету armcontainerregistry.

Учетные записи хранения

Пакет armstorage управляет учетными записями служба хранилища Azure.

Используйте его для создания учетных записей хранения с правильным уровнем производительности и избыточности, управления ключами доступа и разделенными подписями доступа, настройки политик жизненного цикла BLOB-объектов и установки журнала диагностики. Учетные записи хранения являются распространенной зависимостью для многих приложений, поэтому автоматизация подготовки и настройки является общим сценарием уровня управления.

пример кода управления учетными записями Storage.

Руководство по началу работы см. в документации по пакету armstorage.

Дальнейшие действия