177 lines
8.3 KiB
Markdown
177 lines
8.3 KiB
Markdown
# Elastic Load Balancing v2
|
|
|
|
**Protocol:** Query (XML) — `POST http://localhost:4566/` with `Action=` parameter
|
|
|
|
Floci supports Application Load Balancers (ALB) and Network Load Balancers (NLB) through the ELBv2 management API. The control plane is AWS SDK / CLI / Terraform compatible, and HTTP listeners can forward to registered instance targets using the target's reachable local address.
|
|
|
|
> Classic (v1) Elastic Load Balancing is a **different API** served from the same endpoint host —
|
|
> see [ELB Classic (v1)](elb-classic.md). Requests are routed by their `Version` parameter:
|
|
> `2015-12-01` here, `2012-06-01` there.
|
|
|
|
## Supported Actions
|
|
|
|
### Load Balancers
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| CreateLoadBalancer | Creates an ALB or NLB in active state with persisted attributes and tags. |
|
|
| DescribeLoadBalancers | Lists or returns stored load balancers. |
|
|
| DeleteLoadBalancer | Deletes a load balancer and stops its listener sockets. |
|
|
| ModifyLoadBalancerAttributes | Updates persisted load balancer attributes. |
|
|
| DescribeLoadBalancerAttributes | Returns attributes stored for a load balancer. |
|
|
| DescribeCapacityReservation | Returns the stored capacity reservation fields for a load balancer. |
|
|
| SetSecurityGroups | Replaces the security groups associated with a load balancer. |
|
|
| SetSubnets | Replaces the subnets associated with a load balancer. |
|
|
| SetIpAddressType | Updates the IP address type stored for a load balancer. |
|
|
|
|
### Target Groups
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| CreateTargetGroup | Creates a target group with protocol, port, health check, and target-type settings. |
|
|
| DescribeTargetGroups | Lists or returns stored target groups. |
|
|
| ModifyTargetGroup | Updates mutable target group settings. |
|
|
| DeleteTargetGroup | Deletes an unused target group. |
|
|
| ModifyTargetGroupAttributes | Updates persisted target group attributes. |
|
|
| DescribeTargetGroupAttributes | Returns attributes stored for a target group. |
|
|
|
|
### Targets
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| RegisterTargets | Registers targets with a target group. |
|
|
| DeregisterTargets | Removes targets from a target group. |
|
|
| DescribeTargetHealth | Returns target health records maintained by Floci. |
|
|
|
|
### Listeners
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| CreateListener | Creates a listener and its non-deletable default rule. |
|
|
| DescribeListeners | Lists or returns stored listeners. |
|
|
| ModifyListener | Updates a listener's configuration and default actions. |
|
|
| ModifyListenerAttributes | Updates persisted listener attributes. |
|
|
| DescribeListenerAttributes | Returns attributes stored for a listener. |
|
|
| DeleteListener | Deletes a listener and stops its socket. |
|
|
| AddListenerCertificates | Adds certificates to a listener. |
|
|
| RemoveListenerCertificates | Removes certificates from a listener. |
|
|
| DescribeListenerCertificates | Lists certificates associated with a listener. |
|
|
|
|
### Rules
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| CreateRule | Creates a non-default listener rule with conditions, actions, and priority. |
|
|
| DescribeRules | Lists or returns listener rules. |
|
|
| ModifyRule | Updates a listener rule's conditions and actions. |
|
|
| DeleteRule | Deletes a non-default listener rule. |
|
|
| SetRulePriorities | Atomically updates rule priorities after validating uniqueness. |
|
|
|
|
### Tags
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| AddTags | Adds tags to supported ELBv2 resources. |
|
|
| RemoveTags | Removes tags from supported ELBv2 resources. |
|
|
| DescribeTags | Returns tags for supported ELBv2 resources. |
|
|
|
|
### Metadata
|
|
|
|
| Action | Description |
|
|
|--------|-------------|
|
|
| DescribeSSLPolicies | Returns Floci's pre-seeded standard SSL policy list. |
|
|
| DescribeAccountLimits | Returns standard default ELBv2 account limits. |
|
|
|
|
## Behavior Notes
|
|
|
|
- Load balancer, target group, listener, rule, and tag state is persisted through Floci storage and rebuilt on service startup.
|
|
- Load balancers are created in `active` state.
|
|
- HTTP listener sockets are preserved when listener actions change and are restarted only when socket-level settings such as port change.
|
|
- Instance targets are resolved through EC2 instance private addresses so local load balancer traffic can reach containers.
|
|
- Target health starts in `initial` state with reason `Elb.RegistrationInProgress` and is updated by Floci's health checker when monitoring is active.
|
|
- Each `CreateListener` automatically creates an immutable default rule (`priority=default`, `isDefault=true`). This rule cannot be deleted; use `ModifyListener` to change its action.
|
|
- Rule priorities are validated for uniqueness. `SetRulePriorities` is atomic: all priority assignments are validated before any change is committed.
|
|
- `DeleteTargetGroup` is rejected with `ResourceInUse` while the target group is referenced by any listener or rule.
|
|
- `DeleteRule` is rejected with `OperationNotPermitted` for the default rule.
|
|
- `DescribeSSLPolicies` returns a pre-seeded list of standard AWS SSL policies (`ELBSecurityPolicy-*`).
|
|
- `DescribeAccountLimits` returns standard default limits (e.g., 50 load balancers per region, 100 target groups, etc.).
|
|
- `routing.http.preserve_host_header.enabled` (default `false`) controls whether the original client Host header is forwarded to targets unchanged, or replaced with the target's `host:port`.
|
|
- `RegisterTargets` rejects link-local and cloud instance-metadata addresses (`169.254.0.0/16`, `fe80::/10`, `fd00:ec2::254`) with `InvalidTarget`, and the load balancer and its health checks refuse to connect to them. Loopback and private addresses stay reachable so a load balancer can front a neighbouring container.
|
|
|
|
## ARN Format
|
|
|
|
```
|
|
arn:aws:elasticloadbalancing:{region}:{account-id}:loadbalancer/app/{name}/{hex16}
|
|
arn:aws:elasticloadbalancing:{region}:{account-id}:targetgroup/{name}/{hex16}
|
|
arn:aws:elasticloadbalancing:{region}:{account-id}:listener/app/{lb-name}/{lb-id}/{hex16}
|
|
arn:aws:elasticloadbalancing:{region}:{account-id}:listener-rule/app/{lb-name}/{lb-id}/{listener-id}/{hex16}
|
|
```
|
|
|
|
## Examples
|
|
|
|
```bash
|
|
export AWS_ENDPOINT_URL=http://localhost:4566
|
|
|
|
# Create a load balancer
|
|
aws elbv2 create-load-balancer \
|
|
--name my-alb \
|
|
--type application \
|
|
--scheme internet-facing
|
|
|
|
# Create a target group
|
|
aws elbv2 create-target-group \
|
|
--name my-targets \
|
|
--protocol HTTP \
|
|
--port 80 \
|
|
--target-type instance
|
|
|
|
# Register targets
|
|
aws elbv2 register-targets \
|
|
--target-group-arn arn:aws:elasticloadbalancing:us-east-1:000000000000:targetgroup/my-targets/abc123 \
|
|
--targets Id=i-00000000001,Port=8080
|
|
|
|
# Create a listener with a default forward action
|
|
aws elbv2 create-listener \
|
|
--load-balancer-arn arn:aws:elasticloadbalancing:us-east-1:000000000000:loadbalancer/app/my-alb/abc123 \
|
|
--protocol HTTP \
|
|
--port 80 \
|
|
--default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:us-east-1:000000000000:targetgroup/my-targets/abc123
|
|
|
|
# Add a path-based routing rule
|
|
aws elbv2 create-rule \
|
|
--listener-arn arn:aws:elasticloadbalancing:us-east-1:000000000000:listener/app/my-alb/abc123/def456 \
|
|
--priority 10 \
|
|
--conditions Field=path-pattern,Values='/api/*' \
|
|
--actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:us-east-1:000000000000:targetgroup/my-targets/abc123
|
|
|
|
# Describe load balancers
|
|
aws elbv2 describe-load-balancers
|
|
|
|
# Describe target health
|
|
aws elbv2 describe-target-health \
|
|
--target-group-arn arn:aws:elasticloadbalancing:us-east-1:000000000000:targetgroup/my-targets/abc123
|
|
|
|
# Tag a resource
|
|
aws elbv2 add-tags \
|
|
--resource-arns arn:aws:elasticloadbalancing:us-east-1:000000000000:loadbalancer/app/my-alb/abc123 \
|
|
--tags Key=env,Value=dev
|
|
|
|
# Clean up
|
|
aws elbv2 delete-listener \
|
|
--listener-arn arn:aws:elasticloadbalancing:us-east-1:000000000000:listener/app/my-alb/abc123/def456
|
|
aws elbv2 delete-load-balancer \
|
|
--load-balancer-arn arn:aws:elasticloadbalancing:us-east-1:000000000000:loadbalancer/app/my-alb/abc123
|
|
aws elbv2 delete-target-group \
|
|
--target-group-arn arn:aws:elasticloadbalancing:us-east-1:000000000000:targetgroup/my-targets/abc123
|
|
```
|
|
|
|
## Configuration
|
|
|
|
| Environment variable | Default | Description |
|
|
|---|---|---|
|
|
| `FLOCI_SERVICES_ELBV2_ENABLED` | `true` | Enable or disable the ELBv2 service |
|
|
|
|
## Listener Ports
|
|
|
|
Listener sockets bind on the Floci host. Expose any listener ports you need in Docker Compose when Floci itself runs in a container, similar to RDS and ElastiCache proxy ports.
|