Cloud Ninja:
Rede para Faixa-Preta
Fabio Alves Moreira, Arquiteto da Bcash
Desafios para Arquitetura de Redes
• Rede como habilitar o negócio
– Velocidade, inovação, flexibilidade, capacidade elástica
• Rede controlada
– Previsível, uniforme, padronizada
• Rede suportando requisitos de aplicações legadas
Agenda
• Automação
• Manipulação de IP’s
– Virtual IP
– Multicast
• Experiência da Bcash
Automação
Maturidade na Automação de Rede
• Automação Básica
– Automação na construção de VPC e seus respectivos
componentes
• Automação Intermediária
– Sofisticação da automação indo além da construção inicial da
rede
• Automação Avançada
Automação Básica de Rede
aws ec2 create-vpc
--cidr-block
10.0.0.0/16
aws ec2 replace-route
--route-table-id
$ROUTE_TABLE_ID
--destination-cidr-block
0.0.0.0/0
--instance-id
$INSTANCE_ID
aws ec2 attach-network-interface
--network-interface-id
$ENI
--instance-id
$INSTANCE_ID
--device-index
1
aws ec2 assign-private-ip-addresses
--network-interface-id
$ENI
--private-ip-addresses
10.0.0.100
Demo
Criação de VPC e Subnet
com CLI
Automação Básica de Rede
#!/bin/sh
export AWS_DEFAULT_REGION="us-east-1"
VPC_ID
=`
aws ec2 create-vpc
--cidr-block 10.0.0.0/16 --output text |
awk
'{print $6;}'`
SUBNET_ID
=`
aws ec2 create-subnet
--vpc-id
$VPC_ID
--cidr-block 10.0.1.0/24 --output
text | awk '{print $6;}'`
echo "Created
$VPC_ID
&
$SUBNET_ID
"
#Clean up
aws ec2 delete-subnet
--subnet-id
$SUBNET_ID
aws ec2 delete-vpc
--vpc-id
$VPC_ID
Automação Básica de Rede
#!/usr/bin/python import boto.vpc Region=“us-east-1” conn = boto.vpc.VPCConnection(Region) vpc = conn.create_vpc
(‘10.0.0.0/16’)subnet = conn.
create_subnet
(vpc.id
‘10.0.1.0/24’) Print "Created “+vpc.id+” & “+subnet.id#Clean up
conn.
delete_subnet
(subnet.id
) conn.delete_vpc
(vpc.id
)Automação Básica de Rede
#Powershell script
Initialize-AWSDefaults -Region 'us-east-1'
#Create new VPC
$vpc
=
New-EC2Vpc
-CidrBlock '10.0.0.0/16'
$subnet
=
New-EC2Subnet
-VpcId
$vpc.VpcId
-CidrBlock '10.0.1.0/24'
-AvailabilityZone 'us-east-1d'
Write-Host “Created VPC: "
$vpc.VpcId
" subnet: "
$subnet.SubnetId
#Clean up VPC
Remove-EC2Subnet
$subnet.subnetId
-Force
Remove-EC2Vpc
$vpc.VpcId
-Force
Automação Básica de Rede
• Permite que a rede seja:
– Automatizada
– Tracking
– Versionada
• Ótimo Inicio!
Automação Intermediária de Rede
• Gestão de mudanças da rede
• Gerenciando a extensão da rede
– Peering e VPN
– NAT e VPN
• Automatizar configurações específicas de rede
Exemplo de Topologia com NAT
Public Subnet 1
SA-east-1
Availability Zone 1 Availability Zone 2
NAT
Public Subnet 2
NAT
Automação Intermediária de Rede
"
Resources
" : {
"
VPC
" : {
"Type" : "
AWS::EC2::VPC
",
"Properties" : {
"CidrBlock" : “10.0.0.0/16”,
"Tags" : [ { "Key" : “Name", "Value" : “VPCName“ } ]
}
},
"
PublicSubnet
" : {
"Type" : "AWS::EC2::Subnet",
"Properties" : {
"
VpcId
" :
{ "Ref" : "VPC" }
,
"CidrBlock" : “10.0.1.0/24”,
"Tags" : [ { "Key" : "Network", "Value" : "Public" } ]
}
}
Demo
Uso de CloudFormation
para Topologia de NAT
Automação Intermediária de Rede
• Controlar as mudanças na rede via CloudFormation
– Templates controlados e versionados
– UpdateStack
• Adiciona e remove recursos
• Modifica regras de security group
Automação Intermediária de Rede
• Expansão In-region com VPC peering
– Peering handshake pode ser automatizado via script
– CloudFormation “AWS::EC2::VPCPeeringConnection”
• Expansão Cross-region
– VPC, routes, VPN instances podem ser automatizados
– Vpc2vpc é um exemplo
https://github.com/vinayselvaraj/vpc2vpc
Script para expansão de rede (Peering)
"
Resources
": {
"
PeeringConnection
": {
"
Type
": "AWS::EC2::
VPCPeeringConnection
",
"
Properties
": {
"
VpcId
": {"Ref": "
VPC1
"},
"
PeerVpcId
": {"Ref": "
VPC2
"}
}
Adequação de Rotas
"Resources": {
"PeeringConnection": {
"Type": "AWS::EC2::VPCPeeringConnection",
"Properties": {
"VpcId": {"Ref": "VPC1"},
"PeerVpcId": {"Ref": "VPC2"}
}
}
"
PeeringRoute1
" : {
"
Type
" : "AWS::EC2::
Route
",
"
Properties
" : {
"
DestinationCidrBlock
": "
172.16.0.0/16
",
"
RouteTableId
" : { "Ref" : "
RouteTable1
" },
"
VpcPeeringConnectionId
" : { "Ref" : "
PeeringConnection
" }
}
},
}
Automação Intermediária de Rede
#!/bin/sh
NAT_ID
=“
i-12345
”
NAT_RT_ID
=“
rtb-22574640
”
REGION=“us-east-1”
…
# So we can monitor the other NAT instance
NAT_IP
=`
aws ec2 describe-instances
--instance-id
$NAT_ID
--region $REGION
|
grep PrivateIpAddress -m 1 | awk '{print $2;}' | sed -re 's/[",]//g'`
…
aws ec2
replace-route
--route-table-id
$NAT_RT_ID
--instance-id
$Instance_ID
--destination-cidr-block
0.0.0.0/0
--region $REGION
• Gerenciamento de componentes (Ex: HA em NAT)
Demo
Novo Cenário de NAT
Public Subnet 1
SA-east-1
Availability Zone 1 Availability Zone 2
NAT
Public Subnet 2
Private Subnet 1 Private Subnet 2 Auto Scaling Group
Automação Avançada Rede
• Automação Dinâmica: Responde dinâmicamente
quando uma condição da
aplicação
ou
rede
é
modificada
• Exemplos
– Bootstraping de instâncias
– VIP sendo reassociados com base na resposta do Auto Scaling
– Novas subnets com rotas dinâmicas
Automação Avançada Rede
• Abordagem Dinâmica
– Armazenamento de informações dinâmicas em um repositório
(external store)
• Repositórios Padrões
– Amazon S3, Amazon DynamoDB, Configuration Management Tool
– Tags
Automação Avançada Rede
• Network tagging
– Tags para Route table
•
NAT
= true
Exemplo de Tag com Múltiplos
NAT’s
Public Subnet 1
SA-east-1
Availability Zone 1 Availability Zone 2
NAT
Public Subnet 2
NAT
Private Subnet 1 Private Subnet 2
TAG
NATAZ
AZ1
TAG
NATAZ
AZ2
Exemplo de TAG com Regiões Diferentes
Public Subnet 1
SA-East-1
Availability Zone 1 Availability Zone 1
Public Subnet 2
Private Subnet 1 Private Subnet 2
US-East-2
TAG
VPN
EIP
TAG
VPN
true
TAG
VPN
true
TAG
VPN
EIP
Script para NAT dinâmica
#!/bin/bashINSTANCE_ID
=`curl --silent http://169.254.169.254/latest/meta-data/instance-id
`AZ
=`curl --silent http://169.254.169.254/latest/meta-data/placement/availability-zone
`REGION
="${AZ%?}"MAC=`curl --silent http://169.254.169.254/latest/meta-data/network/interfaces/macs/`
Script para NAT dinâmica
#!/bin/bashINSTANCE_ID=`/usr/bin/curl --silent http://169.254.169.254/latest/meta-data/instance-id`
AZ=`/usr/bin/curl --silent http://169.254.169.254/latest/meta-data/placement/availability-zone` REGION="${AZ%?}"
MAC=`curl --silent http://169.254.169.254/latest/meta-data/network/interfaces/macs/`
VPC_ID=`curl --silent http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MAC/vpc-id`
ROUTE_TABLES
=`aws ec2describe-route-tables
--region $REGION --output text--filters
"
Name=tag:NATAZ,Values=any,$AZ
"
| grep ROUTETABLES | awk '{print $2}'`Script para NAT dinâmica
#!/bin/bashINSTANCE_ID=`/usr/bin/curl --silent http://169.254.169.254/latest/meta-data/instance-id`
AZ=`/usr/bin/curl --silent http://169.254.169.254/latest/meta-data/placement/availability-zone` REGION="${AZ%?}"
MAC=`curl --silent http://169.254.169.254/latest/meta-data/network/interfaces/macs/`
VPC_ID=`curl --silent http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MAC/vpc-id` ROUTE_TABLES=`aws ec2 describe-route-tables --region $REGION --output text
--filters "Name=tag:NATAZ,Values=any,$AZ" | grep ROUTETABLES | awk '{print $2}'` # Parse through RouteTables that need to be modified
for
MY_RT_ID
in
$ROUTE_TABLES
;
doaws ec2 replace-route
--route-table-id $MY_RT_ID --destination-cidr-block 0.0.0.0/0 --instance-id $INSTANCE_ID` --region $REGIONAutomação Avançada Rede
• Scripts simples podem ser bem poderosos
– Criação dinânica e resiliênte de rede e seus componentes
– Responder as aplicações ou aos seus requisitos de negócio
Manipulação de IP
Manipulação de IP
• Endereçamento de Virtual IP (VIP)
– Suporte a casos de uso menos amigáveis ao paradigma de
nuvem
• Multicast
Abordagem tradicional
com IP’s virtuais
• Elastic IP
10.0.0.55 72.44.63.250 10.0.1.79 SA-east-1aws ec2
associate-address
–network-interface-id
eni-abc123d4
--allocation-id
[EIP Allocation ID]
--allow-reassociation
Availability Zone Availability Zone
Abordagem tradicional
com IP’s virtuais
• IP Secundário
10.0.0.55 72.44.63.250 10.0.0.79 SA-east-1aws ec2
assign-private-ip-addresses
--private-ip-addresses
10.0.0.10
--network-interface-id
eni-123abcde
--allow-reassignment
10.0.0.10
Outra Abordagem com IP’s virtuais
• Roteamento de IP virtual
10.0.0.55 192.168.0.10 10.0.1.79 AWS Region#
ifconfig eth0:1
192.168.0.10/32 up
aws ec2
replace-route
--route-table-id
[Route Table ID]
--destination-cidr-block
192.168.0.10/32
--instance-id
[Instance ID]
Passo-a-Passo
• Configurar sua instância com outro IP
• Desabilitar “SRC/DST checking”
• Usar API replace-route para direcionar tráfego
# ifconfig
eth0:1 192.168.0.10/32
up
aws ec2
replace-route
--route-table-id
[Route Table ID]
--destination-cidr-block
192.168.0.10/32
--instance-id
[Instance ID]
aws ec2
modify-instance-attribute
--instance-id [Instance ID]
Comparativo das abordagens
Abordagem
Pros
Contras
EIP
Multi-AZ
Somente IP Público
Secondary IP
IP Público e/ou
Privado
Single AZ
Roteamento do VIP
Multi-AZ
Somente IP Privado
Multicast
• Algumas aplicações legadas requerem multicast
– Descoberta de Nós (Node discovery)
– Gerenciamento de Sessão (Session management)
– Failover automático
Multicast na AWS
• Não suportado diretamente
• Pode ser implementado com Overlay Network
• Túneis GRE ou L2TP, ou com ferramentas como Ntop’s N2N
10.0.0.54 10.0.0.79 10.0.1.132 Subnet 10.0.0.0/24 Subnet 10.0.1.0/24 10.0.1.183 10.0.0.41