如何从最新快照或从头开始创建RDS实例



在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是错误的,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资源,每个AWS_DB_INSTANCE资源都具有对立的count,这令人震惊。

通过定义计数,您说的是数据资源的结果即使是零值也将是列表。

resource "aws_db_instance" "db" {
  [...]
  snapshot_identifier = "${
    var.db_snapshot_source == "" ? "" : 
    element(
      concat(data.aws_db_snapshot.last_snap.*.db_snapshot_identifier, list("")), 0)
  }"
}

如果您希望列表为空,则需要concat。否则您会出现错误

element: element() may not be used with an empty list...

github问题描述了Concat行为

文档读取的读数似乎是使用快照触发的 snapshot_identifier是触发是否使用快照,因此传递空字符串不足以避免从快照开始。在这种情况下,您将需要两个aws_rds_instance资源,然后在每个资源上使用count的三元表达式来决定要创建哪一个。正如您提到的那样,这很恐怖,但可能还可以。

另一种思考的方法是,如果您的库存中有一个空白的快照。然后,它只是一个三元操作员,远离决定使用自定义快照或此空白快照。我不知道您可以在Terraform中创建一个空白快照,它的创建可能不在乐队中。