Terraform пытается удалить весь блок вместо отдельных атрибутов

Я создаю собственный поставщик terraform, используя terraform-plugin-sdk.

Пожалуйста, простите меня, если это очевидно или ожидаемое поведение, я новичок в этом.

Удаление целого блока работает должным образом, и CRUD работает. Однако во время планирования, если я обновляю один атрибут, план показывает удаление всего блока и добавление его обратно.

func ResourceTest() *schema.Resource {
    return &schema.Resource{
        Create: ResourceTestCreate,
        Read:   ResourceTestRead,
        Update: ResourceTestUpdate,
        Delete: ResourceTestDelete,

        Schema: map[string]*schema.Schema{
            "name": {
                Type:        schema.TypeString,
                Required:    true,
                ForceNew:    true,
            },
            "other_attributes": {}
            "backend": {
                Type:        schema.TypeString,
                Required:    true,
                ForceNew:    true,
            },
            "my_block": {
                Type:     schema.TypeSet,
                Optional: true,
                Elem: &schema.Resource{
                    Schema: map[string]*schema.Schema{
                        "attribute1": {
                            Type:        schema.TypeString,
                            Required:    true,
                        },
                        "attribute2": {
                            Type:        schema.TypeInt,
                            Required:    true,
                        },
                        "attribute3": {
                            Type:        schema.TypeString,
                            Required:    true,
                        },
                    },
                },
            },
        },
    }
}

Определение терраформа:

resource "cutom_provider_test" "test" {
  name = "test"
  my_block {
    attribute1        = "cool"
    attribute2        = 1
    attribute3        = "test"

  }
  my_block {
    attribute1        = "cool2"
    attribute2        = 1
    attribute3        = "test2"

  }

}

Результаты плана:

Когда я удаляю весь блок, результат оказывается таким, как ожидалось (вывод плана — удалить весь блок.

Когда я обновляю один атрибут (атрибут1) новым значением, результатом является попытка удалить весь блок и воссоздать его с новым значением атрибута1.

Ожидаемый результат: Когда я обновляю один атрибут (атрибут2) новым значением, результат должен обновить только один атрибут.

Любая помощь очень ценится!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы определили my_block как набор объектов.

Основная отличительная черта набора состоит в том, что любое заданное значение либо входит в набор, либо отсутствует в наборе. Элементы набора не имеют никакой идентичности, кроме своего значения.

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

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


Если вы хотите отразить идею обновления существующего объекта, вам нужно будет использовать либо тип списка, либо тип карты.

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

Использование типа карты часто является лучшим выбором, поскольку оно позволяет вам выбрать любую строку в качестве идентификатора элементов, и таким образом вы можете сопоставить любой уникальный идентификатор, который удаленная система использует для этих объектов, и поэтому описание изменения в Terraform будет соответствовать тому, как удаленная система это понимает. Однако вы решили использовать устаревший SDK плагина Terraform вместо современной платформы плагинов, поэтому использование карты объектов невозможно. Если вы хотите использовать карту, вам нужно будет использовать платформу плагина, а затем вы можете использовать атрибут «вложенная карта» вместо типа блока.

Все это имеет смысл сейчас. Спасибо, Мартин, за подробный ответ и за то, что нашли время рассмотреть мой вопрос.

ayuuk ja'ay 10.07.2024 17:18

Другие вопросы по теме