Обновление Terraform Поставщик Google вынуждает заменить

# #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 Да. Как я уже упоминал, кажется, что после обновлений я получаю повышенную «чувствительность» этого материала, а затем могу удалить его после нового применения (по крайней мере, обычно). Я хотел бы, чтобы их примечания к выпуску были немного лучше, чтобы определить типы изменений, с которыми это вызывает проблемы.