DevOps Day 2017 – Porto Alegre

DevOps Day Porto Alegre 2017No último sábado aconteceu em Porto Alegre a edição 2017 do DevOps Day. Cerca de 180 pessoas estiveram presentes no evento realizado na Faculdade de Tecnologia do Senac. Foi uma verdadeira maratona, com 14 palestras em um dia. Achei muito legal o formato do evento: sessões rápidas, direto ao ponto. Perguntas e respostas com um momento definido, geralmente em um slot de 15 minutos a cada três palestras. Uma atividade que eu não conhecia, mas que trouxe muita discussão entre a audiência, foi o fishbowl – extremamente interessante.

Quanto ao conteúdo, achei a maioria das palestras de alto nível, apesar de sentir falta de mais demos. Já no que envolve Cloud Computing, praticamente nada de Azure (domínio de AWS). Sem dúvidas, ano que vem irei submeter uma palestra ao evento contemplando algumas coisas da plataforma. Minha avaliação geral do evento é muito boa – recomendo a todos a participação.

Application Insights – Monitoramento de Endpoint

Já precisou fazer o health-check do endpoint da sua aplicação ou serviço, e ser notificado caso haja problemas? Há pouco tempo atrás, a feature de monitoramento de Endpoints era própria da WebApp no Azure. Na semana passada precisei configurar, e não a encontrei no local que eu costumava. Uma pesquisada rápida e descobri que essa feature foi movida para o Application Insights, atuando de maneira independente da WebApp. Para quem não conhecia/conhece o recurso: ele permite pings (http requests) periódicos de maneira externa a aplicação, a partir de diversas regiões do mundo. Obviamente, também permite a configuração de notificações, seja por e-mail ou webhooks.

A configuração é simples:

  • Crie o recurso Application Insights, caso não tenha feito juntamente com  a criação da WebApp. Para este propósito (http request), utilizei a opção “General”:

Azure Monitoramento de Endpoints Application Insights 1

  • Assim que  estiver que o AppInsights estiver rodando, adicione um teste (“Availability” -> “Create Test”):

Azure Monitoramento de Endpoints Application Insights 2

  • Escolha um nome e adicione a URL a ser monitorada (no meu caso, a URL root da aplicação). Deixei como freqüencia de teste, 5 minutos. Escolhi localidades aleatórias (obviamente isso depende das suas necessidades de negócio): Brasil, Sydney, Moscou e San Jose:

Azure Monitoramento de Endpoints Application Insights 3

  • Critério de sucesso: utilizei o padrão (retorno de um http 200), mas poderia inclusive validar o conteúdo de retorno desta chamada.

Azure Monitoramento de Endpoints Application Insights 4

  • Alertas: diminuí o treshold (se falhar em mais de 2 localidades, dispara a trigger). Por padrão, será enviado um e-mail para o administrador da subscription. Se eu quisesse algo mais personalizado, poderia configurar um webhook (e receber uma ligação de voz com detalhes do alerta, conforme explico neste post):

Azure Monitoramento de Endpoints Application Insights 5

  • Criado o teste, é só deixar rodando:

Azure Monitoramento de Endpoints Application Insights 6

  • Para fins de validação, parei e aplicação e aguardei os erros refletirem no dashboard:

Azure Monitoramento de Endpoints Application Insights 7

Extremamente fácil e útil!

Até a próxima!

[ ]´s

 

IIS AppPool: troca das credenciais

Essa semana passei trabalho com uma conta de serviço (do domínio) que estava sendo bloqueda por tentativas inválidas de login. Esta mesma conta é utilizada na Application Pool de uma aplicação no IIS, para fins de autenticação integrada no acesso a banco e aplicações externas. Em paralelo as investigações para descobrir a origem do lockout, precisei alterar as credenciais utilizadas na Application Pool, pois a conta bloqueada estava causando um HTTP 503, consequentemente derrubando a aplicação. Solução? Powershell. Sempre ele.

