AWS Application负载均衡器与经典负载均衡器

时间:2016-12-29 12:41:59

标签: amazon-web-services

全部,

请求您完成以下方案并帮助我实现解决方案。

我们正在设置2个NodeJS Web应用程序,这些应用程序将在4个不同的EC2实例上运行(每个实例2个)。

应用程序 - 应用程序 EC1,EC2 - > EC2实例 ASG - 自动缩放组

App-A-EC1,EC2-> ASG1 - > ELB1(ASG1中基于ELB的健康检查) App-B-EC3,EC4-> ASG2 - > ELB2(ASG2中基于ELB的健康检查)

我们只注册了一个公共域名 - >例如:mycloud.services.com由于其他限制。我们希望使用基于路径的方法来路由来自此单个域的流量。

即。 mycloud.services.com/appa - >应重定向到ASG1下运行的网站(即EC1,EC2) 即mycloud.services.com/appb - >应重定向到ASG2下运行的网站(即EC3,EC4)

实现这一目标的最佳方法是什么?这种方法有任何缺点吗?

我检查过Classic负载均衡器有这种类型的功能&我试过这个(经典lb),但是我无法在侦听器配置页面中选择ELB,它只查找目标组。

有人可以帮助详细说明通过这种方式或其他更好的方式来解决这个问题吗?

由@BerryRee尝试解决方案并面对下面详述的另一个问题,

Thx&祝你今年过得愉快。您的上述解决方案似乎有效。我已经完成了配置,但在这方面仍然有一个问题。

我有一个简单的网站运行来测试两个差异端口,8000&我可以使用我的EC2服务器的公共IP在我的浏览器中使用此端口访问这两个站点。

我创建了两个目标群体master&这些港口交通的孩子,这两个港口的这些登记实例都显示健康。然后我创建了一个ALB来映射这些目标组并按照您的建议创建路径模式。

ht://XX.XX.XX.XX:8000 / ---> MASTER(ext-tg-master) Hello World!

ht://XX.XX.XX.XX:8001 / --->儿童(孩子) 来自CHILD的Hello World!

ht://lb-name.us-east-1.elb.amazonaws.com/master/(/ child

不能GET / master /或/ child /

HT://lb-name.us-east-1.elb.amazonaws.com/ Hello World!

路径模式目标组名称优先级规则ARN操作 / master / * ext-tg-master 1 / child / * ext-tg-child 2                  ext-tg-master默认

现在唯一的问题是,当我点击URL时没有任何路径模式,它默认为正确的目标组并将hello world输出为“master” 按照上面的配置。但是当我在最后一个路径值时,我得到上面的错误“不能GET /孩子或不能GET /掌握”。

您能否就解决这个问题提供一些见解?

1 个答案:

答案 0 :(得分:2)

AWS不支持将ELB放在ALB后面(或ELB后面的ALB等)的用例。

但是,对于您来说,您的路由和负载平衡都可以通过一个ALB来处理。

               _______________
==> /appa ==> |               | ===> target-group for App-A
              |    AWS ALB    |
==> /appb ==> |_______________| ===> target-group for App-B

您可以使用AWS CLI创建ALB和目标组 - 我将其留作练习,以在AWS控制台上执行这些相同的步骤。

由于您已经为自己的应用创建了自动缩放组,因此我们假设他们已经调用asg-group-aasg-group-b

# Create a target group for each of your apps
# There are plenty more options you can specify like health checks,
# but that is specific to you
aws elbv2 create-target-group --name app-a-target-group --protocol HTTP --port 80 --vpc-id vpc-(YOUR VPC ID)

aws elbv2 create-target-group --name app-b-target-group --protocol HTTP --port 80 --vpc-id vpc-(YOUR VPC ID)

以上两个命令都应该输出一个类似下面的JSON blob。记下TargetGroupArn值,因为您需要将目标组与自动缩放组关联。

{
  "TargetGroups": [
      {
          "HealthCheckPath": "/",
          "HealthCheckIntervalSeconds": 30,
          "VpcId": "vpc-(YOUR VPC ID)",
          "Protocol": "HTTP",
          "HealthCheckTimeoutSeconds": 5,
          "HealthCheckProtocol": "HTTP",
          "UnhealthyThresholdCount": 2,
          "HealthyThresholdCount": 5,
          "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/app-a-target-group/73e2d6bc24d8a067",
          "Matcher": {
              "HttpCode": "200"
          },
          "HealthCheckPort": "traffic-port",
          "Port": 80,
          "TargetGroupName": "my-targets"
      }
  ]
}

现在将目标组附加到各自的自动缩放组。

# Attach the target groups to your ASGs
aws autoscaling attach-load-balancer-target-groups --auto-scaling-group-name asg-group-a --target-group-arn TARGET_GROUP_A_ARN

aws autoscaling attach-load-balancer-target-groups --auto-scaling-group-name asg-group-b --target-group-arn TARGET_GROUP_B_ARN

现在创建应用程序负载均衡器。您将需要来自同一区域的两个位于不同可用区域的子网。

aws elbv2 create-load-balancer --name node-app-alb \
--subnets SUBNET-A SUBNET-B (...) --security-groups [SECURITY-GROUP ...]

上面的命令将返回另一个包含负载均衡器ARN的JSON blob,如下所示。保持这个,因为你需要它来创建听众。

arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/node-app-alb/1234567890123456

现在我们将为app-A配置基于路径的路由。

# Create a listener for app-a
# This command will return an ARN for the listener, use that in the next command
aws elbv2 create-listener --load-balancer-arn (ALB ARN) \
--protocol HTTP --port 80  \
--default-actions Type=forward,TargetGroupArn=(ARN FOR APP-A TARGET GROUP)

# create a path routing rule for your new listener to route requests for app-a
aws elbv2 create-rule --listener-arn (APP-A LISTENER ARN) --priority 10 \
--conditions Field=path-pattern,values='/appa/*' \
--actions Type=forward,TargetGroupArn=(ARN FOR APP-A TARGET GROUP)

您可以为appb路径路由重复上一个块。