首页 文章

使用Terraform从快照创建RDS实例

提问于
浏览
3

通过抓取并使用最新的 生产环境 数据库快照来处理我正在创建RDS集群的Terraform项目:

# 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"
    }
}

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

用例是为了能够对此terraform计划管理的 生产环境 基础架构的其他方面进行更改,而无需重新创建整个RDS集群,这是一个非常耗时的资源来销毁/创建 .

1 回答

  • 3

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

    lifecycle {
        ignore_changes = [
          "snapshot_identifier",
        ]
    }
    

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

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

相关问题