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

How to create an RDS instance from the most recent snapshot or from scratch

在 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,这太可怕了。

documentation 读起来好像指定 snapshot_identifier 是触发使用快照或不使用快照的原因,因此传递空字符串不足以避免从快照开始。在这种情况下,您将需要两个 aws_rds_instance 资源,然后在每个资源上使用 count 的三元表达式来决定创建哪一个。正如你提到的,这很可怕,但它可能工作正常。

另一种思考方式是,如果您的库存中有一张空白快照作为起点。然后它只是一个三元运算符远离决定使用自定义快照或这个空白快照。我不知道您是否可以在 Terraform 中创建空白快照,它的创建可能是带外的。

通过定义计数,您表示数据资源的结果将是一个列表,即使它是零值。

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 描述连接行为