# #google-bigquery #terraform #terraform-provider-gcp
Вопрос:
Я пытаюсь обновить провайдера Google terraform до 3.58
от 3.55
, чтобы добавить защиту от удаления больших запросов.
При запуске a terraform plan
я получаю # forces replacement
предупреждения:
# google_bigquery_table.my_table must be replaced
...
deletion_protection = true
...
~ schema = jsonencode(
~ [ # forces replacement
~ {
~ fields = [
# (6 unchanged elements hidden)
{
description = "Location of the data schema."
name = "dataSchema"
type = "STRING"
},
~ {
~ type = "BOOLEAN" -> "BOOL"
# (2 unchanged elements hidden)
},
]
~ type = "RECORD" -> "STRUCT"
# (2 unchanged elements hidden)
} # forces replacement,
~ {
~ type = "RECORD" -> "STRUCT"
# (3 unchanged elements hidden)
} # forces replacement,
~ {
~ type = "RECORD" -> "STRUCT"
# (3 unchanged elements hidden)
} # forces replacement,
]
)
Может ли кто-нибудь помочь мне понять (а) почему я получаю принудительную замену в этом обновлении, если я не изменил свои схемы, и (б) как я могу обновить своего провайдера Google, не удаляя данные в своей таблице.
Любая помощь была бы вам очень признательна.
Комментарии:
1. Вы указываете схему таблицы в своей конфигурации?
2. @MattSchuchard да, я определяю их по
schema
свойству вgoogle_bigquery_table
ресурсе3. не можете ли вы поместить схему в раздел ignore_changes?
4. @NathanRuiz спасибо, я не знал, что существуют ignore_changes. Будет ли это просто устранять проблему в будущем для следующего обновления? Или я бы сохранил схему в режиме ignore_changes на неопределенный срок?
5. Он будет игнорировать изменения, внесенные в схему, поэтому, пока она существует, она не вызовет никаких обновлений при подаче заявки, недостаток в том, что если вам когда-нибудь понадобится реплицировать свою среду с нуля, вы получите все, что установлено в terraform, что может не отражать фактические данные. Но в остальном это работает просто отлично. Более подробная информация на terraform.io/docs/language/meta-arguments/lifecycle.html
Ответ №1:
Иногда кажется, что Терраформ агрессивен в отношении маркировки, нуждающейся в замене. Я не уверен, связано ли это, но я иногда видел более «консервативное» обозначение этого при изменении версий Terraform (под консервативным я подразумеваю, что он, похоже, пытается чаще заменять — я не уверен, что обновленные версии не понимают, что настройки, которые ранее не устанавливались в TF, но теперь помечены как потенциально измененные и, следовательно, нуждаются в замене). Я согласен с тем, что если ваша схема не изменилась, нет необходимости заменять ресурс.
Решение
Определите ресурс как ignore_changes
, убедившись, что он указан в lifecycle
блоке в теле ресурса.
Из документации по терраформированию:
Эта
ignore_changes
функция предназначена для использования при создании ресурса со ссылками на данные, которые могут измениться в будущем, но не должны влиять на указанный ресурс после его создания. В некоторых редких случаях настройки удаленного объекта изменяются процессами за пределами Terraform, которые Terraform затем попытается «исправить» при следующем запуске. Чтобы сделать Terraform совместными обязанностями по управлению одним объектом с отдельным процессом, мета-аргумент ignore_changes определяет атрибуты ресурсов, которые Terraform следует игнорировать при планировании обновлений связанного удаленного объекта.
Несколько примеров кода из этого:
resource "aws_instance" "example" {
# ...
lifecycle {
ignore_changes = [
# Ignore changes to tags, e.g. because a management agent
# updates these based on some ruleset managed elsewhere.
tags,
]
}
}
Также обратите внимание, что вы можете использовать ключевое all
слово вместо списка, ignore_changes
чтобы игнорировать все атрибуты.
Комментарии:
1. @RobotEyes Вы думаете, что изменения в невежестве решат проблему?
2. Я не уверен. Добавление схемы для игнорирования на неопределенный срок означало бы, что я не смогу обновить свою схему в будущем. Я бы предположил, что, как только я удалю схему из блока игнорирования изменений, у меня снова возникнет та же проблема. Правильно ли это?
3. @RobotEyes Да. Как я уже упоминал, кажется, что после обновлений я получаю повышенную «чувствительность» этого материала, а затем могу удалить его после нового применения (по крайней мере, обычно). Я хотел бы, чтобы их примечания к выпуску были немного лучше, чтобы определить типы изменений, с которыми это вызывает проблемы.