AWS Cloud

AWS owns one end: building Direct Connect from the on-prem side, step by step

From the cross-connect patch outward — router, optics, VLANs, BGP, routing policy, encryption — Direct Connect is your build, and that's exactly where every bring-up fails.

Deep dive · cloud & network engineers ·

Scope & versions: AWS Direct Connect as documented mid-2026 (DX User Guide), with Cisco IOS-XE and Juniper Junos config patterns. Version-sensitive values — optics per speed tier, prefix limits, MTU, BFD timers, MACsec availability, BGP community values, optical dBm ranges — are attributed inline. Re-verify against the current User Guide before you order or cut over.

The clicks that lie — where AWS's job ends and yours begins

The Direct Connect console makes it look like a few clicks: request a connection, create a virtual interface, done. Then the port comes up and BGP won't establish — or it establishes and drops an hour later — and none of it is in the console. It's your VLAN tag, your MD5 key, your prefix count, your MTU. AWS owns exactly one end of this circuit: from its Direct Connect device inward. Everything from the cross-connect patch outward is yours to order, cable, and configure. This guide walks that on-prem build end to end, with the router config and the failures that actually bite.

TL;DR

  • The demarcation is the cross-connect. AWS owns from its DX device inward; the router, optics, fiber, VLAN, BGP, routing policy, and encryption are all yours — so bring-up failures are almost always on your side of the patch.
  • The connection model sets the workload. A dedicated port (1/10/100/400 Gbps) means you do the full physical build and order the cross-connect; a hosted connection (50 Mbps–25 Gbps) means a partner already did the physical and you peer over one VIF that AWS polices.
  • Each VIF is a VLAN plus a BGP session you configure: the 802.1Q tag, the /30 or /31 peer IPs, your ASN (AWS is 7224 on public VIFs), and a matching MD5 key. A mismatch on any one and BGP never comes up.
  • The limits are unforgiving: advertise more than 100 routes on a private or transit VIF and the whole BGP session goes idle; MTU must match on both ends (9001 private, 8500 transit); above 1 Gbps, turn auto-negotiation off.
  • Resiliency and encryption are on-prem work too: a second device in a second DX location for the 99.99% SLA, BFD for sub-second failover, and MACsec (dedicated 10/100/400 G) or an IPsec VPN over a public VIF — and you must test failover before you trust it.

The one line to keep in your head: from the AWS DX router inward — the backbone, the gateways, the Regions — is theirs. From the cross-connect patch outward — router, optics, fiber, BGP config, routing policy — is yours. The colo owns the physical patch in the middle. Almost everything that goes wrong at bring-up lives in the part AWS can't see.

What you're building, and what you need in place first

Before the phases, hold the whole picture. A Direct Connect deployment is a chain, and your team owns most of the links in it: an edge router with the right optics, a cross-connect through a colo meet-me room, an AWS DX port, then a band of virtual interfaces — each a VLAN with its own BGP session — reaching a VPC, the Transit Gateway, or AWS's public service prefixes.

Virtual interfaces — 802.1Q VLAN + BGP per VIFOn-prem edge routerSMF + optics · 802.1Q · BGP2nd router / 2nd DX location(resiliency)Cross-connectMMR patch · LOA-CFAMACsec · L2 encryptAWS Direct Connectport / devicePrivate VIFVLAN · peer IP · ASN · MD5Public VIFAWS ASN 7224 · 1000 routesTransit VIF100-route limit · MTU 8500IPsec VPN over public VIFend-to-end / hosted / sub-1GVGW / DX GatewayVPCAWS public service prefixesS3 · DynamoDB · …DX GatewayTransit Gateway→ VPCsYOUR SIDEDX LOCATIONAWS EDGEAWS TARGETS◀ AWS owns this sideLeft→right corridor: everything from the cross-connect outward (left of the DX port) is yours to build.
fig-01 · The finished link. AWS owns the DX port and everything to its right; the router, optics, cross-connect, VLANs, and BGP to its left are yours. Every phase figure below is a state of this same canvas.

One detail the corridor above hides: your edge router usually doesn't sit in your data center — it lives in the Direct Connect colo, and a backhaul circuit carries traffic the rest of the way to where your servers actually are. That last mile is yours too, and it is often the real bottleneck and the single point of failure.

