Terraform уничтожает экземпляр внутри кластера RDS при обновлении

#terraform #amazon-rds #terraform-provider-aws

Вопрос:

Я создал кластер RDS с 2 экземплярами, используя terraform. Когда я обновляю RDS с внешнего интерфейса, он изменяет кластер. Но когда я делаю то же самое, используя terraform, это уничтожает экземпляр.

Мы попробовали create_before_destroy, и он выдает ошибку.

Мы попробовали использовать ignore_changes=движок, но это не внесло никаких изменений.

Есть ли какой-нибудь способ предотвратить это?

 resource "aws_rds_cluster" "rds_mysql" {
  cluster_identifier              = var.cluster_identifier
  engine                          = var.engine
  engine_version                  = var.engine_version
  engine_mode                     = var.engine_mode
  availability_zones              = var.availability_zones
  database_name                   = var.database_name
  port                            = var.db_port
  master_username                 = var.master_username
  master_password                 = var.master_password
  backup_retention_period         = var.backup_retention_period
  preferred_backup_window         = var.engine_mode == "serverless" ? null : var.preferred_backup_window
  db_subnet_group_name            = var.create_db_subnet_group == "true" ? aws_db_subnet_group.rds_subnet_group[0].id : var.db_subnet_group_name
  vpc_security_group_ids          = var.vpc_security_group_ids
  db_cluster_parameter_group_name = var.create_cluster_parameter_group == "true" ? aws_rds_cluster_parameter_group.rds_cluster_parameter_group[0].id : var.cluster_parameter_group
  skip_final_snapshot             = var.skip_final_snapshot
  deletion_protection             = var.deletion_protection
  allow_major_version_upgrade     = var.allow_major_version_upgrade
  lifecycle {
    create_before_destroy = false
    ignore_changes        = [availability_zones]
  }
}

resource "aws_rds_cluster_instance" "cluster_instances" {
  count                      = var.engine_mode == "serverless" ? 0 : var.cluster_instance_count
  identifier                 = "${var.cluster_identifier}-${count.index}"
  cluster_identifier         = aws_rds_cluster.rds_mysql.id
  instance_class             = var.instance_class
  engine                     = var.engine
  engine_version             = aws_rds_cluster.rds_mysql.engine_version
  db_subnet_group_name       = var.create_db_subnet_group == "true" ? aws_db_subnet_group.rds_subnet_group[0].id : var.db_subnet_group_name
  db_parameter_group_name    = var.create_db_parameter_group == "true" ? aws_db_parameter_group.rds_instance_parameter_group[0].id : var.db_parameter_group
  apply_immediately          = var.apply_immediately
  auto_minor_version_upgrade = var.auto_minor_version_upgrade
  lifecycle {
    create_before_destroy = false
    ignore_changes        = [engine_version]
  }
}

 

