在terraform中,有没有办法从给定数据库的最新快照有条件地创建RDS实例,或者根据参数的值创建一个空数据库?
我尝试过类似的东西:
variable "db_snapshot_source" {
default = ""
}
data "aws_db_snapshot" "last_snap" {
count = "${var.db_snapshot_source == "" ? 0 : 1}"
most_recent = true
db_instance_identifier = "${var.db_snapshot_source}"
}
resource "aws_db_instance" "db" {
[...]
snapshot_identifier = "${var.db_snapshot_source == "" ? "" : data.aws_db_snapshot.last_snap.db_snapshot_identifier}"
}
不幸的是,它不起作用,因为TF似乎取消引用data.aws_db_snapshot.last_snap
,即使三元组是假的。我收到以下错误消息:* aws_db_instance.db: Resource 'data.aws_db_snapshot.last_snap' not found for variable 'data.aws_db_snapshot.last_snap.db_snapshot_identifier'
。
我怎样才能实现这样的行为?我看到的唯一选择是声明两个aws_db_instance资源,每个资源都有反对count
,这是可怕的。
答案 0 :(得分:1)
documentation读取,好像指定snapshot_identifier
是使用快照触发的内容,因此传入空字符串不足以避免从快照开始。在这种情况下,您需要两个aws_rds_instance
资源,然后在每个资源上使用count
的三元表达式来决定创建哪个资源。正如你所提到的,这是可怕的,但它可能正常。
另一种思考方式是,如果您的广告资源中有一个空白快照,则可以从中开始。然后,它只是一个三元运算符,而不是决定使用自定义快照或此空白快照。我不知道你可以在Terraform中创建一个空白快照,但它的创建可能是带外的。
答案 1 :(得分:1)
通过定义计数,您说数据资源的结果将是一个列表,即使它是零值。
resource "aws_db_instance" "db" {
[...]
snapshot_identifier = "${
var.db_snapshot_source == "" ? "" :
element(
concat(data.aws_db_snapshot.last_snap.*.db_snapshot_identifier, list("")), 0)
}"
}
如果您希望列表为空,则需要连接。否则你会收到错误
element: element() may not be used with an empty list...
Github issue描述了concat行为