YOUR DATA CENTERBACKHAUL · last mile (yours)DX LOCATION · coloAWSDC fabricyour WANlast-mile802.1Q + BGPServers / appsspine-leaf fabricWAN / core routerBackhaul circuit (yours)Metro Ethernet · dark fiberMPLS · wavelength2nd diverse circuitfor the 99.99% designDX edge routerin the colo · 802.1Q + BGPCross-connectMMR patchAWS Direct Connectport◀ AWS owns only this patchEverything left of the cross-connect is yours — including the backhaul, the WAN, and the DC fabric. MTU must match end-to-end (9001 / 8500) at every hop.
The edge router sits in the DX colo; a backhaul circuit (metro Ethernet, dark fiber, MPLS, or wavelength) crosses your WAN into the data center. Everything left of the cross-connect is yours — including the backhaul, which is frequently the real bottleneck and single point of failure.

Prerequisites — have these before you order

PrerequisiteWhy it matters
Presence in a Direct Connect locationYour own cage or rack in the facility, or a Direct Connect Partner / provider who has it. No presence means you cannot order a cross-connect yourself.
A router that speaks BGP + BGP MD5Any modern edge router (Cisco IOS-XE, Juniper, Arista). BFD support for fast failover; MACsec-capable ports for L2 encryption.
Single-mode fiber + the right opticOne transceiver per speed tier (see Phase 4). Wrong wavelength or reach and the link stays dark.
An ASNA public ASN you own, or a private one (64512–65534, or 4-byte 4200000000–4294967294). It must differ from the AWS-side ASN.
A peering-IP planA /30 or /31 per VIF (RFC 3021 31-bit is supported), or let AWS assign a /29 from 169.254.0.0/16.
Public prefixes (public VIF only)Ranges you own and that are registered to you in the regional registry — AWS verifies ownership.
An AWS accountTo place the order and create VIFs.

The phases below run in bring-up order, and each one names who does the work — because the split between your team, the colo, and the AWS console is exactly where hand-offs drop.

Phase 1 — Dedicated or hosted: the choice that sets everything

This is the one decision that reshapes the whole build, so make it first. A dedicated connection is a physical port that's yours alone. You order it from AWS at 1, 10, 100, or 400 Gbps and you supply the router, the optics, and the cross-connect into the Direct Connect location. You get the full physical build — and the full VIF budget: up to 50 private/public VIFs plus 4 transit VIFs on one port. Provisioning realistically takes weeks, most of it circuit and cross-connect lead time, not AWS.

A hosted connection is capacity a partner carves off their own port for you. The Direct Connect Partner has already done the physical work — their gear, their cross-connect — so you contact them, they provision it, and it appears in your console to accept. Hosted speeds run 50 Mbps–25 Gbps (sub-1G is hosted-only). The trade: a hosted connection carries exactly one VIF, and AWS traffic-polices it, so bursts above your rate get dropped.

DEDICATED — you own the physical chainHOSTED — the partner owns the physical chainYour edge routerSMF + opticsYour cross-connectyou order itAWS DX port1 / 10 / 100 / 400 Gbps · up to 50 private/public + 4 transit VIFs · MACsec + LAG · lead time: weeksYour edge routerpeering onlyPartner port + backbonepartner cabled itAWS DX port50 Mbps – 25 Gbps · exactly 1 policed VIF · no colo presence needed · lead time: hours–daysSame peering on both; the difference is who runs the physical build and how many VIFs you get.
fig-02 · Dedicated means you own the whole physical chain and the multi-VIF budget; hosted means the partner cabled it and you peer over one policed VIF.
DedicatedHosted
Speeds1 / 10 / 100 / 400 Gbps50 Mbps – 25 Gbps
Who runs the physical / cross-connectYou (with the colo)The partner
Presence in the DX locationRequired (or a provider who has it)Not required
VIFs per connection50 private/public + 4 transit1 (policed)
Lead timeWeeksHours–days
How you get itOrder in the consolePartner provisions; you accept

The honest read: if you don't already have gear in a Direct Connect location, a hosted connection is faster and lets you skip most of Phases 2–4 — at the cost of the multi-VIF budget and some burst headroom. If you need 100 Gbps, many VIFs, MACsec, or a LAG, you're on dedicated and you're doing the physical build. The rest of this guide assumes dedicated, since that's where the on-prem work lives; hosted users can jump to Phase 5.

Phases 2–3 — Order the port, pull the LOA-CFA, run the cross-connect

Goal: a provisioned AWS port, the one document that unlocks the physical build, and a lit fiber path from your panel to AWS's.

