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

Amazon web services 如何从最近的快照或从头开始创建RDS实例,amazon-web-services,amazon-rds,devops,terraform,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_identi

在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_snapshot的引用,即使三元值为false也是如此。我收到以下错误消息:
*aws\u db\u instance.db:Resource'data.aws\u db\u snapshot.last\u snap'not found for variable'data.aws\u db\u snapshot.last\u snapshot.db\u snapshot\u identifier'

我怎样才能做到这样的行为?我看到的唯一选择是声明两个aws_db_实例资源,每个资源都具有相反的
count
,这非常可怕

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

另一种思考方法是,如果您的库存中有一个空白快照,那么可以从中开始。然后,它只是一个三元运算符,不需要决定使用自定义快照或此空白快照。我不知道您是否可以在Terraform中创建一个空白快照,但它的创建可能是带外的。

读起来好像指定
快照\u标识符是使用或不使用快照触发的,因此传递空字符串不足以避免从快照开始。在这种情况下,您需要两个
aws\u rds\u实例
资源,然后在每个资源上为
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)
  }"
}
如果希望列表为空,则需要concat。否则会出现错误

element:element()不能与空列表一起使用…


通过定义一个计数来描述concat行为,您可以说数据资源的结果将是一个列表,即使它是一个零值

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()不能与空列表一起使用…

描述海螺的行为