Ошибка:

 resource "aws_rds_cluster_instance" "cluster_instances" {nnnnError: error creating RDS Cluster (aurora-cluster-mysql) Instance: DBInstanceAlreadyExists: DB instance already existsntstatus code: 400, request id: c6a063cc-4ffd-4710-aff2-eb0667b0774fnn on 
 

Планируйте выход:

 Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place
 /- create replacement and then destroy

Terraform will perform the following actions:

  # module.rds_aurora_create[0].aws_rds_cluster.rds_mysql will be updated in-place
  ~ resource "aws_rds_cluster" "rds_mysql" {
      ~ allow_major_version_upgrade         = false -> true
      ~ engine_version                      = "5.7.mysql_aurora.2.07.1" -> "5.7.mysql_aurora.2.08.1"
        id                                  = "aurora-cluster-mysql"
        tags                                = {}
        # (33 unchanged attributes hidden)
    }

  # module.rds_aurora_create[0].aws_rds_cluster_instance.cluster_instances[0] must be replaced
 /- resource "aws_rds_cluster_instance" "cluster_instances" {
      ~ arn                             = "arn:aws:rds:us-east-1:account:db:aurora-cluster-mysql-0" -> (known after apply)
      ~ availability_zone               = "us-east-1a" -> (known after apply)
      ~ ca_cert_identifier              = "rds-ca-" -> (known after apply)
      ~ dbi_resource_id                 = "db-32432432SDF" -> (known after apply)
      ~ endpoint                        = "aurora-cluster-mysql-0.jkjk.us-east-1.rds.amazonaws.com" -> (known after apply)
      ~ engine_version                  = "5.7.mysql_aurora.2.07.1" -> "5.7.mysql_aurora.2.08.1" # forces replacement
      ~ id                              = "aurora-cluster-mysql-0" -> (known after apply)
        identifier_prefix               = (known after apply)
        kms_key_id                      = (known after apply)
        monitoring_role_arn             = (known after apply)
      ~ performance_insights_enabled    = false -> (known after apply)
        performance_insights_kms_key_id = (known after apply)
      ~ port                            = 3306 -> (known after apply)
      ~ preferred_backup_window         = "07:00-09:00" -> (known after apply)
      ~ preferred_maintenance_window    = "thu:06:12-thu:06:42" -> (known after apply)
      ~ storage_encrypted               = false -> (known after apply)
      - tags                            = {} -> null
      ~ tags_all                        = {} -> (known after apply)
      ~ writer                          = true -> (known after apply)
        # (12 unchanged attributes hidden)
    }

Plan: 1 to add, 1 to change, 1 to destroy.

 

Комментарии:

1. Между какой версией и какой? Пожалуйста, добавьте немного кода в вашу точную конфигурацию TF, касающуюся кластера и экземпляров полный terraform plan вывод.

Ответ №1:

Я вижу apply_immediately аргумент , которого нет в aws_rds_cluster ресурсе, можете ли вы добавить его и попробовать.

Ответ №2:

Terraform видит изменение версии движка в экземплярах и определяет это как действие, которое вынуждает замену.

Удалите (или проигнорируйте изменения) engine_version входных данных для aws_rds_cluster_instance ресурсов.

AWS RDS обновляет версию движка для самих экземпляров кластера при обновлении версии движка кластера (именно поэтому вы можете выполнить обновление на месте с помощью консоли AWS).

Исключив engine_version ввод, Terraform не увидит никаких изменений, внесенных в aws_rds_cluster_instance s, и ничего не предпримет.

AWS будет обрабатывать обновления движка для экземпляров внутри компании.


Если вы решите игнорировать изменения, используйте ignore_changes аргумент внутри lifecycle блока:

 resource "aws_rds_cluster_instance" "cluster_instance" {
  engine_version     = aws_rds_cluster.main.engine_version
  ...

  lifecycle {
    ignore_changes        = [engine_version]
  }
}
 

Комментарии:

1. Мы пробовали это. Код создает новые DBInstance и завершается ошибкой вместо их изменения. Я добавил код и ошибку в вопрос выше.

2. Любое обновление здесь , я ищу тот же ответ

3. @MayaRay Ах, в вашем вопросе не хватало кода — не могли бы вы, пожалуйста, добавить точный вывод плана терраформирования в вопрос? Тогда я могу посоветовать

4. Добавлен вывод плана. Пожалуйста, проверьте.

5. @MayaRay Полностью ли исправляет это удаление версии движка? Кроме того, на какой версии терраформирования вы находитесь?

Ответ №3:

Я этого не знал, но после некоторого поиска в Гугле я нашел следующее: https://github.com/hashicorp/terraform-provider-aws/issues/10714

т. е. сообщение об ошибке поставщику AWS Terraform:

ресурс/aws_rds_cluster_instance уничтожается и создается заново при обновлении engine_version, в то время как apply_immediately имеет значение false

похоже, это та же самая проблема, с которой вы сталкиваетесь.

Один комментарий там, кажется, указывает на решение:

Начиная с версии v3.63.0 (ОТРЕДАКТИРОВАНО) поставщика, обновления параметра engine_version ресурсов aws_rds_cluster_instance больше не требуют замены ресурса.

В исходном комментарии, похоже, есть опечатка — 3,36 против 3,63.

Можете ли вы попробовать обновить своего aws поставщика терраформирования?

Комментарии:

1. Мы попробовали использовать terraform версии 14.8 и aws provider версии 3.63 . В нем говорится, что модификация завершена, но он не вносит никаких изменений в консоль.

2. Похоже на обратную связь с командой провайдера?