Microsoft Azure

Automatizar a criação, o desenvolvimento e a implantação de sites do Azure

Gyan Jadal

Baixar o código de exemplo

O Microsoft Azure é uma maneira rápida e fácil de criar e implantar sites ou APIs para seus consumidores de nuvem. Já se escreveu muito sobre diferentes aspectos dos sites do Azure, incluindo segurança, implantação e assim por diante. É sempre um desafio colocar essas informações em uma implementação real. Neste artigo, eu agrupei essas várias facetas para ajudar você a criar um site do Azure pronto para produção. Eu conduzirei pelo ciclo de vida de ponta a ponta para criar, implantar, configurar e monitorar um site do Azure.

Vou começar criando um site da Web com o Visual Studio 2013 e implante no Azure. Em seguida, definirei a integração contínua do meu repositório de código fonte para o Azure, estabelecendo a autenticação usando a chave de API ou certificados. Por fim, vou mostrar como criar e implantar o site em um ambiente de produção usando o Windows PowerShell.

Criar um site do Azure

Esta é a etapa mais simples de todo o processo. Vou criar um site do Azure e adicionar um controlador, ignorando a lógica de negócios dentro dele para ilustrar os pontos-chave. Para começar, preciso do SDK do Microsoft Azure para .NET 2.5, que pode ser baixado em bit.ly/1GlhJpu.

Usando o Visual Studio 2013, vou criar um novo aplicativo da Web ASP.NET, escolhendo o modelo vazio. Você pode selecionar a API da Web se quiser expor uma interface usando o mesmo site. Seleciono o AppInsights e hospedo em caixas de seleção do Azure. Eu não escolho qualquer autenticação por enquanto porque irei adicioná-la mais tarde. Também configurarei o Application Insights para implantação em ambientes diferentes.

Quando ele solicita por detalhes do site do Azure, conforme mostrado na Figura 1, posso digitar o nome do site, selecionar uma região e clicar em OK.

Isso configurará um site vazio e publicará no Azure. Agora, vou adicionar algum conteúdo ao site e usar o Open Web Interface para .NET (OWIN) como o middleware. Para habilitar o OWIN, adiciono os seguintes pacotes NugGet: Microsoft.Owin.Host.SystemWeb e Microsoft.AspNet.WebApi.Owin.

Configurar detalhes do site do Microsoft Azure
Figura 1 Configurar detalhes do site do Microsoft Azure

Depois de instalar os pacotes do NuGet, clico com o botão direito do mouse no Projeto e selecione Adicionar classe de inicialização OWIN. Vou nomear a classe Startup e adicionar o seguinte código para o método Configuration, que configura o roteamento do controlador:

public void Configuration(IAppBuilder app) {
  var config = new HttpConfiguration();
  config.Routes.MapHttpRoute("default", "{controller}/{id}",
    new { id = RouteParameter.Optional});
  app.UseWebApi(config);
}

Em seguida, vou adicionar um controlador para fornecer uma API clicando com o botão direito do mouse no Projeto e clicando em Adicionar classe do controlador de API da Web. Vou nomear a classe MyWebController e deixar o código gerado sozinho. Em seguida, clico com o botão direito do mouse em Projeto e Publicar. Na caixa de diálogo Publicar na guia Configurações, posso escolher a configuração Depuração para que o site possa ser depurado remotamente. Em seguida, clico em Avançar e Publicar.

Quando eu navego para meu site do Azure, o método Get do controlador é chamado por padrão, que retorna uma cadeia de caracteres JSON como ["value1", "value2"]. Meu site está em execução no Azure. Até aqui tudo bem.

Agora, vou adicionar um aplicativo cliente para chamar a API do site que acabei de expor na nuvem. Crio um novo aplicativo de console chamado MyConsoleClient e adiciono o pacote do NuGet de Bibliotecas Clientes do ASP.NET Web API 2.2. Esse pacote fornece o objeto HttpClient que usarei para chamar a API. O código a seguir é adicionado ao método principal:

var httpClient = new HttpClient();
var requestMineType = 
  new MediaTypeWithQualityHeaderValue("application/json");