# Conta de serviço antiga e nova (com senha)
$oldAppPoolUser     = "CONTOSO.COM\ServiceMyApp"
$newAppPoolUser     = "CONTOSO.COM\ServiceMyAppNew"
$newAppPoolPassword = "mypassword"

Import-Module "WebAdministration"

# Percorre todas Application Pools do IIS
foreach ($appPool in (Get-ChildItem –Path IIS:\AppPools)){
    
    # Verifica as credenciais da Application Pool corrente
    $currentUser = Get-Item (Join-Path 'IIS:\AppPools' $appPool.name) | select -ExpandProperty processModel  | select userName

    # Se a Application Pool utilizar o usuario 'antigo', faz a substituição e restarta a mesma
    if ($currentUser.userName -eq $oldAppPoolUser)
    {
           
     Set-ItemProperty (Join-Path 'IIS:\AppPools' $appPool.name) -Name ProcessModel -Value @{userName=$newAppPoolUser;password=$newAppPoolPassword;identitytype=3}

     Restart-WebAppPool $appPool.name

    }
}

 

Indo além: Azure Resource Groups

Eu sou um grande fã do Azure Resource Manager, devido a versatilidade neste tipo de situação. Simplesmente listo todas VM´s pertencentes ao Resource Group (um agrupamento lógico) e aplico o script para cada umas delas. Assumindo que o nome do meu Resource Group seja AppPoolValidationRG:

    • Opção1: Conectando pelo nome da VM (estando conectado via VPN ao Azure):
Login-AzureRmAccount

$vmList = Get-AzureRMVM -ResourceGroup AppPoolValidationRG

foreach ($vm in $vmList){
    # TODO1: Conectar em Cada VM
    # TODO2: Veriricar se há IIS instalado/rodando
    # TODO3: Chamar FUNCTION que faz a troca do user da AppPool
    # Invoke-Command -ComputerName $ip.PrivateIpAddress -ScriptBlock {...}
}

 

  • Opção 2: Conectando pelo IP privado (estando conectado via VPN ao Azure):
Login-AzureRmAccount

$vmList = Get-AzureRMVM -ResourceGroup AppPoolValidationRG

foreach ($vm in $vmList){
    
    $nics = Get-AzureRmNetworkInterface | where {$_.VirtualMachine.Id -eq $vm.Id}

    foreach ($nic in $nics){
        
        $ip = Get-AzureRmNetworkInterfaceIpConfig -NetworkInterface $nic

        Write-Host $vm.name $ip.PrivateIpAddress

        # TODO1: Conectar em Cada VM
        # TODO2: Veriricar se há IIS instalado/rodando
        # TODO3: Chamar FUNCTION que faz a troca do user da AppPool
        # Invoke-Command -ComputerName $ip.PrivateIpAddress

    }
}

 

  • Opção 3: Conectando pelo IP público (caso exista para todas VM´s):
Login-AzureRmAccount

$publicIPs = Get-AzureRmVM -ResourceGroupName ‘AppPoolValidationRG’ | Get-AzureRmPublicIpAddress

foreach ($publicIP in $publicIPs){
    # TODO1: Conectar em Cada VM
    # TODO2: Veriricar se há IIS instalado/rodando
    # TODO3: Chamar FUNCTION que faz a troca do user da AppPool
    # Invoke-Command -ComputerName $publicIP -ScriptBlock {...}
}

[ ]´s

SQL Saturday 609 – Caxias do Sul/RS

Mais uma vez o interior dando show na realização de eventos para a comunidade de TI. No último sábado, 24 de junho, aconteceu na cidade de Caxias do Sul/RS o SQL Saturday 609. Contando com mais de 400 inscritos, este evento ocorreu nas dependências de Uniftec, tendo sua organização liderada pelo MVP Rodrigo Crespi e sua equipe nota 10. Simplesmente impecável! Nada menos que 18 palestras, divididas em 3 trilhas: BI & Big Data, Database Administration e Database Development.

