在rds实例destroy和create上触发random_id资源重建



伙计们,我试图找到一种方法与terraform random_id资源重新创建,并提供一个新的随机值,当rds实例破坏和重新创建由于一个变化,说在rds上的用户名已经改变。

我试图将这个随机值附加到aws_db_instance资源的final_snapshot_identifier,以便每次在rd实例被销毁时创建快照时,快照的id应该有一个唯一的值。

当前代码:

resource "random_id" "snap_id" {
byte_length = 8
}
locals {
inst_id = "test-rds-inst"  
inst_snap_id = "${local.inst_id}-snap-${format("%.4s", random_id.snap_id.dec)}"
}
resource "aws_db_instance" "rds" {
.....
identifier                = local.inst_id  
final_snapshot_identifier = local.inst_snap_id
skip_final_snapshot       = false
username                  = "foo"
apply_immediately         = true
.....
}
output "snap_id" {
value = aws_db_instance.rds.final_snapshot_identifier
}

应用地形后的输出:

snap_id = "test-rds-inst-snap-5553"

用例我正在尝试:

# 1:修改rds实例中的值以模拟destroy &重建:

  1. 修改用户名为"foo-tmp">
  2. terraform apply -auto-approve
  3. 输出:

snap_id = "test-rds-inst-snap-5553"

我希望random_id能够启动并输出一个唯一的id,但它没有。

观察:

  • rds实例处于删除状态
  • 快照"测试- rds -本月-吸附- 5553"在创建状态
  • rds实例重新创建并处于可用状态
  • 快照"测试- rds -本月-吸附- 5553">

# 2:在rds实例中再次修改值以模拟destroy;重建:

  1. 修改用户名为"foo-new">
  2. terraform apply -auto-approve

有点低于预期的错误,因为snap id在先前的尝试中没有获得新值,但无论如何都累了…

观察:

**Error:** error deleting DB Instance (test-rds-inst): DBSnapshotAlreadyExists: Cannot create the snapshot because a snapshot with the identifier test-rds-inst-snap-5553 already exists.

我知道random_id资源的keepers{}地图,但不确定我需要在地图中放入rds_instance的内容,以便重新创建random_id资源,最终为snap_id后缀提供一个新的唯一值。

我还觉得在random_idkeepers中使用rds实例的任何属性都可能导致循环依赖问题。我可能错了,但我还没有尝试过。

任何建议都会有帮助的。谢谢。

最简单的方法是在random_id资源上使用taint,按照文档[1]:

要强制替换随机结果,可以使用taint命令在下次运行时生成新结果。

或者,查看文档中的示例,您可以这样做:
resource "random_id" "snap_id" {
byte_length = 8
keepers {
snapshot_id = var.snapshot_id
}
}
resource "aws_db_instance" "rds" {
.....
identifier                = local.inst_id  
final_snapshot_identifier = random_id.snap_id.keepers.snapshot_id
skip_final_snapshot       = false
username                  = "foo"
apply_immediately         = true
.....
}

这意味着在变量snapshot_id的值发生变化之前,random_id将生成相同的结果。不确定这是否适用于locals,但您可以尝试用local.inst_snap_id替换var.snapshot_id。如果可以的话,您可以使用内置函数(如formatdate[2]和timestamp[3])来命名快照,以创建快照id,该id将与您运行apply的时间绑定,例如:

locals {
inst_id = "test-rds-inst"
snap_time = formatdate("YYYYMMDD", timestamp())
inst_snap_id = "${local.inst_id}-snap-${format("%.4s", random_id.snap_id.dec)}-${local.snap_time}"
}

[1] https://registry.terraform.io/providers/hashicorp/random/latest/docs resource-keepers

[2] https://www.terraform.io/language/functions/formatdate

[3] https://www.terraform.io/language/functions/timestamp

最新更新