In the console you request a dedicated connection: pick the Direct Connect location, the port speed, and whether you're reaching it through a partner. AWS reviews the request — up to 72 business hours — and may email for detail (you have 7 days to respond or it's deleted). You can't change the speed later; to change it you delete and recreate. What you're waiting for is the LOA-CFA, the Letter of Authorization and Connecting Facility Assignment: a signed, watermarked PDF naming the AWS patch panel and port assignment that authorizes the facility to run a cross-connect to it. That single artifact turns an AWS order into a physical build.

The cross-connect itself is a fiber patch inside the facility's meet-me room (MMR), joining your patch panel to AWS's. You hand the LOA-CFA to the colo (or your partner) and they run it — AWS keeps physical separation between its cage and yours through the MMR's structured cabling. If you have no equipment in the location, you cannot order this yourself; that's the whole reason presence-or-partner is a prerequisite.

Virtual interfaces — 802.1Q VLAN + BGP per VIFOn-prem edge routerSMF + optics · 802.1Q · BGP2nd router / 2nd DX location(resiliency)Cross-connectMMR patch · LOA-CFAMACsec · L2 encryptAWS Direct Connectport / devicePrivate VIFVLAN · peer IP · ASN · MD5Public VIFAWS ASN 7224 · 1000 routesTransit VIF100-route limit · MTU 8500IPsec VPN over public VIFend-to-end / hosted / sub-1GVGW / DX GatewayVPCAWS public service prefixesS3 · DynamoDB · …DX GatewayTransit Gateway→ VPCsYOUR SIDEDX LOCATIONAWS EDGEAWS TARGETSPhases 2–3: AWS-side order + colo cross-connect. No VIFs or routing yet — you are waiting for light.
fig-03 · Ordering and the cross-connect. AWS-side and colo work only — the VIFs and routing come later, once there's light.

Order the dedicated port in the AWS console.   AWS issues the LOA-CFA — the authorization to patch.   The colo runs the cross-connect in the meet-me room.   Light appears on your interface.

The 90-day clock starts at the LOA-CFA. Billing begins when the port goes active or 90 days after the LOA-CFA is issued, whichever comes first. If the port isn't up at 90 days, AWS emails a 10-day deletion warning; miss that and the port is deleted and you restart. Don't pull the LOA until your cross-connect and router work is actually scheduled. (AWS Direct Connect User Guide, dedicated connections — version-sensitive.)

