[Документация Yandex Cloud](../../../index.md) > [Yandex Compute Cloud](../../index.md) > [Концепции](../index.md) > [Группы виртуальных машин](index.md) > YAML-спецификация

# Спецификация группы виртуальных машин в формате YAML

Группу ВМ можно создать или изменить по спецификации в формате [YAML](https://ru.wikipedia.org/wiki/YAML). В спецификации описываются:

* базовые атрибуты и настройки группы — имя, описание, [метки](../../../resource-manager/concepts/labels.md), [сервисный аккаунт](../../../iam/concepts/users/service-accounts.md) и защита от удаления;
* [шаблон ВМ](instance-template.md) и использующиеся в нем [переменные](variables-in-the-template.md);
* политики [распределения](policies/allocation-policy.md), [развертывания](policies/deploy-policy.md), [масштабирования](policies/scale-policy.md) и [восстановления](policies/healing-policy.md);
* настройки балансировки трафика между ВМ с помощью [Yandex Network Load Balancer](../../../network-load-balancer/index.md) или [Yandex Application Load Balancer](../../../application-load-balancer/index.md).

{% note info %}

Также группу ВМ можно создать с помощью [Terraform](https://terraform.io) по описанию, схожему со спецификацией в формате YAML. Подробнее читайте в [руководстве по началу работы с Terraform](../../../tutorials/infrastructure-management/terraform-quickstart.md), [инструкции по созданию группы ВМ](../../operations/instance-groups/create-fixed-group.md) и [справочнике ресурса `yandex_compute_instance_group`](../../../terraform/resources/compute_instance_group.md).

{% endnote %}


## Пример {#example}

По следующей спецификации можно создать автоматически масштабируемую группу ВМ, как в [сценарии обработки сообщений из очереди Yandex Message Queue](../../tutorials/autoscale-monitoring.md):

```yaml
folder_id: b1gken0eihqn********
name: queue-autoscale-ig
instance_template:
  platform_id: standard-v3
  resources_spec:
    memory: 2g
    cores: 2
    core_fraction: 100
  boot_disk_spec:
    mode: READ_WRITE
    disk_spec:
      type_id: network-hdd
      size: 5g
      image_id: fd8m5bal0bi9********
  network_interface_specs:
    - network_id: enpocgefm44f********
      subnet_ids:
        - e2ljvdp4j276********
      primary_v4_address_spec: {
        one_to_one_nat_spec: {
          ip_version: IPV4
        }
      }
      security_group_ids:
        - enps0ar5s3ti********
  filesystem_specs:
    - mode: READ_WRITE
      device_name: sample-fs
      filesystem_id: epdccsrlalon********
  service_account_id: aje1ki4ae68u********
  network_settings:
    type: STANDARD
  scheduling_policy: {}
  placement_policy:
    placement_group_id: rmppvhrgm77g********
scale_policy:
  auto_scale:
    min_zone_size: 0
    max_size: 5
    measurement_duration: 60s
    warmup_duration: 0s
    stabilization_duration: 300s
    initial_size: 1
    auto_scale_type: REGIONAL
    custom_rules:
      - rule_type: WORKLOAD
        metric_type: GAUGE
        metric_name: queue.messages.stored_count
        labels:
          queue: queue-autoscale-queue
        target: 5
        service: message-queue
deploy_policy:
  max_unavailable: 1
  startup_duration: 0s
  strategy: OPPORTUNISTIC
  minimal_action: RESTART
auto_healing_policy:
  auto_healing_action: RESTART
allocation_policy:
  zones:
    - zone_id: kz1-a
service_account_id: ajefnb8427bh********
```


## Поля {#fields}

Список, структура и  англоязычные  описания полей спецификации представлены:

* в спецификации структуры [CreateInstanceGroupRequest](https://github.com/yandex-cloud/cloudapi/blob/master/yandex/cloud/compute/v1/instancegroup/instance_group_service.proto#L219) и [используемых в ней структур](https://github.com/yandex-cloud/cloudapi/blob/master/yandex/cloud/compute/v1/instancegroup/instance_group.proto) в репозитории [API](../../../glossary/rest-api.md) на GitHub (формат [Protobuf](https://ru.wikipedia.org/wiki/Protocol_Buffers));
* в описании метода [create](../../instancegroup/api-ref/InstanceGroup/create.md) ресурса `InstanceGroup` REST API (формат [JSON](https://ru.wikipedia.org/wiki/JSON));
* в описании вызова [InstanceGroupService/Create](../../instancegroup/api-ref/grpc/InstanceGroup/create.md) gRPC API.

Справочники API генерируются из спецификаций, размещенных на GitHub.

Некоторые поля первого уровня и вложенные в них поля также описаны на русском языке в разделах документации:

* [Шаблон виртуальной машины](instance-template.md) (поле `instance_template`).
* [Переменные в шаблоне виртуальной машины](variables-in-the-template.md) (поля `instance_template` и `variables`).
* [Политика распределения](policies/allocation-policy.md) (поле `allocation_policy`).
* [Политика развертывания](policies/deploy-policy.md) (поле `deploy_policy`).
* [Политика масштабирования](policies/scale-policy.md) (поле `scale_policy`).
* [Политика восстановления](policies/healing-policy.md) (поле `auto_healing_policy`).
* [Проверки и автоматическое восстановление виртуальных машин в группе](autohealing.md) (поле `health_checks_spec`).
* [Интеграция группы ВМ с Network Load Balancer или Application Load Balancer](balancers.md) (поля `load_balancer_spec` и `application_load_balancer_spec`).

Эти разделы обновляются вручную. Они могут быть менее актуальными, чем справочники API и спецификация на GitHub.

## Преобразование JSON и Protobuf в YAML {#translation-to-yaml}

Создать YAML-спецификацию по описанию в формате JSON или Protobuf можно по следующим правилам: 

* Объекты (JSON), структуры `message` и поля типа `map` (Protobuf) преобразуются в словарные объекты YAML (пары «ключ — значение»). Ключи объектов и названия полей преобразуются из `lowerCamelCase` и `CamelCase` в `snake_case`.

  {% list tabs group=data_format %}
  
  - JSON {#json}
  
    ```json
    "targetGroupSpec": {
      "name": "spec-example-tg",
      "description": "ALB target group for example instance group",
      "labels": {
        "foo": "bar",
        "environment": "production"
      }
    }
    ```
  
  - Protobuf {#protobuf}
  
    ```protobuf
    message TargetGroupSpec {
      string name = 1;
      string description = 2;
      map<string, string> labels = 3;
    }
    ```
  
  - YAML {#yaml}
  
    ```yaml
    target_group_spec:
      name: spec-example-tg
      description: ALB target group for example instance group
      labels:
        foo: bar
        environment: production
    ```
  
  {% endlist %}

* Массивы (JSON) и поля типа `repeated` (Protobuf) преобразуются в списки YAML.

  {% list tabs group=data_format %}
  
  - JSON {#json}
  
    ```json
    "variables": [
      {
        "key": "foo",
        "value": "bar"
      },
      {
        "key": "baz",
        "value": "foobar"
      }
    ]
    ```
  
  - Protobuf {#protobuf}
  
    ```protobuf
    message Variable {
      string key = 1;
      string value = 2;
    }
    
    repeated Variable variables = 1;
    ```
  
  - YAML {#yaml}
  
    ```yaml
    variables:
      - key: foo
        value: bar
      - key: baz
        value: foobar
    ```
  
  {% endlist %}

* Структуры типа `enum` (Protobuf) преобразуются в скалярные значения YAML — строки, соответствующие названиям полей в Protobuf.

  {% list tabs group=data_format %}
  
  - Protobuf {#protobuf}
  
    ```protobuf
    message AttachedDiskSpec {
      enum Mode {
        MODE_UNSPECIFIED = 0;
        READ_ONLY = 1;
        READ_WRITE = 2;
      }
      Mode mode = 1;
    }
    ```
  
  - YAML {#yaml}
  
    ```yaml
    attached_disk_spec:
      mode: READ_WRITE
    ```
  
  {% endlist %}

## Формат значений {#values}

В формате YAML все значения в словарных объектах неявно являются строками, использовать для их обозначения кавычки необязательно. Содержимое строк должно соответствовать типам, указанным в справочнике API или в спецификации в формате Protobuf: `string`, `int64`, `bool` и т. п.

### Суффиксы для типа `int64` {#int64}

В значениях типа `int64` поддерживаются следующие суффиксы:

Суффикс | Приставка и множитель | Пример
----- | ----- | -----
`k` | кило- (2^10^) | `640k` = 640 × 2^10^ = `655360`
`m` | мега- (2^20^) | `48m` = 48 × 2^20^ = `50331648`
`g` | гига- (2^30^) | `10g` = 10 × 2^30^ = `10737418240`
`t` | тера- (2^40^) | `4t` = 4 × 2^40^ = `4398046511104`
`p` | пета- (2^50^) | `2p` = 2 × 2^50^ = `2251799813685248`

Если в значении используется суффикс, перед ним должно стоять целое число.

### Тип `boolean` {#boolean}

В полях типа `bool` или `boolean` поддерживаются все значения, перечисленные в [спецификации формата YAML](https://yaml.org/type/bool.html):

* Истина: `y`, `Y`, `yes`, `Yes`, `YES`, `true`, `True`, `TRUE`, `on`, `On`, `ON`.
* Ложь: `n`, `N`, `no`, `No`, `NO`, `false`, `False`, `FALSE`, `off`, `Off`, `OFF`.

## Как создать или изменить группу ВМ по спецификации {#how}

Создать группу виртуальных машин по YAML-спецификации можно через интерфейс командной строки (CLI) или API. Подробнее читайте в инструкциях:

* [Создать группу виртуальных машин по спецификации в формате YAML](../../operations/instance-groups/create-from-yaml.md)
* [Изменить группу виртуальных машин по спецификации в формате YAML](../../operations/instance-groups/update-from-yaml.md)

## Примеры использования {#examples}

* [Работа с группой виртуальных машин с автоматическим масштабированием](../../tutorials/vm-autoscale/index.md)