Lab 17: The Appliance Mode That Was Enabled And Ignored
Appliance mode is enabled. Route propagation is enabled on the right route table. Every check AWS documents passes. Half of same-zone traffic is still handed to the appliance in the wrong Availability Zone, and the bill shows it before anything else does.
- Debugging time
- ~40 min
- Reading time
- 12 min
- Reported by
- Cloud Platform
- Tier
- Specialty
Cross-zone data transfer on the inspection VPC is roughly half of all inspected traffic
Reported by Cloud Platform
Finance flagged cross-zone transfer on the inspection VPC. It is running at close to half the total inspected volume, which should be near zero — the workloads that talk to each other are deliberately co-located in the same Availability Zone precisely so inspection stays in-zone.
We enabled appliance mode when we built this, exactly for this reason. I have checked it: the
attachment reports ApplianceModeSupport: enable.
I also checked the prerequisite in the documentation, which says route propagation must be enabled on
the transit gateway route table associated with the appliance-mode attachment. It is enabled. Both
spoke attachments show enabled in get-transit-gateway-route-table-propagations.
So both requirements are met and the behaviour is wrong. There is no error anywhere, nothing has alarmed, and the only reason we know is the invoice.
What you are working with
One Transit Gateway, three VPCs, two Availability Zones.
One transit gateway, drawn on each path it carries. Client and target are both pinned into the first Availability Zone, which is the condition under which appliance mode is documented to keep a flow on one appliance. The inspection VPC's attachment spans both zones, so the transit gateway has an interface in each to choose between — and the count of flows landing on each appliance is the measurement this lab takes.
| Resource | Configuration |
|---|---|
| Client | Spoke A, 10.180.1.50, first AZ |
| Target | Spoke B, 10.181.1.50, first AZ |
| Appliance A | Inspection VPC, first AZ |
| Appliance B | Inspection VPC, second AZ |
| Appliance attachment | ApplianceModeSupport: enable, subnets in both zones |
| Spoke route table | Both spoke prefixes → appliance attachment |
| Appliance route table propagations | Both spoke attachments, enabled |
| Appliance route table routes | Both spoke prefixes, present |
Source and destination are in the same Availability Zone. Per AWS's documented Scenario 1, appliance mode should hold that zone for the whole flow, so every flow should reach appliance A.
- EC2
Client, first AZ
10.180.1.50 → 10.181.1.50
- GW
Transit gateway
spoke route table sends the prefix to the appliance attachment
- RTB
Availability Zone selection
appliance mode enabled, propagation enabled
Dropped — The route actually in use for the destination prefix is static, and a static route carries no Availability Zone information. With nothing to reason over, the transit gateway hashes the flow and picks a zone.
- VPCE
Appliance A, first AZ
receives roughly half the flows
- VPCE
Appliance B, second AZ
receives roughly half the flows, and should receive none
Nothing fails. Each flow is inspected, consistently, by one appliance. Half of them cross a zone boundary to get there.
Scope and constraints
- In scope: why zone affinity is not happening when both documented requirements are met.
- Out of scope: appliance mode itself, the propagation configuration, the attachment subnets, and the spoke route table. All correct.
- The reporter is right on both counts. Appliance mode is enabled and propagation is enabled. Verify both yourself early so you stop re-checking them.
- Nothing is broken. No connection fails and no alarm fires. This is a cost and blast-radius finding.
- The fix removes configuration rather than adding it.
Deploy the broken state
cd lab-17-appliance-mode-static-shadow
terraform init
terraform applyThe Transit Gateway takes a few minutes and the attachments a few more — budget about eight minutes before anything is testable.
The rest of this lab is part of Labs Pro
The reproduction steps, the deployable Terraform, and the debrief with root cause and remediation diff for this lab are available to Labs Pro members. One payment of $49, no subscription, and it covers every Pro lab now and later.
The incident brief is open, so you can see what you would be solving before you decide.
Already bought it? Sign in and it unlocks.
The rest of this lab is part of Labs Pro
The reproduction steps, the deployable Terraform, and the debrief with root cause and remediation diff for this lab are available to Labs Pro members. One payment of $49, no subscription, and it covers every Pro lab now and later.
The incident brief is open, so you can see what you would be solving before you decide.
Already bought it? Sign in and it unlocks.