【问题标题】:How to make a terraform resource block conditional如何使地形资源块有条件
【发布时间】:2021-06-04 12:34:02
【问题描述】:

我有一个aws_acm_certificate,我想在本地运行我的tf 时避免使用它(因为我不想获得域名等)。我也不想在本地运行时注释掉所有涉及的代码。我的大多数其他块(such as a provider's 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
}

在这种情况下,如果 count var 是 0,则输出将在 plan 上失败,我不能在那里使用相同的方法,因为 output 不支持 count

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

【问题讨论】:

    标签: terraform-provider-aws terraform0.14.7


    【解决方案1】:

    这可能会很棘手,具体取决于有多少资源相互依赖,但在您的情况下可能有用的是在本地运行计划时使用 -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 代码可能会变得难以遵循和维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      相关资源
      最近更新 更多