伙计们,我试图找到一种方法与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 &重建:
- 修改用户名为"foo-tmp">
- terraform apply -auto-approve 输出:
snap_id = "test-rds-inst-snap-5553"
我希望random_id能够启动并输出一个唯一的id,但它没有。
观察:
- rds实例处于删除状态
- 快照"测试- rds -本月-吸附- 5553"在创建状态
- rds实例重新创建并处于可用状态
- 快照"测试- rds -本月-吸附- 5553">
# 2:在rds实例中再次修改值以模拟destroy;重建:
- 修改用户名为"foo-new">
- 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_id
keepers中使用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