首页 > 解决方案 > 如何使地形资源块有条件

问题描述

我有一个aws_acm_certificate我想在tf本地运行时避免的(因为我不想获得域名等)。我也不想在本地运行时注释掉所有涉及的代码。在本地运行时,我的大多数其他块(例如提供者的assume_role)都能够被排除。我怎样才能用完整的资源做到这一点?

我期望能够将值设置为环境文件count中的变量:tfvars

resource "aws_acm_certificate" "cert" {
  count = var.islocal == true ? 0 : 1

  domain_name       = "www.mysite.com"
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}

这会导致其他问题,例如需要在其他地方引用该资源。例如,输出资源的结果会出现问题:

output "acm_cert_domain_validation_options" {
  description = "definition of aws certificate requested for cloudfront"
  value = aws_acm_certificate.cert[0].domain_validation_options
}

在这种情况下,如果countvar 是0输出将失败,我不能plan在那里使用相同的方法,因为.countoutput

除了简单地不输出值之外,有没有办法安全地有条件地排除整个块?

标签: terraform-provider-awsterraform0.14.7

解决方案


这可能会很棘手,具体取决于有多少资源相互依赖,但是在您的情况下可能有用的是-target在本地运行计划时使用。

想象以下带有 S3 和 ACM 证书的 terraform 代码,您只想在本地执行 S3 代码并避免 ACM:

resource "aws_s3_bucket" "my_s3_bucket" {
  bucket_prefix = "whatever-"
  acl    = "private"
}

resource "aws_acm_certificate" "cert" {

  domain_name       = "www.mysite.com"
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}


output "acm_cert_domain_validation_options" {
  description = "definition of aws certificate requested for cloudfront"
  value = aws_acm_certificate.cert[0].domain_validation_options
}

然后我可以运行:

terraform plan -target=aws_s3_bucket.my_s3_bucket

这样,terraform 将避免运行 ACM 代码(包括输出)。您可以添加许多目标:

terraform plan -target=aws_s3_bucket.my_s3_bucket -target=aws_s3_bucket.my_s3_bucket_2

如果不是绝对必要的,我总是尽量避免使用计数器来保持 terraform 代码尽可能清晰,否则 terraform 代码可能会变得难以遵循和维护。


推荐阅读