Чтобы инициировать воссоздание реплики, вам потребуется параметр ForceNew
при изменении ресурса реплики при изменении не реплики.
В RDS есть атрибут resource_id
, который обычно не появляются в местах, о которых заботятся люди (вы не указываете его, вы не используете его для подключения к нему, и он не отображается в консоли RDS), но отличается для каждого экземпляра базы данных (по сравнению с обычным identifier
, который
Затем мы переходим к другой части, которая заключается в том, что этот атрибут должен быть в параметре ForceNew
ресурса реплики. Очевидным выбором здесь являются параметры identifier
или identifier_prefix
. Самое большое влияние здесь заключается в том, что они также используются для идентификации экземпляра базы данных от других, но также используются как часть адреса DNS для подключения к базе данных в форме ${identifier}.${random_hash_of_account_and_region}.${region}.rds.amazonaws.com
. Поэтому, если вам нужно подключиться к экземпляру, вам либо нужно, чтобы клиент обнаружил адрес реплики, поскольку теперь он будет содержать случайно сгенерированный resource_id
экземпляра без реплики, либо вам нужно будет создать Terraform запись DNS, которая либо CNAME, либо псевдоним адреса RDS.
Так что в вашем случае вам может понадобиться что-то вроде этого:
data "aws_db_snapshot" "latest_prod_snapshot" {
db_instance_identifier = var.production_instance_id
most_recent = true
}
resource "aws_db_instance" "qa_master" {
apply_immediately = true
snapshot_identifier = data.aws_db_snapshot.latest_prod_snapshot.id
availability_zone = var.qa_master_zone
instance_class = var.master_instance_class
identifier = var.master_name
parameter_group_name = var.parameter_group_name
auto_minor_version_upgrade = false
multi_az = false
performance_insights_enabled = true
performance_insights_retention_period = 7
vpc_security_group_ids = [var.security_group_id]
option_group_name = var.option_group_name
backup_retention_period = 5
skip_final_snapshot = true
enabled_cloudwatch_logs_exports = ["audit", "error", "slowquery"]
}
resource "aws_db_instance" "qa_replica" {
apply_immediately = true
replicate_source_db = aws_db_instance.qa_master.id
availability_zone = var.qa_replica_zone
instance_class = var.replica_instance_class
identifier = "${var.replica_name}-${aws_db_instance.qa_master.resource_id}"
parameter_group_name = var.parameter_group_name
auto_minor_version_upgrade = false
multi_az = false
performance_insights_enabled = true
performance_insights_retention_period = 7
vpc_security_group_ids = [var.security_group_id]
skip_final_snapshot = true
enabled_cloudwatch_logs_exports = ["audit", "error", "slowquery"]
}
resource "aws_route53_zone" "example" {
name = "example.com"
}
resource "aws_route53_record" "replica_instance" {
zone_id = data.aws_route53_zone.example.zone_id
name = "qa-replica-database.${data.aws_route53_zone.example.name}"
type = "CNAME"
ttl = 60
records = [aws_db_instance.replica_qa.address]
}
Теперь, если производственный снимок изменится, то qa_master
Ресурс экземпляра базы данных будет воссоздан, что приведет к воссозданию ресурса экземпляра базы данных qa_replica
, а затем запись Route53 для экземпляра qa_replica
будет обновлена с новым адресом, что позволит вам всегда подключаться к реплике по адресу qa-replica-database.example.com
.