gpt4 book ai didi

terraform-provider-aws - 如何使地形资源 block 有条件

转载 作者:行者123 更新时间:2023-12-05 06:03:56 24 4
gpt4 key购买 nike

我有一个 aws_acm_certificate,我想在本地运行 tf 时避免使用它(因为我不想获取域名等)。我也不想在本地运行时注释掉所有涉及的代码。我的大部分其他 block ( 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

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

最佳答案

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

关于terraform-provider-aws - 如何使地形资源 block 有条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66499144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com