【问题标题】:terraform: How to override AWS RDS final snapshotterraform:如何覆盖 AWS RDS 最终快照
【发布时间】:2021-07-01 08:22:07
【问题描述】:

在 tf 文件中有以下数据库资源:

resource "aws_db_instance" "app_db" {
  count = local.db_count

  allocated_storage     = 5
  max_allocated_storage = 10
  engine                = "postgres"
  instance_class        = "db.t3.micro"
  name                  = var.db_creds["db_name"]
  port                  = 5432
  username              = var.db_creds["username"]
  password              = var.db_creds["password"]

  db_subnet_group_name   = aws_db_subnet_group.database_sg.name
  vpc_security_group_ids = [aws_security_group.app.id]

  final_snapshot_identifier = "${var.environment_deployment_tag}-app-db-snaphot"
}

销毁数据库资源后出现此错误:

DBSnapshotAlreadyExists:无法创建快照,因为标识符为 app-db-snaphot 的快照已存在

我知道这是因为具有此类标识符的快照已经存在,但我想问一下是否有办法覆盖以前的快照?

如果没有并且所有快照都应该有唯一的名称,我猜像这样的格式应该没问题: final_snapshot_identifier = "${var.environment_deployment_tag}-app-db-snaphot-${timestamp()}"

我想知道如何清理以前的快照,这样 RDS 上的快照就不会很多了?管理最终快照的最佳方法是什么?

【问题讨论】:

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


    【解决方案1】:

    如果您确实想维护最终数据库快照并使用 final_snapshot_identifier = "${var.environment_deployment_tag}-app-db-snaphot-${timestamp()}" sn-p,请务必添加此 lifecycle 块,以便后续 Terraform 计划不会每次都看到“更改”,因为timestamp()函数的使用:

    lifecycle {
        ignore_changes = [
          final_snapshot_identifier,
        ]
    }
    

    您可能还需要使用replace(timestamp(), ":", "-")timestamp() 函数中的: 字符替换为- 字符,如下所示:

    final_snapshot_identifier = "${var.environment_deployment_tag}-app-db-snaphot-${replace(timestamp(), ":", "-")}"

    【讨论】:

    • 最佳方法恕我直言,操作应将此标记为正确答案
    【解决方案2】:

    如果您确实不需要最终快照,您可以使用以下方法跳过它:

    skip_final_snapshot  = true
    

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2020-05-21
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多