全部,
请求您完成以下方案并帮助我实现解决方案。
我们正在设置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 /掌握”。
您能否就解决这个问题提供一些见解?
答案 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-a
和asg-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
路径路由重复上一个块。