AWS Relationships between EC2, ELB and ASG
This post describes the basic relationships of ELBs (now ALBs), EC2 instances and ASGs. I used AWS for over a year before I realized how Auto Scaling Groups actually interacted with ELBs and EC2 instances.
Terms
EC2: An Amazon virtual machine used to host applications and services. EC2 instances can be pooled for scale or failover. EC2 instances can be based on any of the Amazon EC2 machine types.
Elastic Load Balancer (ELB): The basic load balancer provided by Amazon. They are used as a reverse proxy servers for pools of EC2 instances. ELBs determine instance health via basic health check operations.
Auto Scaling Group (ASG): A control mechanism that manages how many EC2 instances make up a pool. ASGs will create new EC2 instances based on configured pool sizes. They can also auto-scale up and auto-scale down the pool sizes based on load. ASGs can register created EC2 instances with associated ELBs.
Availability Zones (AZ): An Amazon region is made up of various data centers that have isolated power and communication. Those data centers are referred to as Availability Zones. An ASG can spread its' EC2 instances across those data centers. This increases the availability of the EC2 instance pool and reduces the impact of data center failure.
Standard Deployment
Auto Scaling Groups (ASG) and Availability Zones (AZ)
An ASG controls the number and location of EC2 instances that make up a worker pool.
The ASG creates new instances when needed based on a Launch Configuration. It creates new instances when a new ASG is first created, when an ASG needs to "size up" based on configuration changes or increased demand.
It destroys all associated instances when an ASG is destroyed. It individual instances when an ASG's pool size settings are changed or when demand falls below the load required for the current number of instances.
An ASG can distirbute instances across one or more availability zones. This means the ASG can configure the worker pool for basic HA.
The ASG creates new instances when needed based on a Launch Configuration. It creates new instances when a new ASG is first created, when an ASG needs to "size up" based on configuration changes or increased demand.
It destroys all associated instances when an ASG is destroyed. It individual instances when an ASG's pool size settings are changed or when demand falls below the load required for the current number of instances.
An ASG can distirbute instances across one or more availability zones. This means the ASG can configure the worker pool for basic HA.
Elastic Load Balancer (ELB) and ASG
An ELB acts as a load balancer acts as a reverse proxy server for a set of EC2 instances that have been registered with the load balancer. The ELB knows nothing about the type or purpose of nodes in the worker pool. An ELB can forward to nodes in different Availability Zones (AZ)
ASGs know how to register instances with an ELB. This means an ALB can automatically add and remove worker nodes as they are created or destroyed.
ELBs know about instances. ASGs know about instances and ELBs.
Relationships
- ELB
- Distributes traffic across target EC2 instances
- Application Scaling Group
- Creates Instances
- Distributes Instances across Availability Zones
- Registers instances with ELB
- ELB
- Knows about Instances
- Does not know about ASG
ELB Configuration with Cloud Formation
Application components are best created as part of a Cloud Formation template. Basic ELB Cloud Formation templates define the load balancer type, the availability zones and the configuration of the listeners. The ELB configuration does not define the instances that the listener forwards to. Note that the cloud formation template defines a HealthCheck used by the ELB to determine if a target instances is "healthy" enough to accept traffic.
Here is a sample ELB configuration from the AWS tutorial:
"ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "CrossZone" : "true", "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP" } ], "HealthCheck" … } },
ASG Behavior and ELB Linkage
ASGs create, destroy and generally manage a pool of worker nodes / instances. They allocate created instances across a set of subnets or Availability zones to create low cost highly available applications. The diagram at right describes a three node network. It does not describe any set of Availability zones.
ASGs are configured with minimum, maximum and desired number of instances. They manage there worker pool to meet those numbers. Some teams manage costs by problematically adjusting their min/max pool sizes in the evening or during times of low demand. It is possible to take all of an ASG's nodes off line by setting the pool sizes to "0".
Dynamic autoscaling is not a mandatory "must use" feature of an ASG.
This is separate from autoscaling behavior where the pool sizes are adjusted based on CPU utilization or some other metrics. Monitors can listen for resource consumption events and adjust the ASG pool size accordingly.. Here is an ASG that will maintain from 1-3 worker nodes.
ASGs are configured with minimum, maximum and desired number of instances. They manage there worker pool to meet those numbers. Some teams manage costs by problematically adjusting their min/max pool sizes in the evening or during times of low demand. It is possible to take all of an ASG's nodes off line by setting the pool sizes to "0".
Dynamic autoscaling is not a mandatory "must use" feature of an ASG.
This is separate from autoscaling behavior where the pool sizes are adjusted based on CPU utilization or some other metrics. Monitors can listen for resource consumption events and adjust the ASG pool size accordingly.. Here is an ASG that will maintain from 1-3 worker nodes.
"WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : ""}, "LaunchConfigurationName" :
{ "Ref" : "LaunchConfig" }, "MinSize" : "1", "MaxSize" : "3", "LoadBalancerNames" :
[ { "Ref" : "ElasticLoadBalancer" } ],
},
EC2 Names and other stuff
EC2 Instances have Instance Id's that define individual instances that are unique in an Accouint. You will often also see a "Name" value in various EC2 dashboards. This represents the "component" or "common" name for a pool of machines doing the same function. Amazon implenets the "Name" attribute as an EC2 Tag. It is a well known tag that has psuedo-special meaning. I highly recommend adding a Name tage in your Cloiud Formation template or whenever manually creating machines.
- EC2 Names
- Name field on EC2 instances, just a Tag
- Name is convention so that related instances have a common value
- Do not define instance relationships in AWS
- Same EC2 Name could be used for different roles. Don’t do that.
- ASGs create instances with same Name but different Instance IDs
- ELB is a proxy for a pool of instances
- Could target instances with different names.
- ALB Target Group behaves like an ELB.
Example Cloud Formation Tempalate
Amazon has a sample Cloud Formation template that sets up a web app with an ELB, ASG and some scale up and scale down behavior. You can find this example and the associated Cloud Formation json file at http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/example-templates-autoscaling.html
The Cloud Formation section of the AWS Console has a "design" function that creates a picture of how your Cloud Formation template actually hangs together. The example one is shown below. The primary area of focus above was the Elastic Load Balancer, the Web Server auto-scaling group and the Launch Configuration used to create new instances to populate the ASG and be configured into the ELB.
Created 2017 Feb 01
Comments
Post a Comment