Elastic Load Balancing (Classic, v1)
Protocol: Query (XML) — POST http://localhost:4566/ with Action= and Version=2012-06-01
Classic Elastic Load Balancing is the 2012-06-01 API behind aws elb and Terraform's aws_elb
resource. It is a different API from ELB v2 (ALB/NLB, 2015-12-01), even though both
are served from the same endpoint host and signed with the same elasticloadbalancing credential
scope.
How Floci tells the two apart
Every Query-protocol request carries the API version it is speaking as the Version form
parameter, and that is what Floci routes on:
Version |
Answered by |
|---|---|
2012-06-01 |
Classic (this page) |
2015-12-01 |
ELB v2 |
Responses are emitted in the matching namespace —
http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/ for Classic. A Classic
CreateLoadBalancer returns DNSName and nothing else; Classic load balancers have no ARN and
are addressed by LoadBalancerName for their whole life.
If a hand-rolled client omits Version, Floci falls back to the request shape: an action unique
to one API decides, and for the action names both APIs define (CreateLoadBalancer,
DescribeLoadBalancers, AddTags, …) the presence of LoadBalancerName or LoadBalancerNames
selects Classic. With neither present the request goes to ELB v2.
Supported Actions
| Action | Description |
|---|---|
| CreateLoadBalancer | Creates a Classic load balancer with listeners, subnets or AZs, security groups, scheme, and tags. Returns DNSName. |
| DescribeLoadBalancers | Returns LoadBalancerDescription records, optionally filtered by LoadBalancerNames. |
| DeleteLoadBalancer | Deletes a load balancer; deleting one that does not exist succeeds. |
| CreateLoadBalancerListeners | Adds listeners. A conflicting listener on a port already in use is rejected with DuplicateListener. |
| DeleteLoadBalancerListeners | Removes listeners by LoadBalancerPorts. |
| ConfigureHealthCheck | Replaces the health check and re-arms Floci's checker. |
| RegisterInstancesWithLoadBalancer | Registers EC2 instances and returns the full registered set. |
| DeregisterInstancesFromLoadBalancer | Removes instances and returns the remaining set. |
| DescribeInstanceHealth | Returns InstanceStates for the named instances, or for every registered instance. |
| ModifyLoadBalancerAttributes | Updates cross-zone, access log, connection draining, connection settings, and additional attributes. Unsent members keep their current value. |
| DescribeLoadBalancerAttributes | Returns the full attribute structure. |
| ApplySecurityGroupsToLoadBalancer | Replaces the security groups. |
| AttachLoadBalancerToSubnets / DetachLoadBalancerFromSubnets | Adds or removes subnets and recomputes the availability zones and VPC. |
| EnableAvailabilityZonesForLoadBalancer / DisableAvailabilityZonesForLoadBalancer | Adds or removes availability zones. |
| AddTags / RemoveTags / DescribeTags | Tagging, keyed by LoadBalancerNames. |
| DescribeAccountLimits | Returns standard default Classic limits. |
Not implemented
These Classic operations return UnsupportedOperation in the 2012-06-01 namespace rather than a
fabricated result:
CreateAppCookieStickinessPolicy, CreateLBCookieStickinessPolicy, CreateLoadBalancerPolicy,
DeleteLoadBalancerPolicy, DescribeLoadBalancerPolicies, DescribeLoadBalancerPolicyTypes,
SetLoadBalancerPoliciesForBackendServer, SetLoadBalancerPoliciesOfListener,
SetLoadBalancerListenerSSLCertificate.
Floci also does not run a Classic data plane: listener ports are recorded but no socket is opened and no traffic is forwarded. Only the control plane and health checking are emulated.
Behavior Notes
- Load balancer state is persisted through Floci storage and health checking is restarted on startup.
- A new load balancer gets AWS's default health check (
TCP:80, interval 30, timeout 5, unhealthy 2, healthy 10) and AWS's default attributes (cross-zone off, access log off, connection draining off with a 300 second timeout, 60 second idle timeout). - Health checks probe the instance's reachable local address.
HTTP:/HTTPS:targets are probed with an HTTP request to the target's path and any 2xx/3xx is healthy;TCP:/SSL:targets are probed by connecting. TLS is not terminated — anHTTPS:target is probed over plain HTTP on the same port. - Between registration and the first successful check an instance reports
OutOfServicewith reason codeELB, as it does on AWS. - An Auto Scaling group that names Classic load balancers in
LoadBalancerNameshas its instances registered and deregistered automatically, so a Terraformmin_elb_capacitywait can be satisfied.
Configuration
| Environment variable | Default | Description |
|---|---|---|
FLOCI_SERVICES_ELB_ENABLED |
true |
Enable or disable the Classic ELB service |
FLOCI_SERVICES_ELB_MOCK |
false |
When true, never probe: a registered instance is InService immediately |
Examples
export AWS_ENDPOINT_URL=http://localhost:4566
aws elb create-load-balancer \
--load-balancer-name my-classic-elb \
--listeners "Protocol=HTTP,LoadBalancerPort=80,InstanceProtocol=HTTP,InstancePort=8080" \
--subnets subnet-12345678
aws elb configure-health-check \
--load-balancer-name my-classic-elb \
--health-check Target=HTTP:8080/,Interval=10,Timeout=3,UnhealthyThreshold=2,HealthyThreshold=2
aws elb register-instances-with-load-balancer \
--load-balancer-name my-classic-elb \
--instances i-1234567890abcdef0
aws elb describe-instance-health --load-balancer-name my-classic-elb
aws elb delete-load-balancer --load-balancer-name my-classic-elb