Validation: you should see light on the interface once the patch is complete. Ask the colo for an optical signal report and check the receive level is in spec. One practitioner troubleshooting write-up cites roughly −14.4 to +2.50 dBm for 1–10 Gbps and −4.3 to +4.5 dBm for 100 Gbps (awsforengineers.com — practitioner figures; treat as a sanity range and confirm against your optic's datasheet and your colo). No light means the patch isn't done, the strands are swapped (Tx/Rx), or the optic is wrong — the next phase. Rollback: nothing to undo on your router yet; if the location or speed was wrong, delete the AWS connection within the 90-day window and re-order.

Phase 4 — Cable and light the router: fiber, optics, port settings

Goal: a clean Layer-1/Layer-2 link — interface up, 802.1Q trunking, no auto-negotiation surprises. The optic has to match the speed tier exactly. Direct Connect is single-mode fiber only, with a specific transceiver per speed; get the wavelength or reach wrong and the link stays dark.

Port speedRequired opticFiber
1 Gbps1000BASE-LX (1310 nm)Single-mode
10 Gbps10GBASE-LR (1310 nm)Single-mode
100 Gbps100GBASE-LR4Single-mode
400 Gbps400GBASE-LR4Single-mode

(AWS User Guide — network requirements; version-sensitive, verify the current table.)

Virtual interfaces — 802.1Q VLAN + BGP per VIFOn-prem edge routerSMF + optics · 802.1Q · BGP2nd router / 2nd DX location(resiliency)Cross-connectMMR patch · LOA-CFAMACsec · L2 encryptAWS Direct Connectport / devicePrivate VIFVLAN · peer IP · ASN · MD5Public VIFAWS ASN 7224 · 1000 routesTransit VIF100-route limit · MTU 8500IPsec VPN over public VIFend-to-end / hosted / sub-1GVGW / DX GatewayVPCAWS public service prefixesS3 · DynamoDB · …DX GatewayTransit Gateway→ VPCsYOUR SIDEDX LOCATIONAWS EDGEAWS TARGETSPhase 4: Layer 1/2 up — single-mode fiber, the tier optic, and an end-to-end 802.1Q trunk. VIFs still greyed.
fig-04 · The physical link, lit. Single-mode fiber, the right optic, and an end-to-end 802.1Q trunk — the logical layer comes next.

Two more physical requirements from the same doc. First, 802.1Q VLAN encapsulation must work across the entire path, including any intermediate switch — Direct Connect delivers your VIFs as tagged VLANs on a trunk, so a device that strips tags kills it. Second, auto-negotiation is endpoint-dependent: AWS says it "might need to be enabled or disabled" depending on the DX endpoint, and the practical rule practitioners land on is that above 1 Gbps you disable auto-negotiation and hard-set speed and full-duplex on both the port and any transport in between.

Cisco IOS-XE — physical port (10G dedicated)
interface TenGigE0/0/0
 description AWS-Direct-Connect-dxcon-xxxx
 no negotiation auto          ! hard-set above 1G; do not auto-negotiate
 mtu 9100                     ! headroom for jumbo VIFs + VLAN tag + FCS
 no shutdown
!
! 802.1Q comes from the per-VIF subinterfaces in Phase 5 —
! this physical interface is the dot1q trunk that carries them.
Juniper Junos — physical port (10G dedicated)
set interfaces xe-0/0/0 description "AWS-Direct-Connect-dxcon-xxxx"
set interfaces xe-0/0/0 gigether-options no-auto-negotiation
set interfaces xe-0/0/0 mtu 9192
set interfaces xe-0/0/0 flexible-vlan-tagging
set interfaces xe-0/0/0 encapsulation flexible-ethernet-services

Two silent killers at Layer 1/2: the wrong optic (a 10GBASE-LR where a 1000BASE-LX belongs, or multimode instead of single-mode) leaves the link dark, and auto-negotiation left on above 1 Gbps gives you light but no line protocol. Check show interfaces ... transceiver for the right optic and a receive level in spec. (dBm ranges are practitioner figures — verify with your colo.)

Validation: interface line protocol up, the correct optic reported, receive light in spec. Rollback: shut the interface — nothing downstream exists yet.

The link is up: fiber, optics, and VLAN trunking in place. Everything from here is logical — the VIFs, the BGP routing you shape, and making it survive a failure. If you just need the working mental model — order → LOA → cross-connect → optics → VLAN + BGP per VIF — you have it. The rest is for the people who operate it, keep it up, and pass an audit.

Phase 5 — Stand up each VIF: VLAN, peer IP, ASN, MD5

Goal: an established eBGP session per virtual interface. A VIF is one VLAN carrying one eBGP session. You create it in the console (or the partner does, for hosted) and AWS hands back the parameters; your job is to mirror them exactly on a dot1q subinterface. Three VIF types, and which you build depends on what you're reaching:

VIF typeReachesAWS-side attach point
PrivateA VPC over private IPsVirtual private gateway, or a Direct Connect gateway → many VPCs/Regions
TransitOne or more Transit Gateways (or Cloud WAN)Direct Connect gateway → Transit Gateway
PublicAll AWS public service prefixes (S3, public EC2, API endpoints)AWS public network; AWS-side ASN is 7224
Virtual interfaces — 802.1Q VLAN + BGP per VIFVLAN + MD5peer 7224MTU 8500On-prem edge routerSMF + optics · 802.1Q · BGP2nd router / 2nd DX location(resiliency)Cross-connectMMR patch · LOA-CFAMACsec · L2 encryptAWS Direct Connectport / devicePrivate VIFVLAN · peer IP · ASN · MD5Public VIFAWS ASN 7224 · 1000 routesTransit VIF100-route limit · MTU 8500IPsec VPN over public VIFend-to-end / hosted / sub-1GVGW / DX GatewayVPCAWS public service prefixesS3 · DynamoDB · …DX GatewayTransit Gateway→ VPCsYOUR SIDEDX LOCATIONAWS EDGEAWS TARGETSPhase 5: each VIF is a VLAN + BGP session — peer IP, your ASN, matching MD5 — landing on its aligned AWS target.
fig-05 · The three VIFs stood up. Each is a VLAN + BGP session — peer IP, your ASN, and a matching MD5 key — landing on its aligned AWS target.

The per-VIF parameters you configure on-prem:

ParameterValue / rule
VLAN ID (802.1Q)1–4094, unique on the connection, immutable after create. Hosted: the partner supplies it.
Peer IPsA /30 or /31 pair (31-bit supported, RFC 3021). Your RFC 1918 addresses, or an AWS-assigned /29 from 169.254.0.0/16. Point-to-point, for eBGP peering only.
Your ASN1–4294967294. Private: 64512–65534 or 4-byte 4200000000–4294967294. Must differ from the AWS-side ASN.
AWS-side ASNPublic VIF: always 7224. Private/transit: the VGW or DX-gateway ASN you set when you created the gateway.
BGP MD5 keyYou provide it or AWS generates it; it's in the downloadable router-config file. MD5 is on by default and can't be turned off. Must match to the character.
One ASN, or one per Region? A single site's redundant links — two DX connections for the 99.99% SLA — share one ASN; it is one autonomous system, and splitting it would be wrong. But across multiple Regions or data centers, the common (and usually better) choice is a distinct private ASN per Region or site. The driver is BGP AS-path loop prevention: the moment AWS carries traffic between your sites — Transit Gateway peering, or Cloud WAN — two sites sharing an ASN will reject each other's routes, because a router drops any path that already contains its own ASN, so on-prem-to-on-prem transit silently breaks. Distinct ASNs also make path selection and “which site advertised this?” troubleshooting cleaner. With 4-byte private ASNs (4200000000–4294967294) there is no scarcity: reserve your one public registered ASN for internet peering, and hand out a private ASN per Region or edge. It is the same loop-prevention reason AWS gives every Cloud WAN core network edge its own ASN — a transit backbone needs its nodes to be distinct autonomous systems.

Here's a private VIF on both a Cisco and a Juniper edge — the heart of the on-prem config: a subinterface, the peer, the ASN, the key.

Cisco IOS-XE — private VIF (VLAN 100)
interface TenGigE0/0/0.100
 description AWS-PRIVATE-VIF
 encapsulation dot1Q 100
 ip address 169.254.100.2 255.255.255.252   ! AWS side = .1
!
router bgp 65001
 neighbor 169.254.100.1 remote-as 64512      ! AWS VGW/DXGW ASN
 neighbor 169.254.100.1 password 7hisMustMatchExactly
 address-family ipv4
  neighbor 169.254.100.1 activate
  network 10.20.0.0 mask 255.255.0.0         ! advertise your on-prem prefix
 exit-address-family
Juniper Junos — same private VIF
set interfaces xe-0/0/0 unit 100 vlan-id 100
set interfaces xe-0/0/0 unit 100 family inet address 169.254.100.2/30
set protocols bgp group AWS-DX type external
set protocols bgp group AWS-DX peer-as 64512
set protocols bgp group AWS-DX neighbor 169.254.100.1 authentication-key "7hisMustMatchExactly"
set policy-options policy-statement ADV-ONPREM term 1 from route-filter 10.20.0.0/16 exact
set policy-options policy-statement ADV-ONPREM term 1 then accept
set protocols bgp group AWS-DX export ADV-ONPREM

A public VIF differs in three ways: the AWS peer ASN is 7224, you peer over public IPs you own (not link-local/private), and you must advertise at least one public prefix you're registered for. Everything else — VLAN, MD5, dot1q — is the same shape.

The mismatch trio. If the session won't reach Established, the usual suspects are all on-prem: a VLAN mismatch (ARP won't even resolve), an ASN typo, or an MD5 key that's off by a single character. AWS's own troubleshooting confirms any one of those — or a filtered TCP/179 — is enough to hang the session. Rollback: remove the subinterface and the neighbor; the VIF sits idle on the AWS side with no charge beyond the port.

