terraform:如何覆盖AWS RDS最终快照

fo1*_*o1n 3 amazon-rds terraform terraform-provider-aws

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"
}
Run Code Online (Sandbox Code Playgroud)

销毁数据库资源后,我收到此错误:

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

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

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

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

Adi*_*l B 11

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

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

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

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

  • 最佳方法恕我直言,op 应该将此标记为正确答案 (2认同)

Asr*_*lah 5

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

skip_final_snapshot  = true
Run Code Online (Sandbox Code Playgroud)