我发现管理这个问题最实用的方法是通过变量的组合来条件性地创建或不创建所需资源,同时让所有其他资源依赖于相关的数据源而不是条件性地创建的资源。
一个很好的例子是 Route 53 托管区域,如果你在 AWS 外部管理你的域并需要更新你的名称服务器,则销毁和重新创建它可能会很麻烦,每次启动时都要等待 DNS 传播。
1. 通过指定一些变量。
variable "should_create_r53_hosted_zone" {
type = bool
description = "Determines whether or not a new hosted zone should be created on apply."
}
2. 你可以将其与资源上的count
一起使用,以有条件地创建它。
resource "aws_route53_zone" "new" {
count = var.should_create_r53_hosted_zone ? 1 : 0
name = "my.domain.com"
}
3. 然后,通过对关联的数据源进行跟进电话
data "aws_route53_zone" "existing" {
name = "my.domain.com"
depends_on = [
aws_route53_zone.new
]
}
4. 如果你设置了标志,你可以让所有其他资源都能够一致地访问该资源的属性,而不管你的标志是否已经设置。
resource "aws_route53_record" "rds_reader_endpoint" {
zone_id = data.aws_route53_zone.existing.zone_id
}
这种方法只比在apply
期间注释/取消注释资源略好,但至少提供了一种一致、有文档记录的解决方案。