Phase 6 — Shape the routing: prefixes, limits, communities, MTU

Goal: your prefixes advertised, AWS's return path where you want it, and no self-inflicted session drops.

The prefix limit is the trap. A private or transit VIF accepts 100 routes each for IPv4 and IPv6 from you. Advertise more and the BGP session doesn't just ignore the extras — it goes to idle and the whole VIF stops passing traffic until you get back under the limit. A public VIF allows 1,000 routes (this one can't be raised). Summarize before you advertise; don't leak a full internal table. (AWS Direct Connect quotas — version-sensitive; re-check the current numbers.)

Return-path control uses BGP communities and prefix specificity. AWS won't honor arbitrary knobs, but it publishes a specific set. On private/transit VIFs, tag your advertised prefixes with a local-preference community7224:7100 (low), 7224:7200 (medium), or 7224:7300 (high) — to steer AWS→on-prem return traffic; these are evaluated before AS_PATH. On public VIFs, use a scope community7224:9100 (local Region), 7224:9200 (continent), or 7224:9300/untagged (global) — to control how far AWS propagates your prefixes. Longest-prefix and AS_PATH still work normally.

Cisco IOS-XE — local-pref community on a private/transit VIF (primary = high)
router bgp 65001
 address-family ipv4
  neighbor 169.254.100.1 send-community
  neighbor 169.254.100.1 route-map SET-LP-HIGH out
 exit-address-family