SQL Saturday 609 Caxias do Sul Marcel Goldhardt e MVP Rafael FelipeTive a oportunidade de palestrar juntamente com o MVP Rafael Felipe, líder da Microsoft Community of Practices da Dell. Apresentamos a palestra Remote Desktop Services no Microsoft Azure. Tentamos mostrar para o público como um DBA pode tirar proveito da virtualização com RDS, desde o processo de desenvolvimento de uma aplicação até a publicação das suas ferramentas de adminitração de banco, em produção.

Existe uma coisa impagável neste tipo de evento: o contato com outros profissionais, o compartilhamento de suas experiências do dia-a-dia, tanto técnicas quanto de carreira. Como por exemplo, conversar por uma hora com o monstro Marcelo Fernandes sobre sua mudança para Berlim, seus desafios pessoais e profissionais enfrentados neste processo. Ou “ganhar” umas dicas de SQL Server do Marcus Vinicius Bittencourt. Este tipo de acontecimento, por si só, já faz a ida ao evento valer a pena.

Meus sinceros agradecimentos ao colega Rafael Felipe e ao Rodrigo Crespi pela oportunidade de palestrar. O voto de confiança de vocês me motiva a estudar e crescer a cada dia. Como eu li em uma parede da Uniftec: It´s a long way to the top if you wanna rock and roll. Valeu! Até a próxima!

SQL Saturday 609 Caxias do Sul Palestrantes
Palestrantes ao final do evento

Azure Continuous Delivery em 9 minutos

Neste vídeo explico como configurar o Azure Continuous Delivery para sua aplicação Web. Esta nova feature do AppService nos permite implementar o Continuous Integration/Deployment rapidamente e de maneira muito fácil.

Cenário:

  • Código na máquina do desenvolvedor (standalone)
  • Criação do repositório Git local
  • Criação do repositório remoto (Github) e sincronização
  • Criação do projeto de build no Visual Studio Team Services
  • Configuração de build e deploy diretamente no Azure Portal

Tudo isso em 9 minutos!

 

Nota: não está no vídeo, mas você poderia ainda integrar um mecanismo de notificações utilizando o Zapier e o Twilio. Ao fim de cada deploy (com sucesso, mas principalmente falha) você poderia receber uma chamda de voz). A implementação é muito semelhante a deste post.

Azure Resource Manager – SKU da imagem

Há alguns dias atrás, testando deployment de recursos (VM) com o modelo ARM (Azure Resource Manager), precisei utilizar uma SKU específica. Minha necessidade era uma imagem Windows Server 2016 com SQL Server 2016. Diretamente no portal é possível apenas visualizar no nome (descrição), sem detalhes adicionais (offer/SKU).

Solução? Powershell, como sempre.

Import-Module AzureRM

# Login no Azure
Login-AzureRMAccount
# Listar Publishers Disponívies
Get-AzureRmVMImagePublisher -Location brazilsouth | Select PublisherName

Azure RM - SKU da Imagem Azure Resource Manager

 

# Listar as Offers do Publisher (Microsoft SQL Server)
Get-AzureRmVMImageOffer -Location brazilsouth -PublisherName MicrosoftSQLServer

Azure RM - SKU da Imagem Azure Resource Manager

 

# Listar as SKU´s disponíveis para a Offer SQL2016-WS2016
Get-AzureRmVMImageSku -Location brazilsouth -PublisherName MicrosoftSQLServer -Offer SQL2016-WS2016

Azure RM - SKU da Imagem Azure Resource Manager

 

# Detalhes da Imagem SQLDEV
Get-AzureRmVMImage -Location brazilsouth -PublisherName MicrosoftSQLServer -Offer SQL2016-WS2016 -Skus SQLDEV

