正在处理Terraform项目,在该项目中,我将通过获取并使用最新的生产数据库快照来创建RDS集群:
# Get latest snapshot from production DB
data "aws_db_snapshot" "db_snapshot" {
most_recent = true
db_instance_identifier = "${var.db_instance_to_clone}"
}
#Create RDS instance from snapshot
resource "aws_db_instance" "primary" {
identifier = "${var.app_name}-primary"
snapshot_identifier = "${data.aws_db_snapshot.db_snapshot.id}"
instance_class = "${var.instance_class}"
vpc_security_group_ids = ["${var.security_group_id}"]
skip_final_snapshot = true
final_snapshot_identifier = "snapshot"
parameter_group_name = "${var.parameter_group_name}"
publicly_accessible = true
timeouts {
create = "2h"
}
}
此方法的问题在于,在运行terraform代码之后(一旦拍摄了另一个快照),希望使用数据库的最新快照重新创建主RDS实例(以及随后的只读副本)。我在考虑指定首次运行的布尔计数参数,但是在快照资源上设置count = 0
会导致数据库资源的snapshot_id参数出现问题。同样,在数据库资源上设置count = 0
会表明它将破坏数据库。
为此,用例是能够更改该地形计划管理的生产基础结构的其他方面,而不必重新创建整个RDS集群,这是销毁/创建非常耗时的资源。 / p>
答案 0 :(得分:5)
尝试在您的ignore_changes
定义中放置一个aws_db_instance
生命周期块:
lifecycle {
ignore_changes = [
"snapshot_identifier",
]
}
这将导致Terraform在初始创建时仅查找对数据库snapshot_identifier
的更改。
如果数据库已经存在,则Terraform将忽略对现有数据库的snapshot_identifier
字段的任何更改-即使此后已创建新快照。