首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未能将负载均衡器与目标组关联起来

未能将负载均衡器与目标组关联起来
EN

Stack Overflow用户
提问于 2021-02-04 08:23:42
回答 2查看 3.1K关注 0票数 0

我正在使用Terraform部署我的基础设施,并且经常遇到以下错误:

代码语言:javascript
复制
Error: InvalidParameterException: The target group with targetGroupArn [snip] does
not have an associated load balancer.

another question here on SO where the poster is running into a similar problem。其中一个答案引用了AWS文档:

-- Amazon服务--需要显式依赖于应用程序负载平衡器侦听器规则和应用程序负载均衡器侦听器。这将防止服务在侦听器准备就绪之前启动。

这基本上是说我应该在服务之前创建我的侦听器和侦听器规则。但是,在我的侦听器中,我将服务的目标组指定为默认操作:

代码语言:javascript
复制
resource "aws_alb_listener" "app_http" {
  load_balancer_arn = module.alb_app.arn
  port              = 80
  protocol          = "HTTP"

  default_action {
    target_group_arn = module.app_service.lb_target_group.id
    type             = "forward"
  }
}

因此,如果侦听器应该在服务和目标组之前创建,我就不知道如何在侦听器上设置target_group_arn

我就是这样创建我的服务及其相应的目标组的:

代码语言:javascript
复制
resource "aws_ecs_service" "service" {
  ...

  load_balancer {
    target_group_arn = aws_alb_target_group.service.arn
  }
}

resource "aws_alb_target_group" "service" {
  ...

  port        = 8080
  protocol    = "HTTP"
  vpc_id      = var.vpc_id
  target_type = "ip"
}
EN

回答 2

Stack Overflow用户

发布于 2021-02-04 13:15:19

正如linked answer所建议的,您需要设置对负载平衡器侦听器的依赖关系。

在当前代码中,Terraform将看到如下所示的依赖链(点击运行代码片段查看依赖关系图):

代码语言:javascript
复制
mermaid.initialize({startOnLoad:true});
代码语言:javascript
复制
<script src="https://unpkg.com/mermaid@8.0.0/dist/mermaid.min.js"></script>

<div class="mermaid">
graph TD
    A[aws_alb_listener.app_http] --> B[module.alb_app.arn]
    A[aws_alb_listener.app_http] --> C[module.app_service.lb_target_group.id]
    D[aws_ecs_service.service] --> C*[aws_alb_target_group.service.arn]

</div>

您的错误是,当它试图创建/更新服务以使用目标组时,目标组尚未附加到负载平衡器,因为目标组尚未附加到侦听器规则,或者侦听器规则尚未附加到负载均衡器(这很可能是因为ALB创建比目标组创建慢得多,侦听器需要等待ALB和目标组才能创建)。

通常,您可以通过告诉aws_ecs_service资源,它还必须依赖于侦听器或侦听器规则创建才能使用depends_on meta argument完成这一问题,如下所示:

代码语言:javascript
复制
resource "aws_ecs_service" "service" {
  ...

  load_balancer {
    target_group_arn = aws_alb_target_group.service.arn
  }

  # We need to wait until the target group is attached to the listener
  # and also the load balancer so we wait until the listener creation
  # is complete first
  depends_on = [aws_alb_listener.app_http]
}

使用更简单的非模块布局,如下所示:

代码语言:javascript
复制
mermaid.initialize({startOnLoad:true});
代码语言:javascript
复制
<script src="https://unpkg.com/mermaid@8.0.0/dist/mermaid.min.js"></script>

<div class="mermaid">
graph TD
    A[aws_alb_listener.app_http] --> B[aws_alb.app.arn]
    A[aws_alb_listener.app_http] --> C[aws_alb_target_group.service.arn]
    D[aws_ecs_service.service] --> C[aws_alb_target_group.service.arn]
    D[aws_ecs_service.service] -->|depends_on| A[aws_alb_listener.app_http]

</div>

看起来,您有一个过于复杂的模块布局,我可能会建议您反对,并且很难确切知道您提供的不完整代码的地址是什么,但是如果侦听器位于一个名为app_lb_listener的模块中,那么您将需要依赖于module.app_lb_listener.aws_alb_listener.app_http

票数 2
EN

Stack Overflow用户

发布于 2021-02-04 08:56:43

您的aws_alb_target_group应该依赖于负载均衡器,因为两者之间没有直接引用:

代码语言:javascript
复制
resource "aws_alb_target_group" "service" {
  ...

  port        = 8080
  protocol    = "HTTP"
  vpc_id      = var.vpc_id
  target_type = "ip"

  depends_on = [aws_alb.ecs-load-balancer]

}

其中aws_alb.ecs-load-balancer应该被负载均衡器资源替换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66041806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档