С помощью Python как я могу указать, в каком регионе (местоположении) должен храниться шаблон экземпляра Google Cloud?

Вопрос или проблема

У меня есть код, который может создавать шаблоны экземпляров Google Cloud Compute Engine, но я не могу сделать так, чтобы он создавал шаблоны экземпляров в определённом регионе (например, europe-north1).

введите описание изображения здесь

create_template

from __future__ import annotations

from google.cloud import compute_v1

from src.routes.run_fw_engagements.c_instance_template.helpers.wait_for_extended_operation import wait_for_extended_operation

def create_template(project_id: str, template_name: str, network_tags: list, startup_script: str, instance_template_region: str) -> compute_v1.InstanceTemplate:
    """
    Создаёт новый шаблон экземпляра с указанным именем и конкретной
    конфигурацией экземпляра.

    Аргументы:
        project_id: идентификатор проекта или номер проекта Cloud.
        template_name: имя нового шаблона для создания.
        network_tags: список сетевых меток, которые будут применены к экземпляру.
        startup_script: сценарий запуска, который будет выполнен при создании экземпляра.
        instance_template_region: место (зона или регион), где будут запускаться экземпляры.

    Возвращает:
        Объект InstanceTemplate, который представляет новый шаблон экземпляра.
    """
    # Шаблон описывает размер и исходный образ загрузочного диска,
    # который будет прикреплён к экземпляру.
    disk = compute_v1.AttachedDisk()
    initialize_params = compute_v1.AttachedDiskInitializeParams()
    initialize_params.source_image = (
        "projects/ubuntu-os-cloud/global/images/family/ubuntu-2204-lts"
    )
    initialize_params.disk_size_gb = 10
    disk.initialize_params = initialize_params
    disk.auto_delete = True
    disk.boot = True

    # Шаблон подключает экземпляр к сети по умолчанию.
    network_interface = compute_v1.NetworkInterface()
    network_interface.name = "global/networks/default"

    # Шаблон позволяет экземпляру использовать внешний IP-адрес.
    access_config = compute_v1.AccessConfig()
    access_config.name = "External NAT"
    access_config.type_ = "ONE_TO_ONE_NAT"
    access_config.network_tier = "PREMIUM"
    network_interface.access_configs = [access_config]

    # Добавить свойства шаблона
    template = compute_v1.InstanceTemplate()
    template.name = template_name
    template.properties.disks = [disk]
    template.properties.machine_type = "e2-micro"
    template.properties.network_interfaces = [network_interface]
    template.properties.tags = compute_v1.Tags(items=network_tags)

    # Добавить сценарий запуска, OS Login и расположение в метаданные
    metadata = compute_v1.Metadata()
    metadata.items = [
        compute_v1.Items(key="startup-script", value=startup_script),
        compute_v1.Items(key="enable-oslogin", value="true"),
        compute_v1.Items(key="enable-oslogin-2fa", value="true"),
        compute_v1.Items(key="instance-template-region", value=instance_template_region)  # Добавить расположение в метаданные для справки
    ]
    template.properties.metadata = metadata

    # Создание клиента
    template_client = compute_v1.InstanceTemplatesClient()
    operation = template_client.insert(
        project=project_id, instance_template_resource=template
    )

    wait_for_extended_operation(operation, "создание шаблона экземпляра")

    response = template_client.get(project=project_id, instance_template=template_name)

    # Вернуть ответ или полезную информацию о шаблоне
    return response

if __name__ == '__main__':
    startup_script = """#!/bin/bash
    sudo apt update
    sudo apt install -y apache2
    systemctl start apache2
    """
    create_template(
        project_id="sindre-dev",
        template_name="template-test-10",
        network_tags=["mytag-test"],
        startup_script=startup_script,
        instance_template_region="europe-north1"
    )

wait_for_extended_operation

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation

