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

时间:2018-04-04 15:28:02

标签: amazon-web-services amazon-rds devops terraform

在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,这是可怕的。

2 个答案:

答案 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行为