httpClient.DefaultRequestHeaders.Accept.Add(requestMineType);
var httpResponse =
  httpClient.GetAsync(
  "https://MyAzureWebsiteSample.azurewebsites.net/MyWeb").Result;
Console.WriteLine(httpResponse.Content.ReadAsStringAsync().Result);
Console.ReadLine();

Agora vou executar o cliente e ver como o método Get do controlador é chamado e o ["value1", "value2"] é impresso no console. Eu publiquei a configuração Depuração para o site da Web. Apesar de você poder depurar o site localmente, às vezes é útil depurar remotamente o site publicado enquanto ele ainda está em desenvolvimento. Para depurar o site publicado, clico na guia Configurar no portal e ativo a depuração remota, selecionando a versão do Visual Studio que está sendo usada (consulte a Figura 2).

Habilitando a depuração remota para sites do Microsoft Azure
Figura 2 Habilitando a depuração remota para sites do Microsoft Azure

Para depurar o site remotamente e depurar meu cliente de console, vou colocar uma quebra na linha GetAsync. Em seguida, abro o Gerenciador de Servidores, clico com o botão direito do mouse no site e seleciono Anexar Depurador, conforme mostrado na Figura 3.

Anexar o depurador ao site da Web publicado
Figura 3 Anexar o depurador ao site da Web publicado

Agora posso entrar no código e depurar o site remotamente do meu computador e confirmar minhas alterações no repositório de origem.

Configurar a integração contínua

Agora, trabalharei na integração do meu site com o Repositório de Origem para Integração Contínua (CI). O quão interessante seria que, ao fazer check-in do código em seu repositório, o projeto do site da Web é criado e implantado automaticamente no Azure? O recurso Integrar Controle de Origem de sites do Azure oferece uma maneira fácil de vincular seu repositório de origem ao site do Azure para a integração contínua. No portal do Azure, eu navego para a guia página inicial do site e clico em Configurar implantação do controle de origem, conforme mostrado na Figura 4.

Configurar a implantação do controle de origem
Figura 4 Configurar a implantação do controle de origem

Dependendo do que você está usando como seu provedor de controle de origem, você tem opções de escolha do Visual Studio Online, repositório Git local, GitHub e assim por diante. Como meu código está no repositório do Visual Studio Online, posso escolhê-lo na próxima tela. Em seguida, insiro o nome da conta do Visual Studio Online e autorizo minha conta. Eu preciso fornecer permissão para permitir a solicitação de conexão do Azure para minha conta do Visual Studio Online. Em seguida, posso escolher o nome do repositório, que é o nome do projeto de equipe. Depois que clico em Avançar, o vínculo é estabelecido entre o meu site do Azure e o projeto de equipe do Visual Studio Online.

Na opção Compilações no Team Explorer do Visual Studio, agora deverei ver a definição de compilação criada por mim como MyAzureWebsite­Sample_CD, portanto, posso clicar com o botão direito do mouse e editar a definição. O processamento da fila é desabilitado por padrão na guia geral, portanto, eu o definirei como Habilitado. Nos parâmetros do processo em Compilação/Projetos, posso procurar e selecionar a solução para compilar.

Nesse ponto, vou fazer outras alterações nos parâmetros do processo na guia Processo. Enquanto estiver na guia Processo, observe o parâmetro Deployment. Isso é onde a integração está configurada para a definição de compilação para o serviço do Azure. Se você tiver vários projetos no repositório, o primeiro site ordenado em ordem alfabética será implantado. Para evitar isso, certifique-se de que ter uma solução separada para cada site em que você tenha CI ativado. Verifique no seu código ou clique com o botão direito do mouse e coloque uma compilação na fila. Você deve ver o site que está sendo criado e publicado no Azure.

Você pode verificar se a integração contínua está funcionando clicando na guia Implantações do site da Web, conforme mostrado na Figura 5. Aqui, você verá a última vez em uma implantação bem-sucedida ocorreu da compilação CI.