def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Ожидает завершения длительной (долгосрочной) операции.

    Если операция успешна, она вернёт свой результат.
    Если операция завершилась с ошибкой, будет вызвано исключение.
    Если во время выполнения операции были предупреждения,
    они будут напечатаны в sys.stderr.

    Аргументы:
        operation: длительная операция, на которую вы хотите подождать.
        verbose_name: (необязательно) более подробное имя операции,
            используется только при сообщении об ошибках и предупреждениях.
        timeout: сколько времени (в секундах) ждать завершения операции.
            Если None, ждать бесконечно.

    Возвращает:
        Всё, что возвращает operation.result().

    Вызывает:
        Этот метод вызовет исключение, полученное от `operation.exception()`
        или RuntimeError, если исключение не установлено, но для `operation`
        установлено значение `error_code`.

        В случае, если операция занимает больше `timeout` секунд для завершения,
        будет вызвано `concurrent.futures.TimeoutError`.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Ошибка во время {verbose_name}: [Код: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"ID операции: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Предупреждения во время {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result

Как я могу убедиться, что шаблон экземпляра создан в instance_template_region="europe-north1"?

Ответ или решение

Чтобы создать экземпляр шаблона в Google Cloud в определенном регионе (например, europe-north1), вам нужно учесть несколько моментов. Важно отметить, что шаблоны экземпляров Google Cloud имеют глобальный охват, что означает, что они не привязаны к конкретному региону или зоне. Однако вы можете указать, где фактически создаются экземпляры на основе этого шаблона, установив соответствующую зону или регион при создании экземпляров.

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

  1. Убедитесь, что вы создаете экземпляр шаблона с необходимыми параметрами.
  2. Метаданные о регионе не влияют на создание самого шаблона, но могут быть полезны для вас или вашей команды.

Here’s a modified version of your create_template function in Russian:

from __future__ import annotations
from google.cloud import compute_v1
from src.routes.run_fw_engagements.c_instance_template.helpers.wait_for_extended_operation import wait_for_extended_operation

def create_template(project_id: str, template_name: str, network_tags: list, startup_script: str, instance_template_region: str) -> compute_v1.InstanceTemplate:
    """
    Создание нового шаблона экземпляра с заданным именем и конкретной конфигурацией экземпляра.

    Args:
        project_id: ID проекта или номер проекта Cloud, который вы используете.
        template_name: имя нового шаблона для создания.
        network_tags: Список сетевых тегов для применения к экземпляру.
        startup_script: Скрипт, который будет выполняться при создании экземпляра.
        instance_template_region: Локация (зона или регион), где будет запускаться экземпляр.

    Returns:
        InstanceTemplate объект, представляющий новый шаблон экземпляра.
    """
    disk = compute_v1.AttachedDisk()
    initialize_params = compute_v1.AttachedDiskInitializeParams()
    initialize_params.source_image = (
        "projects/ubuntu-os-cloud/global/images/family/ubuntu-2204-lts"
    )
    initialize_params.disk_size_gb = 10
    disk.initialize_params = initialize_params
    disk.auto_delete = True
    disk.boot = True

    network_interface = compute_v1.NetworkInterface()
    network_interface.name = "global/networks/default"

    access_config = compute_v1.AccessConfig()
    access_config.name = "External NAT"
    access_config.type_ = "ONE_TO_ONE_NAT"
    access_config.network_tier = "PREMIUM"
    network_interface.access_configs = [access_config]

    template = compute_v1.InstanceTemplate()
    template.name = template_name
    template.properties.disks = [disk]
    template.properties.machine_type = "e2-micro"
    template.properties.network_interfaces = [network_interface]
    template.properties.tags = compute_v1.Tags(items=network_tags)

    # Добавляем метаданные
    metadata = compute_v1.Metadata()
    metadata.items = [
        compute_v1.Items(key="startup-script", value=startup_script),
        compute_v1.Items(key="enable-oslogin", value="true"),
        compute_v1.Items(key="enable-oslogin-2fa", value="true"),
        compute_v1.Items(key="instance-template-region", value=instance_template_region)  # Указываем регион в метаданных
    ]
    template.properties.metadata = metadata

    template_client = compute_v1.InstanceTemplatesClient()
    operation = template_client.insert(project=project_id, instance_template_resource=template)

    wait_for_extended_operation(operation, "Создание шаблона экземпляра")

    response = template_client.get(project=project_id, instance_template=template_name)

    return response

if __name__ == '__main__':
    startup_script = """#!/bin/bash
    sudo apt update
    sudo apt install -y apache2
    systemctl start apache2
    """
    create_template(
        project_id="sindre-dev",
        template_name="template-test-10",
        network_tags=["mytag-test"],
        startup_script=startup_script,
        instance_template_region="europe-north1"  # Указываем регион
    )

Объяснение кода

  1. Шаблоны экземпляров: Они хранятся глобально; вы создаете их в контексте проекта, а экземпляры, созданные на основе этих шаблонов, могут быть размещены в любом доступном для вашего проекта регионе или зоне.
  2. Метаданные: Вы добавляете метаданные, такие как instance-template-region, которые не повлияют на создание самого шаблона, но могут быть полезны для документирования и отслеживания.
  3. Создание экземпляра: Когда вы будете использовать этот шаблон для создания экземпляра, выбирайте нужный регион или зону.

Если вам важен именно 지역 шаблона для управления или отчетности, используйте метаданные. Просто помните, что шаблон не привязан к региону, и создание экземпляра будет зависеть от выбранной зоны во время его развертывания.

Оцените материал
Добавить комментарий

Капча загружается...