【问题标题】:Creating RDS Instances from Snapshot Using Terraform使用 Terraform 从快照创建 RDS 实例
【发布时间】:2018-12-31 09:12:27
【问题描述】:

正在处理一个 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"
    }
}

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

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

【问题讨论】:

    标签: amazon-web-services amazon-rds terraform terraform-provider-aws


    【解决方案1】:

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

    lifecycle {
        ignore_changes = [
          "snapshot_identifier",
        ]
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多