terraform - 从重用模块中获取资源的输出
问题描述
我有以下代码将调用一个模块并根据我在本地变量中传递的信息为我创建目标组。这很好用,我的问题是试图获取它在输出中创建的每个目标组的 arn。
locals {
targetgroups_beta = {
targetgroup1 = {
name = "example",
path = "/",
environment = "Beta"
}
targetgroup2 = {
name = "example2",
path = "/",
environment = "Beta"
}
}
}
module "target-groups"{
for_each = local.targetgroups_beta
source = ".//modules/targetgroups"
name-beta = each.value.name
path-beta = each.value.path
environment-beta = each.value.environment
vpc-id = "${module.vpc.vpc_id}"
}
它正在调用的模块中的资源名称是目标组,因此根据我阅读的内容,我应该能够通过以下方式引用它:
output{
value = "${aws_lb_target_group.target-group[0].arn}"
}
当我尝试这个时,我在运行 terraform 计划时收到以下信息:
“因为 aws_lb_target_group.target-group 没有设置“count”或“for_each”,所以对其的引用不得包含索引键。删除括号内的索引以引用此资源的单个实例。
我对此的理解是for_each 调用的模块没有运行for_each,所以我不能以这种方式引用资源。如果我执行 ""${aws_lb_target_group.target-group.arn}" 该参考在技术上有效,但包括每个目标组的 arn,我计划添加更多。有没有办法将这些 arn 中的每一个都去掉这个列表作为它自己的输出?
它正在调用以供参考的模块中的代码:
resource "aws_lb_target_group" "target-group" {
name = "example-${var.name-beta}"
port = 80
protocol = "HTTP"
vpc_id = var.vpc-id
deregistration_delay = 5
tags = {
Environment = "${var.environment-beta}"
}
health_check{
healthy_threshold = 2
unhealthy_threshold = 2
timeout = 10
interval = 15
path = var.path-beta
}
}
解决方案
如果我理解正确,您正在使用for_each
您的target-groups
模块。如果是这样,要获得输出,您必须在 main.tf 文件中使用类似以下内容:
module.target-groups[*].arn
这for_each
将创建多个模块,而不是在单个模块中创建多个资源。
这是有关在 terraform 0.13 中使用模块的for_each
好信息。count
更新一个模块
如果您只想使用一个模块,您可以执行以下操作:
module "target-groups"{
target_groups_to_create = local.targetgroups_beta
source = ".//modules/targetgroups"
name-beta = each.value.name
path-beta = each.value.path
environment-beta = each.value.environment
vpc-id = "${module.vpc.vpc_id}"
}
然后在模块中:
variable "target_groups_to_create" {}
resource "aws_lb_target_group" "target-group" {
for_each = var.target_groups_to_create
name = "example-${each.value.name}"
port = 80
protocol = "HTTP"
vpc_id = var.vpc-id
deregistration_delay = 5
tags = {
Environment = "${each.value.environment}"
}
health_check{
healthy_threshold = 2
unhealthy_threshold = 2
timeout = 10
interval = 15
path = each.value.path
}
}
推荐阅读
- python - 为什么 replace() 在我的 Python 函数中不起作用?
- vba - 使用 KeyPress 事件“键入时搜索”
- google-bigquery - 为什么 BigQuery 在保存表时会耗尽内存,而不是对于不保存的相同查询?
- keycloak - 尝试在两个 Keycloak 之间联合用户时出现意外错误(来自令牌的错误受众)
- python - 列表中的重复字符串不会被删除,除非最相似的字符串在子列表中
- openssl - 将普通公钥转换为 PEM
- java - 在项目中添加 Java 代码模板 XML 文件
- sql - 如何强制生成新的 sysdatetime()?
- authentication - 如何使用 Postman 创建 oAuth 随机数、时间戳和签名?
- c# - 为什么 jquery datable 显示旧记录而不是新记录?