O histórico de implantação com a integração contínua
Figura 5 O histórico de implantação com a integração contínua

Configurar autenticação

O site do Azure agora está pronto para o desenvolvimento, adicionando funcionalidade de negócios e obtendo os benefícios de CI. Você desejará configurar a autenticação para o site para que você possa autenticar e autorizar os consumidores. Há cenários diferentes para essa instalação, detalhes que você encontrará em bit.ly/1CHVni3.

Antes de configurar meu site do Azure para autenticação, vou adicionar o atributo Authorize ao meu controlador e publicar o site. Executar o cliente para acessar o site retornará a seguinte mensagem:

{"Message": "Authorization has been denied for this request."}

Aqui, vou habilitar autenticação em meu site do Azure e atualizar o cliente de console para fornecer a chave de API ou as credenciais de certificado para autenticação. A autenticação e a geração de token é delegada ao Azure Active Directory (AAD). A Figura 6 mostra o fluxo de trabalho de autenticação entre o cliente, o AAD e o serviço.

Fluxo de trabalho de autenticação do Active Directory do Azure
Figura 6 Fluxo de trabalho de autenticação do Active Directory do Azure

Para a autenticação do AAD, o cliente e o site da Web devem ter entradas do aplicativo correspondentes registradas no AAD. Para fazer isso, posso navegar até a guia Active Directory no portal, selecionar o diretório org. e clicar em Aplicativos. Em seguida, eu seleciono Adicionar um aplicativo/Adicionar um aplicativo que meu org. está desenvolvendo e digito o nome do site.

No meu caso, eu inseri MyAzureWebsiteSample e selecionei a opção de API da Web ou Aplicativo da Web e em Avançar. Na próxima tela, eu digito o endereço para abrir o meu site em MyAzureWebsiteSample.azurewebsites.net para a URL de logon e [mydomain].onmicrosoft.com/MyAzureWebsiteSample como o URI de ID do Aplicativo e clique em OK. Isso criará um aplicativo AAD para o site da Web. Em seguida, adiciono a entrada do aplicativo cliente para o AAD repetindo as mesmas etapas. Para a URL de logon e o URI de ID do Aplicativo, eu inseri http://myconsoleclient.

Como esse é um aplicativo cliente, ele não precisa ser uma URL física; um URI válido é suficiente. Agora quero permitam o acesso do cliente ao aplicativo MyAzureWebsiteSample depois que ele tiver sido autenticado. Para isso, na guia Configurar, na seção Permissões para outros aplicativos, eu clico em Adicionar Aplicativo, que abrirá uma janela pop-up. Seleciono Mostrar Outros e procuro por MyAzureWebsiteSample, e em seguida, seleciono e clico em OK. Volto na guia Configurar, em Permissões Delegadas é uma permissão para acessar MyAzureWebsiteSample (consulte Figura 7). Eu marco e clico em Adicionar aplicativo.

Definindo permissões no aplicativo cliente para acessar o site do Azure no Active Directory do Azure
Figura 7 Definindo permissões no aplicativo cliente para acessar o site do Azure no Active Directory do Azure

Além disso, indicarei o ClientId para a entrada do aplicativo cliente porque eu precisarei em breve. Se você quiser usar a chave da API para autenticação, deve ser criada uma chave nesta página de configuração. Como estou usando autenticação de certificado, preciso associar meu certificado com a entrada de aplicativo cliente no AAD. Para fazer isso, usarei o módulo do AD do Azure para Windows PowerShell para automatizar o processo. Você pode baixá-lo em bit.ly/1D4gt8j.

Posso executar os seguintes comandos do Windows PowerShell para importar um arquivo .cer do computador local e carregar o certificado para a entrada do aplicativo cliente:

Connect-msolservice
$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate
$cer.Import("$pwd\MyConsoleClientCert.cer")
$binCert = $cer.GetRawCertData()
$credValue = [System.Convert]::ToBase64String($binCert);
New-MsolServicePrincipalCredential -AppPrincipalId "<client id>" -Type asymmetric -Value $credValue -StartDate $cer.GetEffectiveDateString() -EndDate $cer.GetExpirationDateString() -Usage verify