!
ip prefix-list ONPREM seq 5 permit 10.20.0.0/16
route-map SET-LP-HIGH permit 10
 match ip address prefix-list ONPREM
 set community 7224:7300           ! high local-pref: AWS prefers this VIF for return
! backup VIF: same shape, set community 7224:7100 (low)
Cisco IOS-XE — scope community on a public VIF
route-map PUBLIC-SCOPE permit 10
 match ip address prefix-list MY-PUBLIC
 set community 7224:9200            ! continent scope (7224:9100 = Region, 9300 = global)
!
router bgp 65001
 address-family ipv4
  neighbor  send-community
  neighbor  route-map PUBLIC-SCOPE out
 exit-address-family

Private-ASN prepending on a public VIF does nothing outward. If you use a private ASN on a public VIF, AWS replaces it with 7224 when re-advertising — so any AS-path prepend is stripped and has no effect on external route selection. Use a public ASN if you need prepending to be visible. (AWS routing-and-bgp docs.)

MTU is part of routing hygiene. A private VIF supports 1500 or 9001; a transit VIF supports 1500 or 8500 (Transit Gateway caps jumbo at 8500). Both ends must agree — if two VIFs advertise the same route with different MTUs, AWS falls back to 1500. Set your subinterface MTU to match the VIF, and remember that flipping a VIF to jumbo can bounce the underlying physical link for up to ~30 seconds, affecting every VIF on it. (AWS User Guide — version-sensitive.) Validation: route counts under the limit (show bgp summary), your prefixes visible from AWS, and a jumbo-frame ping with the DF bit set succeeding end-to-end if you enabled it.

Phase 7 — Make it resilient, and encrypt it

Goal: survive a device, fiber, or location failure — and protect the traffic on the wire. AWS's Resiliency Toolkit is a console wizard, but what it's really choosing is how many connections you build and where. The models map to SLAs:

ModelWhat you buildProtects againstSLA
Maximum resiliencySeparate connections on separate devices in more than one locationDevice, link, and full-location failure99.99%
High resiliencyTwo single connections in two separate locationsFiber cut or device failure; helps with location loss99.9%
Development & testSeparate connections on separate devices in one locationDevice failure only

The wizard enforces the useful part — it won't let you terminate both connections on the same AWS DX device, which is the failure mode people accidentally build. To bundle multiple ports at one location into one logical link, use a LAG (Link Aggregation Group): same speed on every member, up to 4 members below 100 Gbps and 2 at 100 Gbps. A LAG gives you more bandwidth and member-level redundancy, but it's still one location — not a substitute for a second site.

Virtual interfaces — 802.1Q VLAN + BGP per VIFLAGBFDOn-prem edge routerSMF + optics · 802.1Q · BGP2nd router / 2nd DX location(resiliency)Cross-connectMMR patch · LOA-CFAMACsec · L2 encryptAWS Direct Connectport / devicePrivate VIFVLAN · peer IP · ASN · MD5Public VIFAWS ASN 7224 · 1000 routesTransit VIF100-route limit · MTU 8500IPsec VPN over public VIFend-to-end / hosted / sub-1GVGW / DX GatewayVPCAWS public service prefixesS3 · DynamoDB · …DX GatewayTransit Gateway→ VPCsYOUR SIDEDX LOCATIONAWS EDGEAWS TARGETSPhase 7: 2nd device / 2nd location (LAG) for 99.99%, BFD for sub-second failover, MACsec or IPsec to encrypt.
fig-06 · Resilient and encrypted. A second device in a second location, BFD for sub-second failover, and MACsec or an IPsec VPN — all of it on-prem work.

A second device in a second location is what buys the 99.99% SLA.   A LAG bundles ports at one location — more bandwidth, not a second site.   BFD on your router is the fast-failover trigger.   MACsec encrypts the cross-connect; IPsec over a public VIF encrypts end-to-end.

BFD: the piece you have to enable yourself