Azure RM - SKU da Imagem Azure Resource Manager

Pronto! Agora é só utilizar a imagem desejada no seu template ARM.

[ ]´s

Interop Day 2017 em Ijuí/RS

No último sábado, 10 de junho, aconteceu mais uma edição do tradicional evento Interop Day, nas dependências do Sesc, na cidade de Ijuí/RS. Cerca de 350 pessoas estiveram presentes. Juntamente com meus colegas da Microsoft Community of Practices da Dell, estivemos participando deste dia recheado de conteúdo de alto nível. Eu, pessoalmente, voltei no tempo.

Início dos anos 2000: eu ainda morava em Panambi/RS, cheio de energia e ávido por conhecimentos novos na minha área. Eventos online, streaming? Mal tínhamos uma internet de qualidade naquela época. Restavam os eventos presenciais. A saída era pegar um ônibus e viajar a madrugada inteira até Porto Alegre. Se o evento fosse em São Paulo, a logística era muito maior, sem falar no custo. Eu tinha empresa, e estes eventos geralmente ocorriam durante a semana. Ou seja: passagem, hospedagem, alimentação e ingresso. E sem faturar um centavo enquanto estava longe.

Interop Day Ijui 2017 Auditorio SescIjuí fica distante 40km de minha cidade natal. Este evento acontece há alguns anos, mas é a primeira vez que participo. É organizado pelo incansável André Ruschel. Simplesmente incrível! Que oportunidade para o pessoal daquela região! Um evento deste nível praticamente “em casa”, coisa que anos atrás eu achava impossível de acontecer. Caravanas de diversas cidades, auditório lotado! ANIMAL!

O evento foi aberto pelo Rodrigo Dias (Microsoft), falando sobre transformação digital. Logo depois, a excelente palestra do Mauricio Alegretti, sobre fundamentos de VR (a galera foi a loucura – Unity ao vivo). Dando seqüencia, o showman Claudenir Andrade com a palestra “Inovação -Erros e Acertos”. Nossos colegas da Dell MSCoP mandaram ver no palco: Erik Filippini e Leonardo Marchese apresentaram “Hardware e Software – Detalhes que você precisa saber”. Já o Gabriel Molter e o Rafael Mesquita apresentaram a palestra “Android – Por onde começar o Desenvolvendo para dispositivos mobiles e TVs”. Nosso líder da CoP, Rafael Felipe, juntamente com o André Ruschel, detonaram (literalmente): Ransomware: “A bomba atômica cibernética”. Nosso parceiro Diego Matos, apresentou para a platéia “IoT – Um caso real”. Fechando o evento, Diogo Mendes falou sobre Segurança da Informação e Marco Civil da Internet no Brasil”. Pessoalmente, acho que esse assunto deveria ser abordado em todo eventos.

InteropDay Ijui 2017

Eu fiquei impressionado com a qualidade do Interop Day. Tenho certeza que esse foi o sentimento dos participantes. Meus sinceros parabéns ao André. Ano que vem voltaremos. Tenho certeza que será ainda melhor.

[ ]´s

 

Azure CLI 2.0 no Linux Bash do Windows

