terraform-provider-aws - 如何使地形资源块有条件
问题描述
我有一个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
}
在这种情况下,如果count
var 是0
输出将失败,我不能plan
在那里使用相同的方法,因为.count
output
除了简单地不输出值之外,有没有办法安全地有条件地排除整个块?
解决方案
这可能会很棘手,具体取决于有多少资源相互依赖,但是在您的情况下可能有用的是-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 代码可能会变得难以遵循和维护。
推荐阅读
- hadoop - Hive - 将查找表数据合并到现有表以有效地创建新表
- python - \b 边界正则表达式未按预期工作
- android - 如何使用 ASM 在调用方法的地方插入 try/catch 块
- gdal - PyQGIS 3.18.2 从符号系统中删除波段名称
- javascript - 简单的问题 svg ` ` 问题:重复而不填满空间
- html - 如何自定义 Rails 上传表单并仍然显示已上传的文件
- java - n 个列表的所有组合的交集
- excel - 在列中搜索特定值,然后在找到值时隐藏行
- python - 如何使用 Pillow 模块将列表中的图像组粘贴到基础图像之上?
- angular - 试图以角度从 graphql 获取数据,watchQuery 给出错误