#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. Похоже на обратную связь с командой провайдера?