O clientid neste comando é aquele que copiei na etapa anterior. Para verificar se o certificado foi carregado com êxito, executo o cmdlet a seguir fornecendo o clientid:

Get-MsolServicePrincipalCredential -AppPrincipalId "<clientid>" -ReturnKeyValues 1

Isso exibirá todos os certificados associados com o clientid. Nesse caso, ele deve exibir um. Terminei de configurar meus aplicativos no AAD. A próxima etapa é habilitar o site da Web e o cliente onde usarei o AAD para autenticação. Primeiro, irei atualizar o projeto MyAzureWebsiteSample para ser configurado para o AAD. Vou adicionar os seguintes pacotes NuGet de segurança OWIN relacionados à autenticação: Microsoft.Owin.Security e Microsoft.Owin.Security.ActiveDirectory.

A classe Startup do MyAzureWebsiteSample, adiciono o seguinte código para o método Configuration:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
  new WindowsAzureActiveDirectoryBearerAuthenticationOptions {
    TokenValidationParameters = new TokenValidationParameters
      {
        ValidAudience = "https://[mydomain].onmicrosoft.com/MyAzureWebsiteSample",
        ValidateAudience = true,
      },
      Tenant = "[mydomain].onmicrosoft.com"
});

Você vai substituir [mydomain] com o nome do seu domínio de diretório do AAD. Isso instruirá o site para usar a autenticação do AAD para o URI de audiência especificada. Clientes que acessam o serviço precisarão fornecer esse URI para obter um token do AAD. No console do cliente, uso a Biblioteca de Autenticação do Active Directory, também chamada de ADAL, para a lógica de autenticação e adiciono o pacote do NuGet MyConsoleClient para o aplicativo de console.

ADAL

No cliente, usarei as APIs fornecidas pelo ADAL para adquirir um token do AAD fornecendo as credenciais de certificado. Substituo o código adicionado anteriormente com o código na Figura 8, que inclui autenticação.

Figura 8 Adicionar autenticação para a API

var httpClient = new HttpClient();
var requestMineType = new MediaTypeWithQualityHeaderValue("application/json");
  httpClient.DefaultRequestHeaders.Accept.Add(requestMineType);
var authContext = new  AuthenticationContext(
  "https://login.windows.net/[mydomain].onmicrosoft.com");
var clientAssertionCertificate = new ClientAssertionCertificate("<clientId>",
  GetX509CertObject("CN=MyClientConsoleCert"));
var authResult = authContext.AcquireTokenAsync(
  "https://[mydomain].onmicrosoft.com/MyAzureWebsiteSample",
  clientAssertionCertificate).Result;
httpClient.DefaultRequestHeaders.Authorization =
  new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
var httpResponse =
  httpClient.GetAsync(
  "https://MyAzureWebsiteSample.azurewebsites.net/MyWeb").Result;
Console.WriteLine(httpResponse.Content.ReadAsStringAsync().Result);
Console.ReadLine();

Você substituirá o clientid e o nome do meu certificado com seus próprios. Eu já abstraído o código de recuperação do certificado para o método GetX509CertObject, que lê o repositório de certificados e cria o objeto X509Certificate. Se você usar a APIKey em vez da autenticação de certificado, você construirá um objeto ClientCredential passando o clientId e o APIKey indicado abaixo no portal em vez de passar o objeto ClientAssertionCertificate. Se nenhuma credencial de cliente é fornecida para adquirir o token, você será solicitado pelas credenciais de usuário de locatário do AAD.

Eu executo o código na Figura 8 para autenticar o cliente e chamar o método do controlador MyAzureWebsiteSample e imprimir ["value1", "value2"]. O controlador será apresentado com as Declarações do cliente que posso usar para autorizar ainda mais o cliente.

Automatizar implantação

Até agora, trabalhei com um ambiente de desenvolvimento para implantar o site do Azure. Acabei de verificar no código e o site está implantado ou clico com o botão direito do mouse e ele é publicado, é muito fácil.

