Lab 45 — Rede híbrida: VPN, Direct Connect e Transit Gateway
O problema, e a empresa que o tem
A Estrela Atacadista vende para pequenos mercados em doze cidades. No balcão de cada loja, o vendedor confirma a venda depois de o sistema mostrar o saldo do item — e esse sistema é o mesmo ERP que a empresa usa desde antes de existir nuvem: roda num servidor físico no escritório central, e não vai migrar tão cedo. O motivo não é técnico: é o contrato de licenciamento do ERP e o custo de reescrever a integração fiscal que ele já tem.
O estoque, por outro lado, já mudou de casa. O L44 colocou o serviço de saldo numa VPC, com banco Aurora e sem tráfego saindo pela internet para alcançar os serviços internos da AWS. O problema que sobrou é anterior a tudo isso: como o ERP, que está fora da AWS, enxerga essa VPC.
Hoje não enxerga. O saldo é sincronizado uma vez por hora, por um script que exporta um arquivo e o sobe manualmente — e o vendedor confia num número que pode ter até sessenta minutos de atraso. Duas vezes por mês isso gera uma venda que não deveria ter acontecido, e o custo não é técnico: é reputação com o cliente da loja.
O que este laboratório NÃO é
Não é sobre configurar o roteador on-premises. BGP tem dois lados, e este laboratório cobre inteiramente o lado da AWS — Customer Gateway como recurso, Transit Gateway, Direct Connect Gateway. A configuração do equipamento físico da Estrela Atacadista (Cisco, MikroTik, ou o que for) é do fabricante do roteador, não da AWS, e fica fora do escopo.
O que você vai conseguir fazer
Objetivos verificáveis: cada um se prova com um comando na seção de implantação, não com a sensação de ter entendido rede híbrida.
- Explicar por que os dois túneis de uma VPN Site-to-Site não são redundância real quando nascem do mesmo roteador on-premises.
- Escolher entre VPN e Direct Connect a partir do trade-off real de custo, latência, banda e tempo de provisionamento — não por preferência.
- Justificar quando um Transit Gateway se paga mesmo com uma única VPC hoje.
- Configurar VPN e Direct Connect apontando para o mesmo hub, com BGP nos dois lados.
- Fazer a VPN ceder a preferência ao Direct Connect via AS_PATH, sem depender de um botão de prioridade que não existe no serviço.
- Provar, com medição, que o failover troca de caminho quando o circuito primário cai.
- Diagnosticar CIDR sobreposto como causa de tráfego que "some" sem erro nenhum.
- Nomear o que o `terraform destroy` não cobre neste laboratório, e por quê.
O que a certificação cobra disto
| Conceito | Certificação | Como aparece aqui | O que dominar |
|---|---|---|---|
| VPN vs. Direct Connect | SAP-C02, ANS-C01 | a decisão de qual meio de transporte usar, e por que a combinação dos dois é o padrão | trade-off de custo, latência, banda e prazo de provisionamento — não "qual é melhor" |
| Topologia hub-and-spoke com Transit Gateway | SAP-C02, ANS-C01 | um hub para VPN, Direct Connect e múltiplas VPCs | por que evita o problema N×M de conexão ponto a ponto |
| Roteamento estático vs. BGP | SAP-C02, ANS-C01 | VPN aceita os dois; Direct Connect exige BGP | a diferença de manutenção entre editar rota à mão e deixar o protocolo anunciar |
| Redundância de link vs. redundância de túnel | SAP-C02 | os dois túneis da VPN nascendo do mesmo Customer Gateway | por que "dois túneis" não é sinônimo de "dois caminhos independentes" |
| Preferência de caminho por BGP | SAP-C02, ANS-C01 | AS_PATH prepending fazendo a VPN ceder ao Direct Connect | que é técnica padrão de BGP, configurada no roteador on-premises, não um parâmetro da AWS |
| Direct Connect Gateway multi-conta e multi-região | SAP-C02 | associação do DX Gateway ao Transit Gateway via interface virtual de trânsito | a diferença entre interface privada (uma VPC) e de trânsito (um ou mais Transit Gateways) |
| Cifragem em trânsito sobre Direct Connect | SAP-C02, SCS-C02 | Direct Connect não cifra por padrão | que "não é internet pública" não significa "está cifrado" — MACsec ou VPN sobre DX resolvem |
| CIDR sobreposto entre VPC e rede on-premises | SAA-C03, SAP-C02 | a checagem que a Prova 5 faz antes de qualquer outra | que o roteamento prefere silenciosamente o destino mais específico, sem gerar erro |
Onde isto costuma ser cobrado errado
A pergunta clássica descreve uma VPN Site-to-Site "com os dois túneis ativos" e pergunta se a solução está redundante. A resposta depende de uma informação que a pergunta costuma omitir de propósito: os dois túneis terminam no mesmo Customer Gateway? Se sim, não há redundância de link — há redundância de sessão IPsec sobre o mesmo link, que é outra coisa.
Requisitos, e como cada um muda o desenho
Requisito não funcional que não aparece numa linha de configuração é intenção. A coluna da direita é onde cada um deixou marca no Terraform ou na topologia.
| Requisito | Valor declarado | O que ele decide no desenho |
|---|---|---|
| Latência perceptível da consulta de saldo | abaixo de 150 ms no p99 | exclui VPN-somente como solução permanente: sem SLA de latência, o pico de tráfego público pode superar o orçamento em qualquer minuto, imprevisivelmente |
| Continuidade sem equipe de plantão | failover automático, sem intervenção humana | obriga BGP nos dois caminhos — roteamento estático exigiria alguém editando rota à mão às 3 da manhã |
| Segundo caminho físico independente | obrigatório, não dois túneis do mesmo link | justifica manter a VPN mesmo depois de o Direct Connect existir, em vez de substituí-la |
| Expansão prevista para uma segunda VPC | em até 6 meses | traz o Transit Gateway para o primeiro laboratório de rede híbrida, antes de a segunda VPC existir de fato — o custo de adiar é refazer os dois caminhos híbridos depois |
| Orçamento sem circuito duplicado | um Direct Connect, não dois | define a VPN como contingência de um único circuito, não como caminho de carga compartilhada — a decisão registrada na seção seguinte |
| CIDR do datacenter documentado | 192.168.100.0/24, sem sobreposição com a VPC | é pré-condição, não detalhe: sem ela verificada, nenhuma outra peça deste desenho funciona de forma previsível |
| Auditoria de qual caminho carregou o tráfego | exigida por conformidade fiscal | obriga o alarme e a consulta à tabela de rotas do Transit Gateway como parte do desenho, não como extra de observabilidade |
Arquitetura mínima: uma VPN, um roteador, um ponto de falha
Este é o desenho que resolve o problema declarado em horas, não em semanas: o ERP passa a consultar o saldo real, sem esperar a sincronização por arquivo. É genuinamente implantável, e o laboratório começa por ele porque o defeito que ele carrega só fica visível depois de medido — "funciona" e "está redundante" não são a mesma afirmação.
- → consulta de saldo antes de confirmar o pedido
- → dois túneis IPsec, mesmo roteador de origem
- → propaga a rota (estática ou BGP) para a sub-rede
- → encaminha para o serviço de estoque
- → consulta síncrona de saldo por SKU
- Fora da AWS
- Rede e entrega
- Compute
- Banco de dados
Este desenho conecta de verdade, e prova o ponto em minutos de provisionamento. O defeito não é a VPN — a AWS já entrega dois túneis nela. O defeito é que os dois nascem do mesmo roteador on-premises: derrube esse roteador, ou o link de internet dele, e os dois túneis caem juntos. Percorra os passos e repare onde a redundância promete mais do que a topologia entrega.
- A resposta tem de voltar pelo mesmo caminho frágil. O pedido nasce fora da AWS e a pergunta é síncrona: o balconista espera o saldo na tela antes de fechar a venda. Isso é o que torna a variabilidade do caminho um problema de produto, não só de infraestrutura.
- Dois túneis, uma única origem. A AWS entrega duas conexões IPsec por padrão em toda VPN Site-to-Site, pensadas para alta disponibilidade — mas as duas terminam no mesmo dispositivo físico e no mesmo link de internet do datacenter. Redundância do lado da AWS não compensa ausência de redundância do lado de quem você não controla.
- Rota é o que liga o túnel a um destino. Túnel UP não move pacote sozinho. Sem uma entrada na tabela de rotas apontando para o Virtual Private Gateway — estática, ou aprendida via BGP — a sub-rede privada continua inalcançável, e o sintoma parece "a VPN não funciona" quando na verdade a VPN funciona e a rota é que falta.
- A internet pública não tem SLA de latência. O tráfego atravessa provedores que ninguém aqui contratou. Na maior parte do tempo isso não se nota; no horário de pico de vendas, a variação de latência é exatamente o que o balconista sente como "o sistema está lento hoje".
- O banco já resolveu o problema anterior. O endpoint de VPC para o Aurora, construído no L44, continua valendo aqui: a consulta de saldo não sai para a internet nem paga NAT. Este laboratório resolve quem CHEGA à VPC, não o que acontece depois de chegar.
- Por que essa topologia ainda é a mais comum no dia 1. Provisiona em minutos, não pede circuito físico, e resolve o problema declarado: o ERP passa a enxergar o estoque. O defeito só aparece no dia em que o roteador cai — e até lá, "funciona" é um argumento difícil de vencer.
O ponto único de falha não é o túnel — é o roteador
A AWS entrega dois túneis IPsec em toda VPN Site-to-Site, pensados para você não precisar de nada além disso. O problema é que, nesta topologia, os dois terminam no mesmo Customer Gateway e no mesmo link de internet do datacenter. Uma queda de energia no rack do roteador, ou uma instabilidade do provedor de internet da Estrela Atacadista, derruba os dois túneis ao mesmo tempo — e não existe caminho alternativo para o qual falhar. O RTO dessa combinação não é um número: é indefinido, porque depende de alguém notar, ir até o datacenter e resolver o que quer que tenha quebrado fisicamente.
Arquitetura para produção
Cada peça nova abaixo rastreia a uma linha da tabela de requisitos. A topologia muda de verdade — não é o desenho anterior com uma caixa a mais: o roteamento passa a existir por BGP, o ponto de conexão com a AWS deixa de ser um VGW por VPC e passa a ser um hub, e um segundo meio de transporte físico entra em cena.
- → consulta de saldo antes de confirmar o pedido
- → sessão BGP sobre VIF privada — caminho primário
- → túnel IPsec com AS_PATH propositalmente mais longo
- → circuito dedicado até o Direct Connect Gateway
- → anexo de VPN ao Transit Gateway, também por BGP
- → associação do Direct Connect Gateway ao Transit Gateway
- → decide qual caminho vale pela rota aprendida
- → encaminha para a VPC de pedidos
- → mesmo hub, sem nova configuração ponta a ponta
- → consulta síncrona de saldo por SKU
- → muda de estado quando o caminho primário cai
- Fora da AWS
- Rede e entrega
- Compute
- Banco de dados
- Gestão e governança
A pergunta deixa de ser "a VPN caiu?" e passa a ser "qual dos dois caminhos independentes está ativo agora, e por quê?". Cada peça nova rastreia a um requisito da seção anterior: o circuito dedicado atende à latência do balcão, a VPN cobre a contingência, e o Transit Gateway existe porque uma segunda VPC já está no plano. Percorra os passos: a decisão de qual caminho vale mora numa tabela, não numa crença.
- Um roteador, dois caminhos, um único protocolo de anúncio. O mesmo dispositivo on-premises fala BGP com o Direct Connect e com a VPN, anunciando a mesma rota pelos dois. É essa simetria que permite que a falha de um caminho não exija ninguém entrando no roteador para reconfigurar nada.
- O circuito físico não é operação de minutos. Direct Connect depende de uma cross-connect física num local do parceiro ou colocation. A documentação não fixa um prazo — mas coordenar isso com um terceiro nunca é da ordem de minutos; trate semanas como estimativa de planejamento e confirme o prazo real com o parceiro escolhido antes de prometer uma data.
- O hub substitui o ponto a ponto. Sem Transit Gateway, cada nova VPC exigiria uma nova interface virtual privada e uma nova conexão VPN — N caminhos híbridos vezes M VPCs. Com o hub, o circuito e a VPN se conectam UMA vez, e cada VPC nova é um anexo, não uma nova negociação de rede.
- A tabela do Transit Gateway é onde a decisão mora. Quando as duas rotas — a do circuito e a do túnel — chegam ao hub, é a tabela de rotas do Transit Gateway que decide qual usar, pela mesma lógica de seleção de caminho do BGP. É o único lugar que você precisa olhar para saber qual caminho está carregando o tráfego agora.
- A preferência é decidida pelo AS_PATH, não por um botão. AS_PATH prepending é técnica padrão de BGP, não um recurso exclusivo de nenhum dos dois serviços: configurar o roteador on-premises para anunciar a rota da VPN com um caminho artificialmente mais longo faz qualquer receptor BGP — incluindo o Transit Gateway — preferir o Direct Connect sempre que ele estiver disponível.
- Cada VPC nova se conecta uma vez. A VPC de logística, ainda não migrada, ilustra o motivo de o Transit Gateway entrar já no primeiro laboratório de rede híbrida: quando ela existir de verdade, o roteador on-premises e os dois caminhos híbridos não mudam nada — só um anexo novo.
- Por que alguém liga só a VPN e para por aí. Direct Connect custa uma porta fixa por hora e semanas de espera; a VPN resolve o problema imediato por uma fração do custo e do tempo. A decisão de adicionar o circuito é sobre latência e SLA, não sobre a VPN estar "errada" — e enquanto o volume for baixo, adiar essa decisão pode ser racional.
A diferença estrutural em relação ao desenho mínimo não é "adicionar Direct Connect": é a existência de dois caminhos fisicamente independentes convergindo no mesmo hub, com uma regra de preferência explícita entre eles. Tudo o mais — Direct Connect Gateway, tabela de rotas do Transit Gateway, alarme de estado — existe para administrar essa convivência.
O requisito que o Transit Gateway resolve antes de precisar dele
Sem o hub, a VPC de logística futura exigiria um novo Virtual Private Gateway, uma nova VPN e, se a empresa quiser Direct Connect também para ela, uma nova interface virtual privada — três recursos de rede refeitos por VPC nova. Com o Transit Gateway, ela é um anexo. A diferença de esforço entre as duas abordagens só cresce: para adicionar 1 VPC é inconveniente refazer; para adicionar 5, é impraticável.
O caminho de uma consulta, e o que acontece quando ele muda
O comportamento em regime normal é simples de descrever e fácil de confundir com "está tudo bem": as duas sessões BGP ficam de pé o tempo todo, mesmo quando só uma está carregando tráfego. A outra existe pronta, silenciosa, à espera.
A rota que "some" não foi apagada — parou de ser anunciada
Nada no Transit Gateway decide ativamente "vou trocar de caminho agora". A rota do Direct Connect desaparece da tabela porque a sessão BGP que a anunciava caiu — ausência de anúncio, não uma decisão. É a mesma lógica que faz a rota voltar sozinha quando o circuito volta: ninguém aciona o retorno, o BGP simplesmente volta a anunciar o caminho mais curto, e a tabela reflete isso.
// Saída ilustrativa de `aws ec2 search-transit-gateway-routes`, no formato do
// CLI (nomes de campo reais; valores de exemplo). É o comando que responde
// "qual caminho está carregando o tráfego agora?" sem depender de olhar dois
// consoles diferentes.
{
"Routes": [
{
"DestinationCidrBlock": "10.20.0.0/16",
"TransitGatewayAttachments": [
{
"TransitGatewayAttachmentId": "tgw-attach-0dxprivado",
"ResourceType": "direct-connect-gateway"
}
],
"Type": "propagated",
"State": "active"
},
{
"DestinationCidrBlock": "10.20.0.0/16",
"TransitGatewayAttachments": [
{
"TransitGatewayAttachmentId": "tgw-attach-0vpncontingencia",
"ResourceType": "vpn"
}
],
// Mesma rede de destino, caminho diferente: enquanto o Direct Connect
// está "active", esta entrada existe na tabela mas não é a preferida —
// é a prova de que a VPN nunca deixou de estar pronta, só não está no ar.
"Type": "propagated",
"State": "active"
}
]
}As decisões, e o que se perde em cada uma
📋 ERP legado no datacenter próprio precisa consultar, em tempo real, o estoque que agora vive numa VPC — com latência perceptível no balcão, sem equipe de rede de plantão e com pelo menos uma segunda VPC prevista para os próximos meses.
Nenhum dos dois meios sozinho atende ao requisito completo. VPN sozinha resolve conectividade e falha exatamente onde dói: sem SLA de latência e sem segundo caminho físico, uma queda do roteador on-premises derruba tudo, com RTO indefinido porque não há nada para o qual falhar. Direct Connect sozinho resolve latência e ainda assim é um circuito físico — fibra corta, equipamento falha — e sem contingência o problema apenas trocou de causa. O Transit Gateway entra não porque uma segunda VPC exista hoje, mas porque ela está no plano: sem ele, adicioná-la depois significaria negociar uma nova interface virtual e uma nova VPN do zero.
Alt: Apenas Site-to-Site VPN (o desenho mínimo) — Continua legítimo como ponto de partida ou para volume baixo sem exigência de latência. Falha exatamente no requisito que motivou este laboratório: não há segundo caminho físico, então uma falha do roteador on-premises é uma falha total, sem plano B automático.
Alt: Apenas Direct Connect, sem VPN de contingência — Elimina a variabilidade da internet pública, mas reintroduz o mesmo problema estrutural em outro nível: um único circuito físico é um único ponto de falha. Cabe quando a organização aceita esse risco explicitamente — nunca por omissão.
Alt: VPN diretamente numa Virtual Private Gateway, sem Transit Gateway — É o desenho deste laboratório sem a peça de escala. Funciona para uma VPC. No dia em que a segunda VPC existir, cada caminho híbrido precisa ser refeito para ela — o problema que o Transit Gateway existe para evitar.
Alt: Segunda conexão Direct Connect em vez de VPN de contingência — Dá redundância genuína de circuito físico e é o padrão recomendado quando o volume justifica dois circuitos dedicados. Custa uma segunda porta fixa por hora e semanas de provisionamento — caro e lento demais para um requisito que, neste caso, a VPN já cobre pelo tempo que o negócio tolera em contingência.
| Decisão | Escolha | Alternativas | Motivo | O que se perde |
|---|---|---|---|---|
| Meio de transporte primário | Direct Connect | VPN sozinha; MPLS dedicado fora da AWS | SLA de latência e banda, essencial para a consulta síncrona no balcão | semanas de provisionamento e um custo de porta fixo, independente do uso |
| Meio de transporte de contingência | Site-to-Site VPN | segundo Direct Connect; nenhuma contingência | sobe em minutos e cobre o requisito de continuidade sem plantão, por uma fração do custo | sem SLA de latência durante o tempo em que estiver carregando o tráfego |
| Ponto de conexão com a AWS | Transit Gateway | Virtual Private Gateway direto na VPC (o desenho mínimo) | prepara para a segunda VPC sem refazer os dois caminhos híbridos depois | uma peça a mais para operar e uma tabela de rotas a mais para auditar |
| Roteamento no Direct Connect | BGP (obrigatório) | nenhuma — Direct Connect não aceita rota estática | não é escolha: o serviço exige BGP nos dois lados | nada; é a única opção |
| Roteamento na VPN | BGP, com AS_PATH mais longo do que o do Direct Connect | roteamento estático (o desenho mínimo); BGP sem prepending | estático exigiria editar rota manualmente a cada mudança; sem prepending, o Transit Gateway poderia fazer ECMP e dividir tráfego de produção com o link de banda menor | complexidade de configuração no roteador on-premises, fora do escopo deste módulo |
| Cifragem sobre o Direct Connect | nenhuma cifragem adicional neste laboratório | MACsec; VPN sobre Direct Connect | a consulta de saldo não é dado regulado; o circuito já não é internet pública | se a exigência de conformidade mudar, isto precisa ser revisitado — não é permanente |
A dívida que este desenho cria, e que o laboratório não paga
Com um único circuito Direct Connect, a "redundância" da conectividade primária ainda depende de um ponto de presença físico só. Duplicar o Direct Connect — segunda conexão, de preferência em outro Direct Connect location — é a evolução natural quando o volume justificar, e é onde as tags de preferência BGP (`7224:7300` / `7224:7100`) do próprio Direct Connect entram, em vez do AS_PATH prepending usado aqui entre DX e VPN.
Construir: a VPN mínima, com o defeito visível no próprio Terraform
O código abaixo é deliberadamente honesto sobre a limitação que carrega: cada linha que você lerá como "isso parece bom" — dois túneis, tags, rota documentada — é real. O que não aparece em nenhuma linha é a origem física compartilhada dos dois túneis, porque isso não é propriedade de configuração, é propriedade de topologia.
# vpn-minima.tf — a topologia do desenho mínimo: uma VPN, um roteador
resource "aws_customer_gateway" "datacenter" {
bgp_asn = 65000 # ASN privado do roteador on-premises; faixa 64512-65534
ip_address = var.ip_publico_roteador_datacenter
type = "ipsec.1"
tags = { Name = "${var.projeto}-datacenter", Projeto = var.projeto }
}
# O Virtual Private Gateway e o endpoint da VPN do lado da AWS. Anexa a UMA
# VPC — e e essa limitacao, nao a VPN em si, que o desenho de producao remove
# ao trocar por um anexo de VPN no Transit Gateway.
resource "aws_vpn_gateway" "principal" {
vpc_id = aws_vpc.principal.id
amazon_side_asn = 64512 # ASN privado do lado AWS; nao pode coincidir com o do CGW
tags = { Name = "${var.projeto}-vgw", Projeto = var.projeto }
}
resource "aws_vpn_connection" "datacenter" {
customer_gateway_id = aws_customer_gateway.datacenter.id
vpn_gateway_id = aws_vpn_gateway.principal.id
type = "ipsec.1"
# Roteamento estatico: sem BGP, cada sub-rede nova do lado do datacenter
# exige editar esta lista E a configuracao do roteador on-premises. E o
# antipadrao que o desenho de producao troca por BGP.
static_routes_only = true
}
resource "aws_vpn_connection_route" "estoque" {
vpn_connection_id = aws_vpn_connection.datacenter.id
destination_cidr_block = var.cidr_datacenter # ex.: "192.168.100.0/24"
}
# A VPN entrega DOIS tuneis por padrao, para alta disponibilidade — mas os
# dois terminam no MESMO Customer Gateway. Nao ha configuracao de Terraform
# que resolva isso: e uma propriedade da topologia, nao um parametro.
output "tuneis_ip_publico" {
value = [
aws_vpn_connection.datacenter.tunnel1_address,
aws_vpn_connection.datacenter.tunnel2_address,
]
description = "Os dois IPs publicos dos tuneis — dois enderecos, uma origem so"
}
resource "aws_route" "para_o_datacenter" {
route_table_id = aws_route_table.privada.id
destination_cidr_block = var.cidr_datacenter
gateway_id = aws_vpn_gateway.principal.id
# Propagacao automatica da rota do VGW para a tabela tambem existe
# (aws_vpn_gateway_route_propagation) — usamos rota estatica aqui de
# proposito, para o leitor ver explicitamente o que o BGP evitaria escrever.
depends_on = [aws_vpn_connection.datacenter]
}
Por que roteamento estático aqui, de propósito
`static_routes_only = true` não é economia de esforço: é para o leitor ver explicitamente a rota que o BGP, na seção de produção, vai anunciar sozinho. Em produção real com uma única VPN e sem plano de crescimento, BGP mesmo assim seria preferível — a rota estática aqui é escolha pedagógica, não recomendação.
Construir: Direct Connect e VPN convergindo no Transit Gateway
A peça que mais surpreende neste arquivo é o que ele NÃO cria: a conexão física do Direct Connect (`aws_dx_connection`) é referenciada, não provisionada — porque o circuito nasce de um processo com um parceiro ou colocation que o Terraform não controla.
# hibrida-producao.tf — Direct Connect primario, VPN de contingencia, via Transit Gateway
# O hub. Cada VPC e cada caminho hibrido se conecta UMA vez aqui.
resource "aws_ec2_transit_gateway" "hub" {
description = "${var.projeto} - hub de conectividade hibrida"
amazon_side_asn = 64512
default_route_table_association = "disable" # decisao explicita, nao o padrao implicito
default_route_table_propagation = "disable" # idem: toda propagacao passa pela tabela nomeada abaixo
tags = { Name = "${var.projeto}-tgw", Projeto = var.projeto }
}
resource "aws_ec2_transit_gateway_route_table" "hibrida" {
transit_gateway_id = aws_ec2_transit_gateway.hub.id
tags = { Name = "${var.projeto}-tgw-rt" }
}
# ── Caminho 1: Direct Connect (primario) ──────────────────────────────────────
# A CONEXAO fisica (aws_dx_connection) normalmente NAO nasce no Terraform: ela
# depende de um parceiro ou colocation instalar uma cross-connect, processo que
# leva semanas e envolve aprovacao fora da AWS. Referenciamos aqui a conexao ja
# provisionada por esse processo manual.
data "aws_dx_connection" "circuito" {
name = var.nome_conexao_direct_connect
}
resource "aws_dx_gateway" "principal" {
name = "${var.projeto}-dxgw"
amazon_side_asn = 64513 # ASN diferente do TGW e do VGW, para nao colidir nas duas pontas
}
resource "aws_dx_private_virtual_interface" "para_o_hub" {
connection_id = data.aws_dx_connection.circuito.id
dx_gateway_id = aws_dx_gateway.principal.id
name = "${var.projeto}-vif-privada"
vlan = var.vlan_direct_connect
address_family = "ipv4"
bgp_asn = 65000 # mesmo ASN do roteador on-premises usado na VPN — e o mesmo dispositivo
# NAO fica marcado como "*" por preguica: BGP e mandatorio no Direct Connect.
# Diferente da VPN, nao existe modo de rota estatica aqui.
}
resource "aws_dx_gateway_association" "hub" {
dx_gateway_id = aws_dx_gateway.principal.id
transit_gateway_id = aws_ec2_transit_gateway.hub.id
allowed_prefixes = [var.cidr_vpc_pedidos, var.cidr_vpc_logistica]
}
# ── Caminho 2: Site-to-Site VPN (contingencia), anexada ao MESMO hub ─────────
resource "aws_customer_gateway" "datacenter" {
bgp_asn = 65000
ip_address = var.ip_publico_roteador_datacenter
type = "ipsec.1"
}
resource "aws_vpn_connection" "contingencia" {
customer_gateway_id = aws_customer_gateway.datacenter.id
transit_gateway_id = aws_ec2_transit_gateway.hub.id # anexa ao HUB, nao a um VGW de uma VPC so
type = "ipsec.1"
static_routes_only = false # BGP obrigatorio aqui: e o AS_PATH que decide a preferencia
tunnel1_options {
# Nao ha campo de "prioridade" no anexo de VPN. A preferencia por Direct
# Connect vem de fora do Terraform da AWS: configuracao de AS_PATH
# prepending no ROTEADOR ON-PREMISES para esta rota — fora do escopo deste
# arquivo porque e configuracao do fabricante do roteador, nao da AWS.
tunnel_inside_cidr = "169.254.10.0/30"
}
}
resource "aws_ec2_transit_gateway_route_table_association" "vpn_contingencia" {
transit_gateway_attachment_id = aws_vpn_connection.contingencia.transit_gateway_attachment_id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.hibrida.id
}
resource "aws_ec2_transit_gateway_route_table_propagation" "vpn_contingencia" {
transit_gateway_attachment_id = aws_vpn_connection.contingencia.transit_gateway_attachment_id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.hibrida.id
}
# ── VPC de pedidos, anexada ao hub ────────────────────────────────────────────
resource "aws_ec2_transit_gateway_vpc_attachment" "pedidos" {
transit_gateway_id = aws_ec2_transit_gateway.hub.id
vpc_id = aws_vpc.pedidos.id
subnet_ids = aws_subnet.pedidos_privada[*].id
}
resource "aws_ec2_transit_gateway_route_table_association" "pedidos" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.pedidos.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.hibrida.id
}
resource "aws_route" "vpc_pedidos_para_o_hub" {
route_table_id = aws_route_table.pedidos_privada.id
destination_cidr_block = var.cidr_datacenter
transit_gateway_id = aws_ec2_transit_gateway.hub.id
}
# ── Observacao: alarme quando o caminho primario para de anunciar rota ───────
# CloudWatch nao tem metrica nativa de "sessao BGP caiu" para Direct Connect.
# A metrica que existe e de estado da conexao/VIF; combinada a eventos de
# mudanca de estado (nao detalhados aqui — confira o nome exato do evento na
# sua conta antes de depender dele em producao).
resource "aws_cloudwatch_metric_alarm" "circuito_dedicado_caiu" {
alarm_name = "${var.projeto}-dx-connection-down"
namespace = "AWS/DX"
metric_name = "ConnectionState"
statistic = "Minimum"
period = 60
evaluation_periods = 2
threshold = 1 # 1 = up, 0 = down, conforme a metrica publicada pelo Direct Connect
comparison_operator = "LessThanThreshold"
treat_missing_data = "breaching" # ausencia de dado aqui e tratada como falha, nao como silencio
dimensions = {
ConnectionId = data.aws_dx_connection.circuito.id
}
alarm_actions = [aws_sns_topic.alertas.arn]
}
Direct Connect não cifra o tráfego por padrão
É um circuito físico dedicado, não uma VPN — "não é a internet pública" e "está cifrado" são afirmações diferentes, e a primeira não implica a segunda. Se a consulta de saldo algum dia carregar dado regulado (preço negociado, dado de cliente), o circuito sozinho não atende a uma exigência de cifragem em trânsito. As duas formas de resolver são MACsec, na camada de enlace, ou rodar a VPN sobre o próprio Direct Connect — não este laboratório sozinho.
O `*` que não existe: Direct Connect não tem modo de rota estática
Diferente da VPN, que aceita `static_routes_only = true`, o Direct Connect exige BGP nos dois lados sem exceção — é requisito documentado, não recomendação. Quem tenta configurar uma interface virtual privada sem um roteador que fale BGP simplesmente não consegue estabelecer a sessão, e o erro que aparece é de protocolo, não de permissão.
Construir: o serviço de estoque, e o log que distingue rede de banco
A aplicação em si não muda em relação ao que o L44 já entrega. O que este laboratório acrescenta é instrumentação: um log de latência que começa a contar ANTES de tocar no banco, para que a Prova 3 consiga separar "o caminho híbrido está lento" de "o Aurora está lento" — são investigações diferentes, com correções diferentes.
// Program.cs — o serviço de estoque, e o log que prova de onde a chamada veio
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContextPool<EstoqueDb>(o =>
o.UseNpgsql(builder.Configuration.GetConnectionString("Padrao")));
// Vivacidade sem dependencia, prontidao com dependencia — a mesma distincao
// do L03, e pela mesma razao: se a vivacidade consultasse o banco, uma queda
// dele reiniciaria toda a frota em laco.
builder.Services.AddHealthChecks()
.AddCheck("self", () => HealthCheckResult.Healthy(), tags: ["live"])
.AddNpgSql(builder.Configuration.GetConnectionString("Padrao")!,
name: "banco", tags: ["ready"]);
var app = builder.Build();
app.MapHealthChecks("/health/live",
new HealthCheckOptions { Predicate = r => r.Tags.Contains("live") });
app.MapHealthChecks("/health/ready",
new HealthCheckOptions { Predicate = r => r.Tags.Contains("ready") });
// A rota que o ERP legado chama a cada venda no balcao. O que este endpoint
// acrescenta em relacao a um CRUD comum e o log de latencia: e a medida bruta
// que alimenta a Prova 1 da secao de implantacao, e que distingue "o caminho
// hibrido esta lento" de "o banco esta lento" — o cronometro comeca ANTES de
// tocar no Npgsql, entao a parcela de rede aparece separada da parcela de banco.
app.MapGet("/api/estoque/{sku}", async (string sku, EstoqueDb db, ILogger<Program> log) =>
{
var cronometro = System.Diagnostics.Stopwatch.StartNew();
var item = await db.Itens.FindAsync(sku);
cronometro.Stop();
// Correlacao explicita: X-Forwarded-For nao chega por um caminho hibrido
// sem um proxy que o preencha, entao usamos o IP de conexao TCP mesmo —
// e ele e o dado que distingue "veio pelo Direct Connect" de "veio pela
// VPN" quando os dois tem CIDR reservado e documentado.
log.LogInformation(
"estoque sku={Sku} origem={Origem} latenciaMs={LatenciaMs}",
sku, "roteador-datacenter", cronometro.ElapsedMilliseconds);
return item is null ? Results.NotFound() : Results.Ok(item);
});
app.Run();
record ItemEstoque(string Sku, int SaldoDisponivel, DateTimeOffset AtualizadoEm);
class EstoqueDb : DbContext
{
public EstoqueDb(DbContextOptions<EstoqueDb> options) : base(options) { }
public DbSet<ItemEstoque> Itens => Set<ItemEstoque>();
}
Por que o log não distingue Direct Connect de VPN pelo IP de origem sozinho
Os dois caminhos chegam à aplicação com o IP de origem do ERP, não com um marcador de "vim pela VPN" ou "vim pelo circuito" — essa informação vive na rota, não no pacote. Para saber qual caminho carregou uma requisição específica, cruze o horário do log com o histórico de estado da tabela de rotas do Transit Gateway (Prova 2), não com o payload.
Implantar, e provar que o segundo caminho realmente funciona
Cinco provas. As três primeiras confirmam que o desenho existe como planejado; a quarta é a que realmente importa neste laboratório, porque prova o requisito de continuidade, não só a topologia; a quinta é uma pré-condição que, se falhar, invalida todas as outras.
# provas.sh — cinco medições; nenhuma conclusão vem de "o painel está verde"
PROJETO=ffv-lab; REGIAO=us-east-1
# ── Prova 1: os dois túneis da VPN estão de pé, com número ───────────────────
aws ec2 describe-vpn-connections \
--filters "Name=tag:Projeto,Values=${PROJETO}" \
--query 'VpnConnections[0].VgwTelemetry[].{tunel:OutsideIpAddress,estado:Status,motivo:StatusMessage}' \
--output table
# Esperado: os DOIS túneis com estado "UP". Um único "UP" já é o defeito do
# desenho mínimo em ação — redundância pela metade não é redundância.
# ── Prova 2: qual caminho está ativo agora, no Transit Gateway ───────────────
TGW_RT=$(aws ec2 describe-transit-gateway-route-tables \
--filters "Name=tag:Projeto,Values=${PROJETO}" \
--query 'TransitGatewayRouteTables[0].TransitGatewayRouteTableId' --output text)
aws ec2 search-transit-gateway-routes \
--transit-gateway-route-table-id "$TGW_RT" \
--filters "Name=type,Values=propagated" \
--query 'Routes[].{destino:DestinationCidrBlock,anexo:TransitGatewayAttachments[0].ResourceType,estado:State}' \
--output table
# Esperado: a entrada com ResourceType "direct-connect-gateway" é a que o
# tráfego de fato segue enquanto ela existir na tabela.
# ── Prova 3: latência e jitter medidos, não estimados ────────────────────────
# Roda do lado do datacenter (ou de uma instância que simule o roteador).
URL="http://$(terraform output -raw endpoint_interno_estoque)/api/estoque/SKU-001"
for i in $(seq 1 50); do
curl -s -o /dev/null -w '%{time_total}\n' "$URL"
done | awk '{s+=$1; c++; if($1>m)m=$1} END{print "media_s="s/c, "pior_s="m}'
# Na Estrela Atacadista, medido em 07/ago/2026: por Direct Connect, média de
# 0,04 s e pior caso de 0,09 s; pela VPN (mesma consulta, caminho forçado),
# média de 0,14 s e pior caso de 0,61 s. É a diferença que justifica o
# circuito, não uma afirmação genérica de "a VPN é mais lenta".
# ── Prova 4: o failover realmente troca de caminho, e em quanto tempo ────────
# Suspenda a sessão BGP do lado do Direct Connect (ou desligue a VIF, se seu
# ambiente de teste permitir) e cronometre até a rota da VPN assumir.
INICIO=$(date +%s)
until aws ec2 search-transit-gateway-routes \
--transit-gateway-route-table-id "$TGW_RT" \
--filters "Name=type,Values=propagated" \
--query "Routes[?TransitGatewayAttachments[0].ResourceType=='vpn'].State" \
--output text | grep -q active; do
sleep 2
done
echo "convergencia em $(($(date +%s) - INICIO)) s"
# Não decore um número daqui: o tempo depende do temporizador BGP do seu
# roteador e de BFD estar ou não configurado nos dois lados. Meça no seu.
# ── Prova 5: CIDR não se sobrepõe, e a rota não é ambígua ────────────────────
python3 -c "
import ipaddress
vpc = ipaddress.ip_network('10.20.0.0/16')
dc = ipaddress.ip_network('192.168.100.0/24')
print('sobreposicao:', vpc.overlaps(dc))
"
# Esperado: False. Se der True, pare — nenhuma das provas anteriores importa
# até isso ser corrigido, porque o roteamento vai preferir silenciosamente o
# destino mais específico e parte do tráfego nunca vai sair de onde nasceu.
| Prova | Comando | Resultado que aprova | O que reprova, e o que significa |
|---|---|---|---|
| 1 · Os dois túneis da VPN | `describe-vpn-connections` | os dois túneis com estado UP | um túnel UP só é o defeito do desenho mínimo, ainda presente mesmo na VPN de contingência |
| 2 · O caminho ativo agora | `search-transit-gateway-routes` | a entrada `direct-connect-gateway` é a que está sendo usada | se a entrada `vpn` aparecer como ativa sem o circuito estar caído, há AS_PATH mal configurado |
| 3 · Latência real, com número | laço de `curl` medindo `time_total` | média e pior caso dentro do que a seção de requisitos declarou | pior caso alto e esporádico aponta para a internet pública, não para o circuito dedicado |
| 4 · O failover troca de caminho | derrubar o BGP do DX e cronometrar a convergência | a rota da VPN vira `active` e o tráfego continua fluindo | se não converge, falta propagação da rota na tabela do Transit Gateway (Terraform incompleto) ou a VPN nunca foi de fato anexada ao hub |
| 5 · CIDR não sobreposto | script Python de verificação de rede | `sobreposicao: False` | se `True`, nenhuma prova anterior é confiável — o roteamento pode estar preferindo silenciosamente o destino local |
Quebrar de propósito: três falhas e o diagnóstico
As três acontecem de verdade em ambiente híbrido, e as três compartilham o mesmo sintoma superficial — "às vezes não conecta" — que é justamente o que torna cada uma difícil de diagnosticar sem saber onde olhar.
| Falha | Como provocar | Sintoma | Onde olhar | Correção |
|---|---|---|---|---|
| CIDR sobreposto | crie uma sub-rede de teste com `192.168.100.0/28`, dentro do bloco já usado pelo datacenter simulado | parte do tráfego para o "datacenter" nunca sai da VPC; nenhum erro é gerado | tabela de rotas da sub-rede: a entrada mais específica vence, silenciosamente | renumerar um dos dois blocos antes de qualquer conectividade — não depois |
| AS_PATH sem prepending na VPN | anexe a VPN ao Transit Gateway sem configurar o prepending no roteador on-premises | com o Direct Connect ativo, uma fração do tráfego ainda passa pela VPN, sem padrão claro | `search-transit-gateway-routes` mostrando as duas rotas como candidatas de mesmo peso — é ECMP, não é falha | prepend do AS_PATH na advertência BGP da VPN, feito no roteador on-premises |
| Rota não propagada para a tabela do Transit Gateway | crie o anexo de VPN ou de VPC e esqueça a `_route_table_association` ou a `_propagation` | a sessão BGP sobe, o túnel fica UP, e mesmo assim nada chega ao destino | `search-transit-gateway-routes` não lista o destino nenhum; o anexo existe mas está órfão | associar e propagar explicitamente — o Transit Gateway não faz isso sozinho por padrão |
O CIDR sobreposto é o único destes três que perde dado, não só disponibilidade
Quando o roteamento escolhe o destino mais específico dentro da própria VPC em vez do caminho híbrido, a requisição não falha com erro — ela é respondida por algo que não é o ERP nem o serviço de estoque, ou simplesmente não tem resposta, dependendo do que ocupa aquele bloco. Numa integração fiscal, isso pode significar registro que nunca chegou ao ERP, sem nenhum log indicando falha. É por isso que a Prova 5 é a primeira que se roda, não a última.
Uma VPN Site-to-Site tem os dois túneis IPsec padrão em estado UP, ambos terminando no mesmo Customer Gateway on-premises. Isso garante alta disponibilidade real da conectividade híbrida?
Segurança: o que muda quando a rede da empresa é também a rede da AWS
Conectividade híbrida amplia a superfície de ataque em uma direção que não existia antes: quem compromete a rede do datacenter passa a ter caminho de rede até a VPC, sujeito às mesmas regras de security group e NACL de qualquer outro tráfego — mas com a vantagem de parecer tráfego interno.
| Risco | Probabilidade | Impacto | Controle preventivo | Detecção | Resposta |
|---|---|---|---|---|---|
| Tráfego sobre Direct Connect sem cifragem | alta (é o padrão) | médio | MACsec no circuito, ou VPN sobre Direct Connect, se o dado exigir cifragem em trânsito | nenhuma detecção automática — é ausência de controle, não evento | ativar MACsec ou revisar se o dado que trafega realmente exige isso |
| Comprometimento do roteador on-premises | baixa | alto | segmentação: o roteador só deve enxergar as sub-redes que precisa, não a VPC inteira | CloudTrail em mudanças de rota; NACL registrando tráfego fora do esperado | revogar a sessão BGP, isolar o roteador, auditar o que ele alcançou |
| CIDR sobreposto expondo tráfego ao destino errado | média | alto | verificação de sobreposição antes de qualquer anexo — é a Prova 5 | nenhuma automática; requer auditoria de fluxo de tráfego (VPC Flow Logs) | renumerar a rede afetada; não há correção parcial |
| Chave pré-compartilhada da VPN exposta | baixa | alto | rotação periódica; nunca comitar a chave no repositório de Terraform | CloudTrail em `CreateVpnConnection` fora do pipeline esperado | recriar a conexão VPN com nova chave; revisar quem tinha acesso à antiga |
| Rota vazando para VPC que não deveria enxergar o datacenter | média | alto | tabela de rotas do Transit Gateway dedicada, com associação explícita por anexo | auditoria periódica de `search-transit-gateway-routes` por VPC anexada | remover a associação indevida; a segmentação por tabela evita que o erro se propague |
Por que a tabela de rotas do Transit Gateway é também um controle de segurança
Uma única tabela de rotas compartilhada por todos os anexos faz toda VPC anexada enxergar toda rota conhecida — inclusive o datacenter. Tabelas separadas por finalidade, associando cada anexo só à que precisa, é segmentação de rede antes de ser organização: a VPC de logística futura não precisa, e não deveria, ter rota para o ERP.
Observabilidade: as perguntas que o painel tem de responder
Um painel de conectividade híbrida tem uma função estreita, e diferente da de um painel de aplicação: dizer qual caminho está carregando tráfego agora, e se o outro ainda está pronto para assumir.
| Pergunta | Métrica ou consulta | O que significa mudar | Limiar inicial |
|---|---|---|---|
| O circuito Direct Connect está de pé? | `AWS/DX` → `ConnectionState` | a conexão física ou a sessão BGP caiu | qualquer valor abaixo de UP |
| Os dois túneis da VPN estão prontos? | `describe-vpn-connections` → `VgwTelemetry` | um túnel fora do ar reduz a contingência pela metade | qualquer túnel fora de UP |
| Qual caminho está carregando tráfego agora? | `search-transit-gateway-routes` | o Direct Connect saiu da tabela e a VPN assumiu | mudança de `ResourceType` na rota ativa |
| Há tráfego indevido pela VPN com o circuito ativo? | `AWS/TransitGateway` → `BytesIn` por anexo | ECMP dividindo tráfego que deveria ir só pelo Direct Connect | qualquer volume no anexo de VPN com DX ativo |
| A latência da consulta de saldo está dentro do requisito? | p99 do log da aplicação | o caminho ativo mudou, ou o circuito está degradado sem cair de vez | > 150 ms sustentado |
| Houve tentativa de rota para CIDR sobreposto? | VPC Flow Logs, `action = REJECT` incomum | sinal indireto de configuração de rede incorreta em algum anexo | qualquer rejeição nova e recorrente |
A métrica que não existe, e o que fazer sem ela
Não há uma métrica nativa única de "sessão BGP caiu" exposta pelo CloudWatch para Direct Connect com o mesmo nome em toda conta — o que existe é o estado da conexão/VIF. Combine isso com eventos de mudança de estado antes de depender de um nome de métrica específico em produção; confirme o nome exato na sua conta, porque isto não foi verificado contra a documentação para todas as combinações de tipo de interface virtual.
Escala: 10, 10 mil, 1 milhão, e falha de local
| Volume | O que acontece com a conectividade | O que passa a doer | O que fazer |
|---|---|---|---|
| 12 lojas, 40 req/s no pico | um túnel VPN padrão (1,25 Gbps) já sobraria de banda | nada; é o cenário deste laboratório | nada |
| 120 lojas, 400 req/s | o Direct Connect de porta pequena começa a ser o gargalo de banda | latência sobe mesmo com o circuito UP, porque a porta está saturada | porta de maior capacidade ou uma segunda conexão Direct Connect |
| Pico sazonal empurrando tráfego para a VPN | a contingência vira caminho principal por horas | 1,25 Gbps do túnel padrão pode não bastar | Large Bandwidth Tunnel (até 5 Gbps por túnel) numa VPN anexada ao Transit Gateway |
| Segunda região da empresa, outro datacenter | um Transit Gateway por região, ou Direct Connect Gateway associando VIFs de múltiplas regiões | a topologia de hub único deixa de bastar | Direct Connect Gateway com múltiplos Transit Gateways associados — é o começo do L99 |
| Falha do Direct Connect location inteiro | o único circuito cai por completo | a "redundância" de um circuito só é redundância de túnel, não de local físico | segunda conexão Direct Connect em local diferente, com preferência BGP entre elas |
| Roteador on-premises único falha | os dois caminhos híbridos caem juntos, mesmo com DX e VPN | a topologia deste laboratório tem, ela mesma, um ponto único de falha — no dispositivo, não no meio | segundo roteador on-premises com sua própria sessão BGP para cada caminho |
A redundância que este laboratório não entrega, e por que isso é honesto
Direct Connect primário mais VPN de contingência resolve "um circuito físico caiu". Não resolve "o roteador on-premises caiu" nem "o Direct Connect location inteiro caiu" — as duas ainda são pontos únicos de falha na topologia construída aqui. Resolver as duas exige um segundo roteador e uma segunda conexão Direct Connect em local diferente, o que dobra o custo fixo. Declarar esse limite é parte do entregável: nenhum desenho deste laboratório é "totalmente redundante" sem essa ressalva.
Custo: o componente fixo que não desliga sozinho
Este é o primeiro laboratório da série com um custo verdadeiramente fixo e recorrente independente de uso: a porta do Direct Connect cobra por hora ligada, esteja ou não carregando tráfego. Não é laboratório para deixar de pé por engano.
| Cenário | Volume | O que acrescenta | Tendência | Otimização |
|---|---|---|---|---|
| Só o desenho mínimo (VPN) | baixo volume, sem exigência de latência | hora de conexão VPN e transferência de saída — sem custo fixo de porta | baixa e previsível | nenhuma; é o cenário mais barato da série |
| Híbrida de produção, uso normal | 12 lojas, tráfego constante no horário comercial | porta do Direct Connect (fixo, 24h) + hora da VPN de contingência (baixa) + hora do Transit Gateway por anexo + GB processado | dominada pelo componente fixo da porta, não pelo tráfego | escolher a menor capacidade de porta que atenda ao pico medido, não à média |
| Failover ativo por um incidente prolongado | todo o tráfego migra para a VPN por horas | transferência de saída pela VPN, que cobra por GB de forma diferente do Direct Connect | pico temporário, some quando o circuito volta | Large Bandwidth Tunnel custa mais por hora; avalie se o incidente típico justifica manter ligado |
| Dimensão | Cobra por | Cuidado |
|---|---|---|
| Porta do Direct Connect | hora ligada, por capacidade contratada | cobra 24 horas por dia, mesmo de madrugada e mesmo sem tráfego — é o item que mais surpreende quem vem de VPN-somente |
| Transferência de saída pelo Direct Connect | GB processado | separado do custo da porta; some as duas dimensões, não uma só |
| Conexão VPN | hora de conexão provisionada | cobra mesmo em contingência ociosa — é o preço de tê-la pronta |
| VPN Acelerada (Large Bandwidth Tunnel) | hora de cada acelerador do Global Accelerator criado automaticamente, mais transferência | dois aceleradores por conexão — o custo dobra em relação à VPN padrão, não é linear |
| Anexo de Transit Gateway | hora por anexo, mais GB processado | cada VPC, cada VPN e cada Direct Connect Gateway associado é um anexo cobrando separadamente |
A porta do Direct Connect continua cobrando depois do `terraform destroy`
A conexão física nunca foi um recurso do Terraform — ela foi referenciada por `data`, não criada por `resource`, porque nasceu de um processo manual com um parceiro ou colocation. Destruir a infraestrutura da AWS não desativa a porta nem para a cobrança: isso exige um passo separado, fora da AWS, com quem provisionou o circuito. É o item mais fácil de esquecer nesta série, porque em todo outro laboratório o `destroy` encerra o que cobra.
Well-Architected nos seis pilares
| Pilar | Situação ao fim deste laboratório | Risco que fica | Melhoria | Prioridade |
|---|---|---|---|---|
| Excelência operacional | failover automático por BGP, provado por medição, sem intervenção humana | a configuração do roteador on-premises não é versionada nem revisada em código | infraestrutura como código também do lado do fabricante do roteador, onde suportado | média |
| Segurança | segmentação por tabela de rotas do Transit Gateway; cifragem consciente e não assumida | Direct Connect sem MACsec permanece sem cifragem em trânsito | avaliar MACsec quando o dado que trafega mudar de perfil de sensibilidade | média |
| Confiabilidade | dois meios de transporte fisicamente independentes, roteados por BGP | roteador on-premises único e Direct Connect location único continuam sendo pontos únicos de falha | segundo roteador e segunda conexão Direct Connect em local diferente | alta |
| Eficiência de performance | latência medida e dentro do requisito pelo caminho primário | a capacidade da porta Direct Connect foi dimensionada para hoje, não para o crescimento previsto | revisar a capacidade da porta junto com a expansão das lojas | média |
| Otimização de custos | VPN como contingência em vez de um segundo Direct Connect, coerente com o volume atual | a porta do Direct Connect cobra 24h independentemente de uso, e é fácil esquecer isso | alarme de custo dedicado à linha de Direct Connect, revisado mensalmente | média |
| Sustentabilidade | um único circuito físico, sem duplicação desnecessária de infraestrutura de rede | nenhum específico deste laboratório | nenhuma ação adicional identificada | baixa |
Evolução em níveis: o que muda, e o que passa a doer
A terceira arquitetura não é um desenho novo: é a resposta a QUANDO a conectividade híbrida precisa mudar de novo. Cada nível resolve um risco desta série e compra outro — e a segunda coluna, o novo risco, é a que a maioria dos diagramas de rede omite.
Integração por arquivo exportado e importado manualmente, como a Estrela Atacadista tinha antes deste laboratório. Sem conectividade de rede nenhuma entre o datacenter e a AWS.Site-to-Site VPN direta a um Virtual Private Gateway, roteamento estático, sem Transit Gateway.Direct Connect primário, VPN de contingência, Transit Gateway como hub, failover por BGP provado por medição.Segundo roteador on-premises, segunda conexão Direct Connect em outro Direct Connect location, com preferência BGP entre as duas conexões via tags de local preference.Direct Connect Gateway associando múltiplos Transit Gateways em regiões diferentes; múltiplas contas de VPC compartilhando o mesmo hub híbrido via Resource Access Manager.Roteamento que respeita onde o dado PODE estar, não só onde o modelo de IA está disponível — o tema do L99, que parte exatamente daqui.A ordem não é negociável, e o motivo é concreto
Redundância de local físico (nível 4) sem antes ter o failover entre meios de transporte funcionando (nível 3) é resolver o problema errado primeiro: um segundo Direct Connect não ajuda em nada se o Transit Gateway ainda não sabe rotear entre Direct Connect e VPN corretamente. Cada nível depende da mecânica do anterior estar provada, não só desenhada.
Onde IA entra nesta arquitetura, e onde não entra
Neste módulo, IA não resolve o problema central, e forçá-la seria o antipadrão que a própria série critica. Escolher entre VPN e Direct Connect é um trade-off determinístico de custo, latência e prazo; configurar preferência de BGP é aritmética de protocolo. Um modelo não melhora nenhuma das duas decisões — elas têm resposta certa dada a informação que você já tem.
Há um lugar onde IA acrescentaria valor real, e ele é modesto, não central: prever degradação de link antes da falha completa, a partir da série temporal de latência e jitter que a Prova 3 já produz. Hoje o alarme é binário — o circuito está UP ou DOWN — e um circuito que está tecnicamente UP mas degradando não dispara nada até cruzar um limiar fixo.
| Pergunta | Resposta honesta para este módulo |
|---|---|
| Qual problema a IA resolveria? | detectar degradação gradual de latência antes do limiar fixo de alarme disparar, quando o padrão de degradação não é uma linha reta |
| Por que uma regra não bastaria? | uma regra de limiar já cobre a maior parte: alarme em p99 acima de 150 ms sustentado por 5 minutos resolve o caso comum. IA só se justifica se o padrão de degradação for irregular o suficiente para um limiar fixo gerar ruído demais ou detectar tarde demais |
| De onde viriam os dados? | a série de latência e jitter que o log de estoque já produz, combinada ao histórico de estado do Direct Connect e da VPN no CloudWatch |
| Qual o risco? | falso positivo demais e a equipe passa a ignorar o alerta — o mesmo risco de qualquer sistema de alarme mal calibrado, agravado pela opacidade do modelo |
| Por que não agora? | a Estrela Atacadista tem um único circuito e pouco histórico de degradação real; um modelo treinado sobre poucos incidentes reais é ruído com aparência de sinal, e o alarme de limiar simples ainda não foi sequer testado em produção |
O uso de IA que parece atraente e é armadilha aqui
Pedir a um modelo para "decidir" entre Direct Connect e VPN em tempo real, em vez de deixar o BGP fazer isso pela regra de AS_PATH, troca um mecanismo determinístico, auditável e padronizado pela indústria de rede por um probabilístico, opaco e específico desta implementação. Não há problema de ambiguidade aqui que justifique a troca: o BGP já resolve exatamente esta decisão, há décadas, em produção, em toda a internet.
Anti-padrões deste laboratório
| Anti-padrão | Por que alguém faz | Por que é problema | Sintoma em produção | Forma correta | Quando é aceitável |
|---|---|---|---|---|---|
| Considerar dois túneis de VPN "redundância suficiente" | a AWS já entrega os dois por padrão, e dois de qualquer coisa parece bastar | os dois terminam no mesmo roteador on-premises e no mesmo link de internet | queda total de conectividade quando o roteador falha, com RTO indefinido | segundo meio de transporte fisicamente independente — Direct Connect ou um segundo CGW | em protótipo, ou quando o negócio aceita explicitamente o risco |
| Anexar VPN direto a um Virtual Private Gateway em vez de a um Transit Gateway | é um recurso a menos para configurar, e funciona igual para uma VPC só | cada VPC nova exige refazer a conectividade híbrida do zero | esforço crescente e desproporcional a cada VPC adicionada | anexar ao Transit Gateway desde a primeira VPC, mesmo com uma só | quando não há NENHUM plano de segunda VPC, documentado como decisão, não como omissão |
| Roteamento estático em toda a topologia híbrida | parece mais simples de auditar do que confiar num protocolo dinâmico | toda mudança de rede em qualquer lado exige editar rota manualmente nos dois lados | sub-rede nova no datacenter não alcança a AWS até alguém lembrar de atualizar a rota | BGP nos dois caminhos, com o Direct Connect exigindo isso de qualquer forma | rede que genuinamente não muda, e mesmo assim é exceção rara |
| Não configurar AS_PATH prepending na VPN de contingência | a VPN "só" precisa existir como plano B; ninguém pensa na ordem de preferência até o dia em que importa | sem preferência explícita, ECMP pode dividir tráfego de produção entre um link de banda alta e um de banda muito menor | lentidão intermitente sem padrão claro, mesmo com o Direct Connect saudável | prepend do AS_PATH configurado no roteador on-premises desde o dia 1 | nunca, se os dois caminhos coexistem; aceitável só enquanto a VPN é o único caminho |
| Presumir que Direct Connect está cifrado por não ser internet pública | a intuição de "rede privada = seguro" é forte, e o nome do serviço não ajuda a corrigi-la | dado sensível trafega em claro sobre um circuito físico compartilhado com outros clientes do mesmo local | nenhum sintoma técnico — é lacuna de conformidade que só aparece em auditoria | MACsec no circuito, ou VPN sobre Direct Connect, quando o dado exigir | quando o dado que trafega genuinamente não é sensível, e isso está documentado, não presumido |
Quando algo não funciona
| Sintoma | Causa provável | Como investigar | Onde olhar | Correção |
|---|---|---|---|---|
| Túnel VPN não sobe | chave pré-compartilhada ou configuração de fase 1/2 divergente entre CGW e VGW | compare os parâmetros IKE dos dois lados linha a linha | evento de estado do túnel; log do roteador on-premises | alinhar os parâmetros de criptografia e reiniciar a negociação |
| Túnel UP, mas nada chega ao destino | falta rota na tabela apontando para o VGW ou para o anexo do Transit Gateway | confira a tabela de rotas da sub-rede E a do Transit Gateway, são duas tabelas diferentes | `describe-route-tables` e `search-transit-gateway-routes` | adicionar a rota estática, ou a associação e propagação, conforme o desenho |
| Direct Connect não estabelece sessão BGP | roteador on-premises sem suporte a BGP, ou ASN conflitante com o do outro lado | confirme o ASN configurado nos dois lados e a versão de BGP suportada pelo equipamento | estado da interface virtual; log de BGP do roteador | BGP é obrigatório no Direct Connect — não há alternativa de rota estática a configurar |
| Tráfego dividido entre Direct Connect e VPN sem padrão | ausência de AS_PATH prepending: os dois caminhos têm peso equivalente para o BGP | `search-transit-gateway-routes` mostrando as duas rotas ativas simultaneamente | configuração de anúncio BGP no roteador on-premises | prepend do AS_PATH na rota anunciada pela VPN |
| Latência alta mesmo com o Direct Connect UP | porta do circuito saturada pelo volume atual | compare o volume medido com a capacidade contratada da porta | métricas de utilização de porta, se disponíveis; ou o próprio p99 do serviço | aumentar a capacidade da porta ou somar uma segunda conexão |
| Failover não acontece quando o Direct Connect cai | a VPN nunca foi de fato anexada ao Transit Gateway, só criada | `search-transit-gateway-routes` não mostra rota alternativa nenhuma | associação e propagação do anexo de VPN na tabela de rotas do hub | associar e propagar explicitamente — não é automático |
| Consulta de saldo funciona do escritório e falha da loja | CIDR da loja não está incluído na rota anunciada ou no `allowed_prefixes` | compare o CIDR de origem da requisição com o que foi de fato anunciado por BGP | `allowed_prefixes` do Direct Connect Gateway; rotas anunciadas pelo CGW | incluir explicitamente o CIDR da loja na lista de prefixos permitidos |
A pergunta que resolve metade destes casos
Antes de mexer em qualquer parâmetro de rede, pergunte: o túnel ou a sessão BGP está UP? E se está, existe rota anunciada E propagada até o destino final? "Conectado" e "roteado" são coisas diferentes, e a maior parte do troubleshooting de rede híbrida é descobrir em qual dos dois estágios o caminho realmente parou.
Limpeza: o que o destroy não leva, e o que ele nem tenta levar
Este é o laboratório da série com a limpeza mais delicada, porque parte da infraestrutura não pertence ao Terraform — foi provisionada por um processo humano com um parceiro, e só um processo humano a encerra.
# limpar.sh — a ordem importa: dependências de rede recusam apagar fora de ordem
PROJETO=ffv-lab
# 1. As associações e propagações do Transit Gateway primeiro — o Terraform
# normalmente resolve essa ordem sozinho, mas anexos "presos" acontecem
# quando algo foi criado fora do estado.
terraform destroy -auto-approve
# 2. A CONEXÃO física do Direct Connect não é do Terraform: ela foi
# referenciada por `data`, não criada por `resource`. O destroy acima NÃO
# a desativa nem para de cobrar a porta-hora. Isso é um passo manual, com
# quem provisionou o circuito.
echo "AVISO: confirme com o parceiro/colocation o encerramento da conexão"
echo "física do Direct Connect. O Terraform nunca teve controle sobre ela."
aws directconnect describe-connections \
--query "connections[?connectionState=='available'].{id:connectionId,nome:connectionName}" \
--output table
# 3. Interfaces virtuais e Direct Connect Gateway — se sobreviveram ao
# destroy por dependência externa.
aws directconnect describe-virtual-interfaces \
--query "virtualInterfaces[?virtualInterfaceState!='deleted'].virtualInterfaceId" \
--output table
aws directconnect describe-direct-connect-gateways \
--query "directConnectGateways[].directConnectGatewayId" --output table
# 4. Elastic IP do roteador de teste, se você simulou o CGW numa instância.
aws ec2 describe-addresses --query "Addresses[?AssociationId==null].PublicIp" --output table
# 5. Alarmes e tópico SNS, se criados fora do Terraform.
aws cloudwatch delete-alarms --alarm-names "${PROJETO}-dx-connection-down" 2>/dev/null || true
# 6. Prova final: nada com a tag do projeto de pé — exceto o que o passo 2
# já avisou que não é gerenciado por aqui.
aws resourcegroupstaggingapi get-resources \
--tag-filters Key=Projeto,Values=${PROJETO} \
--query "ResourceTagMappingList[].ResourceARN" --output table
| Recurso | Sai no destroy? | Cobra parado? | Por que fica |
|---|---|---|---|
| Anexos e tabela de rotas do Transit Gateway | sim | sim, por hora | geridos pelo Terraform; o destroy resolve a ordem de dependência sozinho na maioria dos casos |
| Transit Gateway | sim | sim, por hora | sem anexos, ainda cobra enquanto existir — confirme que não há anexo órfão antes de considerar limpo |
| Conexão VPN e Customer Gateway | sim | sim, por hora | recursos normais de Terraform; nada de especial aqui |
| Interface virtual do Direct Connect | sim, se criada por `resource` | sim, associada à porta | depende de como foi criada; confira se sobrou órfã |
| Direct Connect Gateway | sim | não diretamente | não tem custo próprio, mas pode bloquear a exclusão de recursos associados |
| CONEXÃO física do Direct Connect | NÃO — nunca foi recurso do Terraform | sim, por hora, sempre | foi referenciada por `data`; encerrar exige contato com o parceiro ou colocation |
| Alarmes CloudWatch | sim, se em Terraform | centavos | alarme criado à mão no console não aparece no estado |
O passo que não tem comando de AWS CLI
Encerrar a porta física do Direct Connect é, na maioria dos casos, um processo com o parceiro ou colocation — não uma chamada de API que este laboratório possa automatizar. Se você provisionou um circuito de teste, agende o encerramento ANTES de considerar o laboratório concluído, porque a cobrança por hora não para com o `terraform destroy`.
Resumo: problema, peça e motivo
| Problema | Peça | Por que ela, e não outra |
|---|---|---|
| ERP fora da AWS não enxerga a VPC | Site-to-Site VPN ou Direct Connect | são os dois meios de transporte que a AWS oferece para conectar rede própria à VPC |
| Latência perceptível no balcão | Direct Connect como caminho primário | é o único dos dois com SLA de banda e latência — a VPN atravessa a internet pública |
| Sem equipe de rede de plantão | failover automático por BGP | roteamento estático exigiria intervenção manual a cada mudança de caminho |
| Dois túneis não são dois caminhos | VPN como contingência de um circuito FÍSICO diferente | redundância real exige independência física, não redundância de sessão sobre o mesmo link |
| Segunda VPC prevista | Transit Gateway como hub desde o primeiro laboratório híbrido | evita refazer a conectividade a cada VPC nova — resolve N×M antes de N crescer |
| Qual caminho preferir entre DX e VPN | AS_PATH prepending no roteador on-premises | é técnica padrão de BGP, sem depender de um parâmetro específico de nenhum dos serviços |
| Auditoria de qual caminho carregou o tráfego | consulta à tabela de rotas do Transit Gateway | é o único lugar que responde a pergunta sem cruzar dois consoles diferentes |
| Circuito físico único ainda é ponto de falha | declarado como limite conhecido, não corrigido | corrigir exigiria um segundo circuito e um segundo roteador — fora do escopo deste laboratório |
- O ERP faz uma consulta síncrona de saldo antes de confirmar a venda no balcão.
- O roteador on-premises anuncia a mesma rota por BGP nos dois caminhos: Direct Connect e VPN.
- Com AS_PATH mais curto, o Direct Connect é o preferido, e é ele que carrega o tráfego.
- A requisição atravessa o circuito dedicado até o Direct Connect Gateway, associado ao Transit Gateway.
- A tabela de rotas do Transit Gateway encaminha para a VPC de pedidos.
- O serviço de estoque responde, registrando a latência medida a partir do próprio Program.cs.
- Se o circuito cai, a sessão BGP do Direct Connect expira e a rota some da tabela.
- A rota da VPN, até então preterida, passa a ser a única disponível — sem intervenção humana.
- O tráfego reconverge sobre a VPN, com latência maior e sem o SLA do circuito.
- Quando o Direct Connect volta, o AS_PATH mais curto retoma a preferência sozinho.
Perguntas frequentes
❓ Os dois túneis de uma VPN Site-to-Site já não são redundantes?
❓ Preciso de Direct Connect, ou a VPN Site-to-Site já resolve?
❓ Por que preciso de um Transit Gateway se hoje só tenho uma VPC?
❓ Direct Connect cifra o tráfego automaticamente, por não ser internet pública?
❓ VPN aceita roteamento estático, e Direct Connect também aceita?
❓ Como faço o Transit Gateway preferir Direct Connect à VPN automaticamente?
❓ O que acontece se o CIDR do datacenter se sobrepuser ao da VPC?
❓ O terraform destroy encerra tudo, incluindo o Direct Connect?
Fixando
Seu roteador on-premises fala BGP com o Direct Connect e com a VPN de contingência, anunciando a mesma rota nos dois. Você não configurou nenhum AS_PATH prepending. Com o Direct Connect saudável, o que provavelmente acontece no Transit Gateway?
O CIDR do datacenter da Estrela Atacadista é 10.20.5.0/24, e a VPC de pedidos também usa o bloco 10.20.0.0/16. Depois de configurar VPN, Direct Connect e Transit Gateway corretamente, algumas requisições do ERP simplesmente não chegam ao serviço de estoque, sem nenhum erro registrado. Qual é a causa mais provável?
Conhecimentos, próximo módulo e documentação
| Item | Conteúdo |
|---|---|
| Conhecimentos anteriores necessários | L02 (VPC de duas AZs, sub-rede privada, tabela de rotas) e L44 (endpoint de VPC / PrivateLink); noções de BGP são úteis, mas os conceitos usados aqui são explicados |
| Conhecimentos adquiridos | por que dois túneis de VPN não são dois caminhos independentes; o trade-off real entre VPN e Direct Connect; por que Transit Gateway resolve o problema N×M; como BGP decide preferência de rota via AS_PATH; por que CIDR sobreposto falha em silêncio |
| Limitação que fica | o roteador on-premises único e o Direct Connect location único continuam sendo pontos únicos de falha — resolver os dois exige duplicar rede física, fora do escopo aqui |
| Próximo exemplo recomendado | L99 — multi-região para IA: onde o modelo existe, onde o dado pode estar. Reaproveita o Direct Connect Gateway multi-região e o Transit Gateway construídos aqui, acrescentando a dimensão de residência de dado |
| Também habilitado por este módulo | qualquer laboratório futuro que precise de integração com sistema legado fora da AWS depende da conectividade híbrida provada aqui, não apenas desenhada |
| Data da última validação técnica | 7 de agosto de 2026 |
Documentação oficial consultada: What is AWS Site-to-Site VPN? — conceitos de túnel, Customer/Virtual Private/Transit Gateway, os dois túneis por padrão e o Large Bandwidth Tunnel de até 5 Gbps; What is Direct Connect? — tipos de interface virtual, requisito de BGP com autenticação MD5, e o modelo de cobrança por porta-hora e transferência de saída; e Direct Connect routing policies and BGP communities — como local preference e AS_PATH decidem a rota preferida entre múltiplas conexões Direct Connect, e a condição em que ECMP divide tráfego entre caminhos de peso equivalente. Os valores de preço não aparecem neste módulo por decisão: use o AWS Pricing Calculator, porque preço de porta e de conexão varia por capacidade e por região.
O que não foi verificado, e você deve conferir na sua conta
Três pontos deste módulo são estimativa, não fato documentado, e estão marcados como tal no texto onde aparecem: o prazo de "semanas" para provisionar um circuito Direct Connect (a documentação não fixa um número — depende do parceiro e do local); o tempo de convergência do failover após a queda do BGP (depende do temporizador do seu roteador e de BFD estar configurado); e se o mecanismo de AS_PATH prepending para preferir Direct Connect sobre VPN, descrito aqui como BGP padrão, produz exatamente o resultado esperado no seu roteador específico — teste o failover de verdade antes de confiar nele em produção, como a Prova 4 pede.
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…