AWS_EN

Forwarding traffic to multiple target groups with path-based routing in ALB

スポンサーリンク
Forwarding traffic to multiple target groups with Path-based routing in ALB. AWS_EN
スポンサーリンク
スポンサーリンク

Configuration of ALB for path-based routing

ALB supports path-based routing.

If you have a listener with a default rule that forwards requests to one target group, you can add a rule that forwards requests to another target group based on URL.

Add path-based routing

In this example, we will prepare two EC2 instances and route the traffic according to the URL.

Environment

Diagram of fowarding traffic to multiple target groups with Path-based routing in ALB.

Create two ALB target groups, and place one EC2 instance in each group.
Install Apache on the two instances and run them as web servers.

CloudFormation Template Files

We will build the above configuration using CloudFormation. We have placed the CloudFormation template at the following URL.

awstut-fa/029 at main · awstut-an-r/awstut-fa
Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

Explanation of key points of template files

The configuration for this project is generally the same as the following page.

For information on how to attach the EC2 instances in the private subnet to the ALB and how to run yum on the EC2 instants in the private subnet, please refer to the above page. The difference is that we are using path-based routing. Therefore, this page will focus on the content related to it.
When doing path-based routing, the following two resources are the key.

  • Target group
  • Listener rules

We will check them in order.

Target Group

In this configuration, we will separate the two instances into different groups. Therefore, the key point is to create two target groups.

Resources: ALBTargetGroup1: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: VpcId: !Ref VPC Name: !Sub "${Prefix}-ALBTargetGroup1" Protocol: HTTP Port: !Ref HTTPPort HealthCheckProtocol: HTTP HealthCheckPath: / HealthCheckPort: traffic-port HealthyThresholdCount: !Ref HealthyThresholdCount UnhealthyThresholdCount: !Ref UnhealthyThresholdCount HealthCheckTimeoutSeconds: !Ref HealthCheckTimeoutSeconds HealthCheckIntervalSeconds: !Ref HealthCheckIntervalSeconds Matcher: HttpCode: !Ref HttpCode Targets: - Id: !Ref Instance1 TargetType: instance ALBTargetGroup2: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Name: !Sub "${Prefix}-ALBTargetGroup2" ...
Code language: YAML (yaml)

No special configuration is required to perform path-based routing. This time, we will create two target groups with exactly the same settings.

Listener Rules

In the listener rule, set the URL and the corresponding target group.

Resources: ALBListener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: DefaultActions: - TargetGroupArn: !Ref ALBTargetGroup1 Type: forward LoadBalancerArn: !Ref ALB Port: !Ref HTTPPort Protocol: HTTP ALBListenerRule1: Type: AWS::ElasticLoadBalancingV2::ListenerRule Properties: Actions: - TargetGroupArn: !Ref ALBTargetGroup1 Type: forward Conditions: - Field: path-pattern PathPatternConfig: Values: - /instance1/* ListenerArn: !Ref ALBListener Priority: 1 ALBListenerRule2: Type: AWS::ElasticLoadBalancingV2::ListenerRule Properties: Actions: - TargetGroupArn: !Ref ALBTargetGroup2 Type: forward Conditions: - Field: path-pattern PathPatternConfig: Values: - /instance2/* ListenerArn: !Ref ALBListener Priority: 2
Code language: YAML (yaml)

As a prerequisite, we need to set the default action, i.e. the default traffic destination, for the listener resource, which can be set in the DefaultActions property. In this case, we will set the ALBTargetGroup1.
In the TargetGroupArn property, specify the target group to be targeted. The associated URL can be set in the Conditions property, where the “path-pattern” is specified in the Field property and the URL is specified in the PathPatternConfig property.
To summarize the above, we will set the following.

  • /: ALBTargetGroup1(Instance1)
  • /instance1/:ALBTargetGroup1(Instance1)
  • /instance2/: ALBTargetGroup2(Instance2)

(Reference) Instance initialization

We will configure two EC2 instances as a web server, and we will do this with UserData.

Resources: Instance1: Type: AWS::EC2::Instance Properties: UserData: !Base64 | #!/bin/bash -xe yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd echo 'path: "/"' >> /var/www/html/index.html ec2-metadata -i >> /var/www/html/index.html mkdir /var/www/html/instance1 echo 'path: "/isntace1/"' >> /var/www/html/instance1/index.html ec2-metadata -i >> /var/www/html/instance1/index.html Instance2: Type: AWS::EC2::Instance Properties: UserData: !Base64 | #!/bin/bash -xe yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd mkdir /var/www/html/instance2 echo 'path: "/isntace2/"' >> /var/www/html/instance2/index.html ec2-metadata -i >> /var/www/html/instance2/index.html
Code language: YAML (yaml)

After installing and starting Apache with yum, create and place HTML files in each directory.
What you need to pay attention to is the position where you place the contents. It must be placed at the location corresponding to the URL mentioned above.

The path pattern is used to route requests but does not alter them. For example, if a rule has a path pattern of /img/*, the rule forwards a request for /img/picture.jpg to the specified target group as a request for /img/picture.jpg.

Listeners for your Application Load Balancers

Following the above, place the HTML file at the location corresponding to the URL as seen from the document root.

Architecting

We will use CloudFormation to build this environment and check the actual behavior.

Create CloudFormation stacks and check resources in stacks

We will create a CloudFormation stack.
For information on how to create a stack and check each stack, please refer to the following page

After checking the resources of each stack, the information of the main resources created this time is as follows.

  • ALB: fa-029-ALB
  • Target group 1: fa-029-ALBTargetGroup1
  • Target group 2: fa-029-ALBTargetGroup2
  • Instance 1: i-06542b7318333fd34
  • Instance 2: i-0d3bdfef3f2f83533

We will also check the resource creation status from the AWS Management Console. First, we will check the ALB.

The ALB has been created successfully.

The ALB has been created.

Next, we will check the listener rules. You can access the rules from the Listener page.

Access the listener rules page.
Listener Rules.

Next, check the target groups.

ALB Target Group 1
ALB Target Group 2

You can see that instances have been registered in each target group.

Operation check

Now that everything is ready, let’s access the ALB.

First is the root page (“/”).

Go to the root page of ALB.

We got a response from instance 1. This means that the traffic has been routed to instance 1 registered in target group 1, as configured in the default action.

Next, access “/instance1/”.

Path-based routing 1

We received a response from instance 1 as well. According to the first line of the listener rule, the traffic was routed to target group 1.

Finally, access “/instance2/”.

Path-based routing 2

The response came from instance 2. It was routed to target group 2 according to the second line of the listener rule.

Summary

We have now confirmed how to forward traffic to multiple target groups using path-based routing in ALB.

タイトルとURLをコピーしました