No entanto, esse não é o caso para ambientes de produção ou de controle de qualidade. Pode não ser viável implantar o Visual Studio. Agora mostrarei a você como automatizar a implantação para qualquer ambiente usando o Windows PowerShell. Eu posso executar todas essas etapas no Portal, mas elas envolverão várias etapas manuais.

O PowerShell do Azure fornece cmdlets para criar recursos do Azure, como sites, armazenamento e assim por diante. Falaremos sobre alguns dos aspectos importantes do meu script de automação. O script completo está disponível no download do código-fonte que acompanha este artigo. O modo do gerenciador de recursos no PowerShell do Azure permite agrupar logicamente vários recursos como o site da Web, o cache redis, o SQL Azure e outros em um grupo de recursos. Uso o cmdlet Switch-AzureMode para alternar o meu ambiente do PowerShell do Azure entre os modos ResourceManager e ServiceManagement.

O código a seguir ilustra alguns pontos importantes do script. Primeiro, o Add-AzureAccount exibe uma janela interativa solicitando que eu entre na minha conta do Azure. O Select-AzureSubscription define a assinatura atual. Em seguida, eu alterno os modos para ResourceManager, crio um novo ResourceGroup e adiciono meu site como um novo recurso:

$SubscriptionId = "<subscriptionid>"
Add-AzureAccount
Select-AzureSubscription -SubscriptionId $SubscriptionId -Current
Switch-AzureMode -Name AzureResourceManager
$myResourceGroup = New-AzureResourceGroup -Name "MyResourceGroup" -Location "West US"
$mywebsite = New-AzureResource -Name "MyAzureWebsiteSample"
  -ResourceType "Microsoft.Web/sites" -ResourceGroupName "MyResourceGroup"
  -Location "West US" -ApiVersion "2014-04-01" -PropertyObject @{}

Eu uso o resourcetype como Microsoft.Web/sites. Há outros resourcetypes, como Microsoft.Sql/server/databases que você pode criar com o cmdlet New-resource. Neste trecho, criarei um AzureStorageAccount para associá-lo ao meu site da Web para armazenar o rastreamento de diagnóstico. Aqui não estou usando cmdlets do ResourceManager. Eu criei o AzureStorageAccount fora do meu ResourceGroup. Neste momento, adicionar contas de armazenamento para ResourceGroups ainda não é suportado. Para criar uma tabela no armazenamento, preciso obter o contexto. Eu obtenho o contexto passando no storageAccountKey. O storageAccountKey é transmitido de um cmdlet para outro sem precisar saber detalhes:

$myStorage = New-AzureStorageAccount -StorageAccountName "MyStorageAccount"
  -Location "West US"
$storageAccountKey = Get-AzureStorageKey -StorageAccountName "MyStorageAccount"
$context = New-AzureStorageContext -StorageAccountName "MyStorageAccount"
  -StorageAccountKey $storageAccountKey.Primary
$logTable = New-AzureStorageTable -Name $MyStorageTableName -Context $context

O cmdlet Enable-AzureWebsiteApplicationDiagnostic permitirá o diagnóstico usando a conta de armazenamento que eu forneci:

Enable-AzureWebsiteApplicationDiagnostic -Name "MyAzureWebsiteSample"
  -Verbose -LogLevel Information -TableStorage
  -StorageAccountName "MyStorageAccount" –StorageTableName $MyStorageTableName

Para qualquer site, há algumas configurações no AppSettings do web.config que são específicas do ambiente. O trecho a seguir mostra como substituir Appsettings para um site do Azure com base no ambiente no qual está sendo implantado. Estas configurações substituirão os valores presentes no web.config do site:

$appSettings = @{
  "CurrentEnv" = “Test”;
  "ida:Audience" = “https://[mydomain].onmicrosoft.com/MyAzureWebsiteSample”;
  "ida:ClientId" = "8845acba-0820-4ed5-8926-5652s5353s662";
  "ida:Tenant" = "[mydomain].onmicrosoft.com";
  "any:other" = "some other setting";
} 
Set-AzureWebsite -Name “MyAzureWebsiteSample” -AppSettings $appSettings

