gpt4 book ai didi

amazon-web-services - Terraform for_each 变量用于创建多个 AWS 监听器规则并设置唯一的 target_group_arn

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

我正在尝试使用 terraform 制定一个 aws 容器设置,使用 terraforms for_each 选项根据特定端口将流量从 ALB 路由到目标组。我有一个 for_each 设置,它根据我的变量创建我期望的监听器规则

variable "tenant_data" {
type = "map"
default = {
tenant1 = {
port = 32768
listener_priority = 986
tenantName = "tenant1"
}
tenant2 = {
port = 32769
listener_priority = 987
tenantName = "tenant2"
}
tenant3 = {
port = 32770
listener_priority = 988
tenantName = "tenant3"
}
}
}

我不确定是否可以让 for_each 资源在监听器规则中使用唯一的 target_group_arn,该规则将由我正在使用的目标组的类似 for_each 设置创建。我也不确定这是否是实现这一目标的最佳方式。我可以创建每个资源,但最终我将查看大约 30 个独立的监听器和目标组,因此我想看看是否可以找到一种方法来利用单个变量来处理资源创建。

resource "aws_alb_listener_rule" "java_dev" {
for_each = var.tenant_data
listener_arn = data.terraform_remote_state.alb.outputs.alb_https_listener_arn
priority = each.value.listener_priority

action {
type = "forward"
target_group_arn = each.value.target_group_arn - what I'm trying to set
}

condition {
field = "host-header"
values = ["${each.value.tenantName}.my-site.com"]
}

condition {
field = "path-pattern"
values = ["/some-value/*"]
}
}

最初我想我可以尝试使用目标组的输出值并将它们添加到我的变量中,但这似乎不可能。除此之外,我仍在尝试想出一种可行的方法。

我花了半天时间寻找解决方法,但没有发现任何有用的东西。如果任何人有任何资源或想法,他们都会非常有帮助。

编辑:如果没有 for_each,每个监听器和目标将如下所示

resource "aws_alb_listener_rule" "alpha3" {
listener_arn = listener_arn
priority = 987

action {
type = "forward"
target_group_arn = aws_alb_target_group.group.arn
}

condition {
field = "host-header"
values = ["one.my-site.com"]
}

condition {
field = "path-pattern"
values = ["/path/*"]
}
}

# Target Group
resource "aws_alb_target_group" "group" {
name = "ct-tgt-grp"
port = 32769
protocol = "HTTP"
vpc_id = vpc_id
target_type = "instance"

health_check {
interval = 30
port = 5000
protocol = "HTTP"
timeout = 10
healthy_threshold = 3
unhealthy_threshold = 5
path = "/health"
matcher = 200
}
}

最佳答案

我从问题中了解到的是,var.tenant_data 的每个元素应该有一个目标组和一个监听器规则,并且每个监听器规则都应该引用相应的目标组。

通过将 for_each 与这两个资源一起使用,它们最终都会得到由相同键标识的实例,因此您可以使用 each.key 进行交叉引用>,像这样:

variable "tenant_data" {
type = map(object({
port = number
listener_priority = number
}))
}

resource "aws_alb_target_group" "tenant" {
for_each = var.tenant_data

name = "ct-${each.key}"
port = each.value.port
protocol = "HTTP"
vpc_id = var.vpc_id
target_type = "instance"

health_check {
interval = 30
port = 5000
protocol = "HTTP"
timeout = 10
healthy_threshold = 3
unhealthy_threshold = 5
path = "/health"
matcher = 200
}
}

resource "aws_alb_listener_rule" "tenant" {
for_each = var.tenant_data

listener_arn = var.listener_arn
priority = each.value.listener_priority

action {
type = "forward"
target_group_arn = aws_alb_target_group.tenant[each.key].arn
}

condition {
field = "host-header"
values = ["one.my-site.com"]
}

condition {
field = "path-pattern"
values = ["/path/*"]
}
}

上面的关键部分在这里,强调一下:

    target_group_arn = aws_alb_target_group.tenant[each.key].arn

由于这两个资源 block 具有相同的 for_each,因此我们可以使用 each.key 进行交叉引用,查找每个监听器规则对应的单个目标组.

关于amazon-web-services - Terraform for_each 变量用于创建多个 AWS 监听器规则并设置唯一的 target_group_arn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59637807/

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