amazon-web-services - 无法将负载均衡器与目标组关联
问题描述
我正在使用 Terraform 部署我的基础架构,但一直遇到以下错误:
Error: InvalidParameterException: The target group with targetGroupArn [snip] does
not have an associated load balancer.
SO上有另一个问题,海报遇到了类似的问题。答案之一引用了 AWS 文档:
Amazon ECS 服务需要对 Application Load Balancer 侦听器规则和 Application Load Balancer 侦听器的显式依赖。这可以防止服务在侦听器准备好之前启动。
这基本上是说我应该在我的服务之前创建我的监听器和监听器规则。但是,在我的侦听器中,我将服务的目标组指定为默认操作:
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
因此,如果应该在我的服务和目标组之前创建侦听器,我对如何设置侦听器感到困惑。
这就是我创建服务及其相应目标组的方式:
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"
}
解决方案
正如链接的答案所暗示的那样,您需要设置对负载均衡器侦听器的依赖关系。
使用您当前的代码,Terraform 将看到一个如下所示的依赖链(在代码片段上运行以查看依赖图):
mermaid.initialize({startOnLoad:true});
<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
元参数来解决这个问题:
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]
}
其中,使用更简单的非模块布局,看起来像这样:
mermaid.initialize({startOnLoad:true});
<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
。
推荐阅读
- python - 我如何获得不和谐的消息并将其输入到 python 终端
- gluon-mobile - 如何按特定顺序对 CharmListView 进行排序?
- javascript - 在未经同意的情况下停止加载 Google Analytics cookie
- python - 如何从每个观察值都是列表的熊猫数据框中构建直方图?
- java - 扫描 String 和 ArrayList 的 HashMap 中的输入
- html - 当您将 Flex-Basis 视为百分比时,为什么 Flex Grow 不这样做呢?
- java - MongoDb:在数组字段上运行 $replaceOne
- html - 在
- node.js - HTTPS 的 Puppeteer VUE JS 问题
- ios - 调整缓冲区大小会导致丢帧