Uma coleção de valores chave é criada e definida no site da Web, chamando o Set-AzureWebsite. Isso substituirá as configurações no web.config. Você também pode alterar isso no portal posteriormente.

Até agora, configurei a infraestrutura do meu site. Agora, quero que a lógica do aplicativo em meu serviço seja publicada. Usarei o cmdlet Publish-­AzureWebsiteProject para fazer esse trabalho. Preciso fornecer o nome do site e o pacote produzido como parte da saída da compilação para meu projeto:

Publish-AzureWebsiteProject -Package "<packagepath>" -Name "MyAzureWebsiteSample"

Usei o caminho do pacote da minha saída de compilação:

drop\_PublishedWebsites\MyAzureWebsiteSample_Package\MyAzureWebsiteSample.zip

O script também carrega o certificado no AAD. Você pode baixar o script completo no download de código que acompanha este artigo. Você também pode ver bit.ly/1zTBeQo para saber mais sobre as experiências elaboradas que o portal de sites do Azure fornece para gerenciar configurações de site e segredos ao mudar de desenvolvimento para integração com ambientes de implantação de produção.

Habilitar o Application Insights

Depois que seu site estiver em produção, você poderá obter a telemetria para entender como o site está se comportando em termos de necessidades de desempenho e dimensionamento. O Application Insights fornece uma solução de telemetria para recursos do Azure implantados. Para habilitar o Application Insights, foi preciso selecioná-lo como parte do modelo de site. Isso adiciona os pacotes NuGet necessários e um arquivo ApplicationInsights.config (que contém a chave da instrumentação) ao projeto. Agora quando o site for publicado, o recurso ApplicationInsights é criado e vinculado com a chave no arquivo de configuração.

Para ambientes de produção, crie um recurso do ApplicationInsights no novo portal. Neste momento, não há nenhum cmdlet do PowerShell do Azure disponível para configurar o AppInsights no portal. Nas propriedades, anote a chave de instrumentação. Você precisa adicionar essa chave ao arquivo ApplicationInsights.config antes que o site seja publicado para garantir que ele seja implantado com o site.

No entanto, não é possível atualizar esse arquivo durante a publicação do site. Para resolver esse problema não contando com a chave do arquivo ApplicationInsights.config. Em vez disso, adicione a chave em appsettings. Dessa forma, você pode substitui-la para cada ambiente. Como o site sabe usar essa chave? Para fazer isso, eu atualizei o código de inicialização no meu site para ler a chave de web.config e defini no objeto de configuração do App Insights:

Microsoft.ApplicationInsights.Extensibility.
  TelemetryConfiguration.Active.InstrumentationKey = "<read key from appsettings>";

Também removi a chave de meu arquivo ApplicationInsights.config porque ela não é mais necessária. Agora posso passar a chave para minha automação de script do PowerShell do Azure. Isso atualiza o appsettings durante a implantação do site. Depois de configurar o Application Insights, você pode exibir dados de desempenho no portal ou instalar agentes de monitoramento.

Conclusão

Este é um artigo passo a passo básico para retirar um site do Azure de um ambiente de desenvolvimento, configurar a autenticação e automatizar a implantação no Azure, totalmente para um ambiente de produção. O Azure percorreu um longo caminho no fornecimento de APIs poderosos usando o PowerShell do Azure e o novo portal em portal.azure.com.

Você pode estender essa configuração para adicionar seus próprios recursos, como o SQL Azure ou recursos adicionais de armazenamento. Usando as técnicas mencionadas aqui, que você poderá criar rapidamente um novo site do Azure e configurar a autenticação e a automação para implantações em qualquer ambiente.


Gyan Jadal é engenheiro de software que trabalha para a Microsoft. Ele tem vasta experiência projetar e desenvolver soluções para aplicativos baseados no Azure e sistemas corporativos locais. Entre em contato com ele pelo email gjadal@microsoft.com..

Agradecemos ao seguinte especialista técnico da Microsoft pela revisão deste artigo: Mani Sengodan