Я создаю собственный поставщик 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) новым значением, результат должен обновить только один атрибут.
Любая помощь очень ценится!
Вы определили my_block
как набор объектов.
Основная отличительная черта набора состоит в том, что любое заданное значение либо входит в набор, либо отсутствует в наборе. Элементы набора не имеют никакой идентичности, кроме своего значения.
Это отличается от двух других типов коллекций Terraform: списки позволяют идентифицировать элементы по их положению в списке (их индексу), а карты позволяют идентифицировать элементы по их уникальным ключам.
Поскольку элементы набора не имеют никакой идентичности, кроме своего значения, поэтому не может быть никакой концепции изменения значения элемента набора: если вы меняете его значение, вы меняете его идентификатор, и поэтому это неотличимо от удаления старого значения и добавления новое значение.
Если вы хотите отразить идею обновления существующего объекта, вам нужно будет использовать либо тип списка, либо тип карты.
Использование типа списка подходит только в том случае, если удаленная система, которую оборачивает провайдер, также считает, что объекты идентифицируются по их положению в последовательности, поскольку в противном случае разница не будет должным образом отражать то, как удаленная система воспримет изменение.
Использование типа карты часто является лучшим выбором, поскольку оно позволяет вам выбрать любую строку в качестве идентификатора элементов, и таким образом вы можете сопоставить любой уникальный идентификатор, который удаленная система использует для этих объектов, и поэтому описание изменения в Terraform будет соответствовать тому, как удаленная система это понимает. Однако вы решили использовать устаревший SDK плагина Terraform вместо современной платформы плагинов, поэтому использование карты объектов невозможно. Если вы хотите использовать карту, вам нужно будет использовать платформу плагина, а затем вы можете использовать атрибут «вложенная карта» вместо типа блока.
Все это имеет смысл сейчас. Спасибо, Мартин, за подробный ответ и за то, что нашли время рассмотреть мой вопрос.