Redundant links are useless if failover is slow. Asynchronous BFD is automatically enabled on the AWS side for every VIF — but it does nothing until you configure it on your router. AWS uses a minimum interval of 300 ms and a multiplier of 3, so a dead link is detected in roughly 900 ms instead of waiting out BGP's default hold timer. (AWS re:Post, enable BFD for Direct Connect — timers version-sensitive.)

Cisco IOS-XE — BFD on the DX subinterface + BGP
interface TenGigE0/0/0.100
 bfd interval 300 min_rx 300 multiplier 3
!
router bgp 65001
 neighbor 169.254.100.1 fall-over bfd
Juniper Junos — BFD under the BGP group
set protocols bgp group AWS-DX bfd-liveness-detection minimum-interval 300
set protocols bgp group AWS-DX bfd-liveness-detection multiplier 3

Then actually test it. The Toolkit has a failover test that brings the BGP peering down on AWS's side so you can watch traffic move to the standby VIF. Run it before you depend on the redundancy — an untested failover path is a guess.

Encryption: MACsec on the port, or IPsec over a public VIF

Direct Connect is private, but it is not encrypted by default. Two options, both needing on-prem work:

  • MACsec — IEEE 802.1AE Layer-2 encryption over the cross-connect, between your router and the AWS DX device. Available on dedicated 10/100/400 Gbps connections at selected locations (not hosted), and your edge port must support it. You generate a CKN/CAK pair (hex, 64 characters, AES-256), associate it with the connection, and provision the same pair on your router. SCI must be on; 100/400 Gbps require Extended Packet Numbering (GCM-AES-XPN-256). Default mode is should_encrypt (falls back to clear if negotiation fails); must_encrypt is stricter but drops all traffic if MACsec can't establish. (AWS MACsec docs — availability/cipher details version-sensitive.)
  • IPsec VPN over a public VIF — the portable option, and the only one for hosted or sub-1G. You bring up a public VIF, then run an AWS Site-to-Site VPN (or a self-managed tunnel) to an AWS VPN endpoint's public IP over that VIF. It's true end-to-end encryption terminating on your customer gateway, at the cost of tunnel MTU/throughput overhead. MACsec, by contrast, only protects the point-to-point cross-connect, not multiple segments end-to-end.

Phase 8 — Validate the whole chain, and test failover

Work Layer 1 up, because a failure at a lower layer masks everything above it. Interface and optic first, then the tag, then BGP, then reachability, then the failover you can't assume works until you've watched it.

Cisco IOS-XE — bring-up checks, L1 to BGP
show interfaces TenGigE0/0/0 transceiver detail   ! optic present, Rx light in spec
show interfaces TenGigE0/0/0.100                   ! subinterface up/up, dot1q 100
show bgp ipv4 unicast summary                      ! neighbor state = Established
show bgp ipv4 unicast neighbors 169.254.100.1 advertised-routes
show bgp ipv4 unicast neighbors 169.254.100.1 routes   ! received count under 100
show bfd neighbors
Juniper Junos — equivalents
show interfaces diagnostics optics xe-0/0/0        ! Rx power in spec
show bgp neighbor 169.254.100.1                    ! state Established, prefix counts
show route receive-protocol bgp 169.254.100.1
show route advertising-protocol bgp 169.254.100.1
show bfd session
  1. L1: interface up, correct optic, receive light in spec (optical report from the colo).
  2. L2: 802.1Q tag correct, ARP resolves to the AWS peer's MAC on the right VLAN.
  3. L3/BGP: session Established, expected routes in and out, received count under the limit.
  4. Reachability: traceroute shows the Direct Connect hop; a test EC2 instance in the attached VPC answers a ping (security group allowing ICMP).
  5. Resiliency: run the Toolkit failover test and confirm traffic moves to the standby VIF and back.

Where bring-up dies — the on-prem gotchas

Every one of these lives on your side of the cross-connect. They're roughly in bring-up order, which is also the order they'll bite you.