O Azure CLI 2.0 é uma poderosa ferramenta de linha de comando (Command Line Interface), que pode ser usada tanto no Windows, Linux ou macOS. Com ela é possível gerenciar e administrar os seus recursos no Microsoft Azure de maneira bastante simples e intuitiva. É um projeto open source (https://github.com/Azure/azure-cli).

Na semana passada assisti o video do MVP Rodrigo Crespi, sobre como instalar o bash do Linux (Ubuntu) no Windows. Foi então que pensei no conteúdo deste post: instalar o Azure CLI 2.0 no bash do Linux Subsystem, provisionar alguns recursos no Azure via linha de comando, e então fazer deploy de um repositório Git remoto para estes. O procedimento é simples, vamos lá:

  • Se ainda não tiver instalado o Windows Subsystem for Windows, recomendo que você assista o vídeo
  • Abra o bash, e execute os comandos a seguir:
echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ wheezy main" | \
     sudo tee /etc/apt/sources.list.d/azure-cli.list
sudo apt-key adv --keyserver packages.microsoft.com --recv-keys 417A0893
sudo apt-get install apt-transport-https
sudo apt-get update && sudo apt-get install azure-cli

 

  • Terminada a instalação com sucesso (a minha levou em torno de 5 minutos), podemos começar a utilizar o Azure CLI 2.0. Meu objetivo neste ponto, é criar uma Azure WebApp no plano grátis. Será necessário efetuar o login, criar um Resource Group, Application Plan e então a WebApp:
# Efetuar login no Azure
# Será necessário acessar https://aka.ms/devicelogin e fornecer o código de autenticação,
# após a execução do comando abaixo
az login

# Criar um Resource Group
# Nota: substitua "AzureCLIDemoRG" pelo nome do seu Resource Group
az group create --location brazilsouth --name AzureCLIDemoRG

# Criar um Service Plan
# Nota 1: substitua "AzureCLIDemoSP" pelo nome do seu Service Plan
# Nota 2: substitua "AzureCLIDemoRG" pelo nome do seu Resource Group criado no passo anterior
az appservice plan create --name AzureCLIDemoSP --resource-group AzureCLIDemoRG --sku FREE

# Criar a WebApp
# Nota 1: substitua "AzureCLIDemoWebSite" pelo nome do sua WebApp - será usado na URL de acesso (http://AzureCLIDemoWebSite.azurewebsites.net) 
# Nota 2: subsitua "AzureCLIDemo" e "AzureCLIDemoSP" pelos valores criados anteriormente
az webapp create --name AzureCLIDemoWebSite --resource-group AzureCLIDemoRG --plan AzureCLIDemoSP

 

  • WebSite criado, basta acessa-lo:

Azure CLI - Ubuntu Bash Windows - Azure WebApp Default Page

 

Instalando o Git:

sudo apt install git

 

Criando o reposiório local e adicionando os arquivos da aplicação:

  • Assumindo que os arquivos da minha aplicação estão em C:\AzureCLIDemo, estes são montados em /mnt/c/AzureCLIDemo, crie o repositório local:
git init .

 

  • Adicione os arquivos e faça commit ao master branch:
git add .
git commit -m "Primeiro commit da Demo Azure CLI 2.0 com Git"

 

  • Observação: talvez apareça uma mensagem de erro, solicitando configuração de e-mail e nome. Para adicionar esses dados execute o comando abaixo e efetue o commit novamente:
git config --global user.email "seu@email.com"
git config --global user.name "seunome"

 

A partir desse momento já poderíamos rodar o deploy a partir do reposiório local, entretanto vamos mais longe. O próximo passo será sincronizar meu repositório local com um repositório remoto (no Visual Studio Team Services).

 

Criando o repositório Git no Visual Studio Team Services:

  • Se você ainda não tem uma conta no VSTS, será necessário criar (free): https://www.visualstudio.com/vso/
  • Uma vez criada sua conta, crie um novo projeto, setando Version Control como Git:

Azure CLI - Ubuntu Bash Windows - Criando Projeto Git no VSTS

  • Configure as credenciais – a url será necessária no proximo passo:

Azure CLI - Ubuntu Bash Windows - Configurando Credenciais

 

  • Sincronizando o repositório local com o remoto (branch master X master):
# Referenciando reposiório remoto
git remote add origin https://SUACONTA.visualstudio.com/_git/AzureCLIDemo

# Push: enviando os arquivos locais para o VSTS
git push origin master

 

  • Assim que o processo de push terminar, é possível visualizar seus arquivos no VSTS:

Azure CLI - Ubuntu Bash Windows - Arquivos Master Branch Remoto VSTS

 

  • Utilizando o Azure CLI 2.o para efetuar o deploy:
az webapp deployment source config --name AzureCLIDemoWebSite --resource-group AzureCLIDemoRG --repo-url https://SUACONTA.visualstudio.com/_git/AzureCLIDemo --branch master --manual-integration

 

  • Resultado:

Azure CLI - Ubuntu Bash Windows - Resultado Deploy

Atenção: o Azure CLI possui atualizações frequentes, geralmente a cada duas semanas – inclusive comandos listados neste post estão sujeitos a alteração. Como a instalação foi feita a partir do apt-get, o comando az component não é suportado. Para atualizar, execute o comando a seguir:

sudo apt-get update && sudo apt-get install azure-cli

Lembrete: Azure CLI é conteúdo do exame 70-533.

Até a próxima!
[ ]´s

Google Cloud Onboard – Porto Alegre

Google Cloud Onboard PortoAlegreEstive participando no dia 02 de junho do Google Cloud Onboard, um evento simultâneo em 17 cidades de América Latina. No Brasil, o evento principal aconteceu em São Paulo (Allianz Arena), com transmissão ao-vivo para outras 7 cidades. Aqui em Porto Alegre, a sessão de um dia inteiro aconteceu no Cinemark do Bourbon Ipiranga. Apesar de  meu foco principal ser Microsoft Azure, considerei importante participar e poder comparar as duas plataformas.

Sobre o formato do evento, não achei muito interessante. A proposta de um simples streaming não proporciona interação alguma com os participantes, apesar de achar legal a ideia de reunir o público em uma sala de cinema, distribuindo pipoca, cachorro-quente e refrigerante. O que nos causou estranheza (outros colegas de empresa estavam presentes), foi a interrupção da transmissão durante uma demonstração, pois já era a hora programada para o almoço (a demonstração continuou acontecendo em São Paulo). Tirando o keynote (Renato Carvalho/José Papo) e a palestra final sobre carreira (por Marcelo Leite), todas as outras apresentações foram feitas pela mesma pessoa (Michel Pereira). O apresentador mostrou bastante domínio do conteúdo, mas na minha opinião a organização se equivocou em escalar a mesma pessoa para todas as atividades técnicas, causando um certo cansaço no público (e tenho certeza que o apresentador estava esgotado).

Já sobre os serviços apresentados, praticamente a mesma linha dos ofertados no Azure e AWS. Chamou atenção o fato de a concorrência não ter seu nome falado em momento algum – o máximo foi o “competidor A, competidor B”. Alguns serviços foram apresentados como algo inovador, mas já são ofertas públicas da concorrência há pelo menos dois anos. O .Net teve pouquíssimas referencias (não entendi se foi proposital, ou se a plataforma tem limitações quanto a esta tecnologia).

Uma das coisas que eu achei interessante, é o fato das VM´s na Google Cloud poderem ter sua configuração personalizada, não ficando limitadas a tamanhos pré-definidos como temos no Azure (CPU e memória). Esta característica foi muito salientada, pois tem impacto direto no custo, diminuindo situações de superdimensionamento. Mas o que eu realmente achei sensacional, foram as apresentações de Big Data (terabytes processados em poucos segundos) e Machine Learning (em especial a API de Video Intelligence).

Minha avaliação geral do evento Google Cloud Onboard é média, principalmente pelo fato do formato do evento, não pelo conteúdo em si – realmente é difícil um overview da plataforma em apenas algumas horas.

Vídeo completo do evento

Download das apresentações

 

Traffic Manager – Integrando Azure e AWS

Em praticamente toda documentação ou literatura a respeito de Cloud Computing, o cenário híbrido é abordado. Parte dos recursos on premise, parte na nuvem. Abordagem muito comum, presente em praticamente todas as empresas que estão neste movimento. E soluções distribuídas entre os provedores de public cloud (cloud x cloud), já pensou em implementar? Distribuir a carga do seu website entre Azure e AWS, implementar roteamento baseado em performance (latência) ou até mesmo implementar failover? Sim, é possível – e simples. É nesta hora que entra um de meus serviços preferidos no Azure: o Traffic Manager.

Basicamente, a função do Traffic Manager é distribuir o tráfego entre endpoints localizados em diferentes datacenters. Sendo totalmente DNS based, ele não atua como proxy ou gateway: apenas direciona os clientes diretamente ao endpoint, não “enxergando” o trafégo entre eles.

Azure Traffic Manager - Integrando Azure App Service e AWS Elastic Beanstalk

Os tipos de roteamento possíveis são:

  • Priority: roteamento de tráfego com prioridade para um endpoint primário, sendo o secundário um backup. Exemplo: o endpoint primário do meu website rodando no Azure, e o secundário no AWS. Caso o primeiro esteja down, o tráfego será atendido pelo segundo.
  • Weighted: distruibuição do tráfego entre os endpoints, no estilo “round-robin”. Ou ainda é possível definir um “peso” por endpoint.
  • Performance: meu preferido. Neste método posso ter meus endpoints distribuídos geograficamente. Os clientes serão roteados para o endpoint com menor latência, baseados em sua localização. Exemplo: o mesmo website deployed em regiões diferentes (Brasil e Oeste dos EUA): muito provavelmente, os clientes baseados no Brasil serão atendidos pelo website que roda em nosso país, assim como os clientes dos Estados Unidos possivelmente serão atendidos pela instância rodando naquele país:

Nota: e outros países além do Brasil e Estados Unidos? Em todos os testes que fiz até hoje, utilizando algumas ferramentas (como GeoPeeker), todas as requisições foram atendidas por instancias localizadas nos Estados Unidos (originadas da Ásia e Europa). Não testei América Latina, pois no plano gratuito da ferramenta, países como Argentina não estão disponíveis.

  • Geographic: roteamento “fixo” a endpoints específicos, baseados na localização geográfica. Ainda não utilizei.

Tipos de endpoint:

  • Azure: usados para serviços que estão hospedados no Azure.
  • External: para todos externos ao Azure. Ou seja: para endpoints on-premises ou em outro cloud provider (como AWS ou Google Cloud)
  • Nested: combinação de diferentes perfis do Traffic Manager.

Para este exemplo de integração, nos interessam dos tipos: Azure e External. Teremos uma instância do website rodando como PaaS no Azure (WebApp), e a outra rodando no AWS Elastic Beanstalk, sendo seu endpoint configurado como tipo “External”. A grande sacada do Traffic Manager é essa: se for External, não interessa se está hospeado em sua infraestrutura interna ou em outro cloud provider – ele considera o endpoint do mesmo tipo.

A documentação completa pode ser encontrada neste link.

Implementação:

Assumo que a aplicação já esteja deployed, tanto no Azure Webapps como no AWS Elastic Beanstalk. Neste exemplo, utilizei um projeto .Net que usamos no Global Azure Bootcamp (obrigado Gabriel Molter). Para fins de demonstração, adicionei hard-coded  o cloud provider em questão. O deployment foi feito separadamente em cada um dos serviços, mas poderia ser facilmente integrado no VSTS Online.

Traffic Manager - Aplicação Exemplo - Hospedada no Azure

Traffic Manager - Aplicação Exemplo - Hospedada no AWS

 

A configuração é extremamente simples. Basta criar um Traffic Manager profile, escolhendo nome (formando a URL <nome>.trafficmanager.net), Resource Group e Routing Method. Neste exemplo, o método de roteamento escolhido é o Priority, pois quero reproduzir um cenário onde o Azure seja meu hosting principal e o AWS ecundário, posteriormente simulando um downtime no primeiro. Note que esse método de roteamento pode ser alterado a qualquer momento.

TrafficManager-Azure-AWS-Integration-10

Um detalhe sobre o TTL: como o Traffic Manager é baseado em DNS, é necessário a definição de um TTL (Time-To-Live). Isso significa que uma vez feita a consulta pelo cliente, as próximas consultas deste ao Traffic Manager serão feitas somente após a expiração do TTL. Este valor é definido em segundos (sendo 300 o padrão).

TTL maior ou menor: na minha opinião, vai depender do método de roteamento utilizado, No caso de Priority, com o objetivo de failover, sugiro um TTL menor do que o padrão (caso o ocorra algum problema com o endpoint, não faz sentido ter que esperar 5 minutos para ser redirecionado para uma instancia “saudável”). Posso utilizar o menor TTL possível, indendente de método? Pode, mas lembre-se que a cobrança do Traffic Manager se dá por número de consultas efetuadas pelos clientes.

Assim que o deployment do Traffic Manager estiver completado, basta adicionar os endpoints:

Azure:

  • Type “Azure endpoint“,
  • Name: “Azure” – (ou qualquer outro de sua preferência)
  • Target  resource type: “App Service“, pois estou adicionando um endpoint de uma Azure Web App (PaaS). Outras opções são endpoints de VM´s no Azure ou Cloud Service:
  • Target resource: basta selecionar a Web App (as opções disponíveis aqui são baseadas na escolha do campo acima)
  • Priority: “1” – ou seja, será meu endpoint primário (menor valor, maior prioridade)

TrafficManager-Azure-AWS-Integration-4

AWS:

  • Type “External endpoint“,
  • Name: “AWS” – (ou qualquer outro de sua preferência)
  • FQDN: url completa do site hospedado na AWS (sem http/https ou barra no final)
  • Priority: “2” – prioridade menor em relação ao site hospedado no Azure

TrafficManager-Azure-AWS-Integration-5

 

Assim que adicionado o endpoint, o Traffic Manager irá fazer um health check:

TrafficManager-Azure-AWS-Integration-HealthCheck

Pronto, basta acessar o endereço definido na criação do serviço (http://<nome>.trafficmanager.net).

 

Resultados (baseado no método Prioridade):

Nota: a aplicação, tanto o Azure AppService, quanto o AWS Elastic Beanstalk, foram deployed na mesma região (Brasil). Estes testes são simples (sem alguma metodologia oficial), podendo haver variação.

Para testar este tipo de cenário, costumo usar o GeoPeeker.

  • Estando os dois endpoints online, considerando Azure com prioridade 1, e AWS com 2, todas as requests foram direcionadas conforme o esperado, ou seja, para o Azure:

TrafficManager-Azure-AWS-Integration-Routed to Azure

  • Através do Azure Portal, parei a minha aplicação, deixando a mesma offline. Todas as requests foram redirecionadas para o AWS:

TrafficManager-Azure-AWS-Integration-Routed to AWS Elastic Beanstalk

Observação: se você for executar este teste, esteja atento ao TTL configurado no serviço. Será necessário aguardar o mesmo expirar, para que o roteamento aconteça de forma correta (lembre-se, é um roteamento DNS based). Outra solução é rodar ipconfig /flushdns na sua máquina.

Outros resultados que obtive:

  • Performance: todas redirecionadas para o Azure.
  • Weighted: das seis requests, quatro foram para o AWS.

Apesar de abordar somente a camada de aplicação de maneira distribuída entre ambos provedores de núvem pública – o banco de dados tem uma complexidade muito maior neste cenário (assunto para outro post) – o Traffic Manager é sem dúvidas uma solução robusta e de rápida configuração. Há não muito tempo atrás, os custos para implementar algo semelhante era absurdamente alto, praticamente inviável para empresas de pequeno porte. E para quem estiver estudando para certificação, o Traffic Manager é assunto na prova 70-533.

Até a próxima! Um Tríplice Fraternal Abraço!