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

Posted

技术标签:

【中文标题】terraform:如何覆盖 AWS RDS 最终快照【英文标题】:terraform: How to override AWS RDS final snapshot 【发布时间】: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 上的快照就不会很多了?管理最终快照的最佳方法是什么?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于terraform:如何覆盖 AWS RDS 最终快照的主要内容,如果未能解决你的问题,请参考以下文章

使用 Terraform 创建 AWS MySQL RDS 实例时出错

需要通过 Terraform 在 AWS RDS 中启用备份复制功能

Terraform,AWS RDS aurora mysql serverless 异常“找不到源集群”

在 AWS RDS 集群实例上使用 Terraform 预置多个逻辑数据库

使用 terraform 在非默认 VPC 中创建 AWS RDS 实例

在 terraform 失败的不同 vpc 中创建时出现 rds 副本错误