SymptomCauseFix
Port deleted before you cut overLOA-CFA pulled too early; 90-day clock ran outOnly pull the LOA once the cross-connect is scheduled
Console shows the connection but no lightCross-connect never completed in the MMRVerify against the LOA-CFA; chase the colo
No light / dark linkTx-Rx strands swapped, or wrong optic (multimode, wrong tier)Get an optical report; confirm single-mode + the tier's optic
Light present, interface never upAuto-negotiation left on above 1 GbpsDisable auto-neg; hard-set speed and full-duplex
ARP to the AWS peer never resolvesVLAN mismatch, or 802.1Q stripped by an intermediate deviceMatch the tag; trunk it on every device in the path
BGP hangs short of EstablishedASN or MD5 mismatch, wrong peer IP, or TCP/179 filteredOne stray MD5 character is enough — check all four, open TCP/179
Whole VIF goes darkPrefix limit exceeded (>100 on private/transit) → session idleSummarize; get back under 100 routes
Small packets pass, large ones black-holeMTU mismatch (9001/8500 vs 1500)Match the subinterface MTU to the VIF on both ends
Return flow dropped by a stateful firewallAsymmetric routing across two connectionsUse local-pref communities to make the return path deterministic
Failover doesn't fail overBFD not enabled on your router; path never exercisedEnable BFD; run the Toolkit failover test
If you have no presence in a Direct Connect location and don't need 100 Gbps or many VIFs, take a hosted connection and go straight to Phase 5. If you need scale, Layer-2 encryption, or a LAG, order a dedicated port and own the physical chain: order → LOA-CFA → cross-connect → optics → VLAN + BGP per VIF → routing policy → a second location with BFD → MACsec or an IPsec VPN. AWS owns one end and makes it look easy; the work — and every bring-up failure worth naming — is on your side of the patch panel.

References

  1. AWS Direct Connect User Guide — What is Direct Connect? (network requirements, VIF types): https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html
  2. AWS Direct Connect User Guide — Dedicated and hosted connections: https://docs.aws.amazon.com/directconnect/latest/UserGuide/WorkingWithConnections.html
  3. AWS Direct Connect User Guide — Dedicated connections (LOA-CFA, 90-day rule, port speeds): https://docs.aws.amazon.com/directconnect/latest/UserGuide/dedicated_connection.html
  4. AWS Direct Connect User Guide — Hosted connections (speeds, policing): https://docs.aws.amazon.com/directconnect/latest/UserGuide/hosted_connection.html
  5. AWS Direct Connect User Guide — Virtual interfaces (VLAN, peer IP, ASN, MD5, MTU): https://docs.aws.amazon.com/directconnect/latest/UserGuide/WorkingWithVirtualInterfaces.html
  6. AWS Direct Connect User Guide — Routing policies and BGP communities (7224:xxxx, local pref, scope): https://docs.aws.amazon.com/directconnect/latest/UserGuide/routing-and-bgp.html
  7. AWS Direct Connect User Guide — Quotas (prefix limits, LAG members, VIF counts): https://docs.aws.amazon.com/directconnect/latest/UserGuide/limits.html
  8. AWS Direct Connect User Guide — Resiliency Toolkit (Max/High/Dev-test, SLAs): https://docs.aws.amazon.com/directconnect/latest/UserGuide/resilency_toolkit.html
  9. AWS Direct Connect User Guide — High resiliency walkthrough (VIF params, RFC 1918/3927): https://docs.aws.amazon.com/directconnect/latest/UserGuide/high_resiliency.html
  10. AWS Direct Connect User Guide — MACsec (CKN/CAK, AES-256, XPN, SCI, modes): https://docs.aws.amazon.com/directconnect/latest/UserGuide/MACsec.html
  11. AWS Networking Blog — Direct Connect Layer 1 explained (MMR, cross-connect, optics): https://aws.amazon.com/blogs/networking-and-content-delivery/aws-direct-connect-layer-1-explained-from-data-centers-to-cloud-connectivity/
  12. AWS re:Post — Enable BFD for a Direct Connect connection (300 ms × 3, Cisco/Juniper): https://repost.aws/knowledge-center/enable-bfd-direct-connect
  13. AWS re:Post — Troubleshoot BGP issues over Direct Connect: https://repost.aws/knowledge-center/troubleshoot-bgp-dx
  14. AWS Well-Architected Hybrid Networking Lens — Direct Connect and IPsec VPN: https://docs.aws.amazon.com/wellarchitected/latest/hybrid-networking-lens/aws-direct-connect-and-ipsec-vpn.html
  15. awsforengineers.com — Troubleshooting AWS Direct Connect step-by-step (light levels, bring-up failures): https://awsforengineers.com/blog/troubleshooting-aws-direct-connect-step-by-step/
  16. Orixcom — Direct Connect Dedicated vs Hosted comparison: https://blog.orixcom.com/aws-direct-connect-dedicated-vs-hosted-detailed-comparison