使用Terraform从快照创建RDS实例

WMi*_*112 4 amazon-web-services amazon-rds terraform terraform-provider-aws

在一个Terraform项目中,我将通过获取并使用最新的生产数据库快照来创建RDS集群:

# Get latest snapshot from production DB
data "aws_db_snapshot" "db_snapshot" {
    most_recent = true
    db_instance_identifier = "${var.db_instance_to_clone}"
}

#Create RDS instance from snapshot
resource "aws_db_instance" "primary" {
    identifier = "${var.app_name}-primary"
    snapshot_identifier = "${data.aws_db_snapshot.db_snapshot.id}"
    instance_class = "${var.instance_class}"
    vpc_security_group_ids = ["${var.security_group_id}"]
    skip_final_snapshot = true
    final_snapshot_identifier = "snapshot"
    parameter_group_name = "${var.parameter_group_name}"
    publicly_accessible = true
    timeouts {
      create = "2h"
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,在运行terraform代码之后(一旦拍摄了另一个快照),希望使用数据库的最新快照重新创建主RDS实例(以及随后的只读副本)。我在考虑指定首次运行的布尔计数参数的含义,但是count = 0在快照资源上进行设置会导致数据库资源的snapshot_id参数出现问题。同样count = 0,在db资源上设置a 表示将破坏数据库。

为此,用例是能够更改该地形计划管理的生产基础结构的其他方面,而不必重新创建整个RDS集群,这是销毁/创建非常耗时的资源。

Adi*_*l B 7

尝试ignore_changes在您的aws_db_instance定义中放置一个生命周期块:

lifecycle {
    ignore_changes = [
      "snapshot_identifier",
    ]
}
Run Code Online (Sandbox Code Playgroud)

这将导致Terraform snapshot_identifier在初始创建时仅查找对数据库的更改。

如果数据库已经存在,则Terraform将忽略对现有数据库snapshot_identifier字段的任何更改-即使此后已创建新快照。

  • 自 terraform `0.12`(2019 年 5 月)起,应省略 `snapshot_identifier` 周围的双引号。如果使用双引号运行 terraform 计划,它将显示警告:“警告:引用的引用已被弃用......在这种情况下,引用应按字面意思而不是引号括起来。Terraform 0.11 及更早版本需要引用,但引用的引用现已弃用,并将在 Terraform 的未来版本中删除。删除此引用周围的引号以消除此警告。 (2认同)