O que é o modelo dos Serviços Cloud do Azure e como o posso empacotar?

Um serviço de nuvem é criado a partir de três componentes, a definição de serviço (.csdef), a configuração de serviço (.cscfg) e um pacote de serviço (.cspkg). Os arquivos ServiceDefinition.csdef e ServiceConfig.cscfg são baseados em XML e descrevem a estrutura do serviço de nuvem e como ele é configurado, coletivamente chamado de modelo. O ServicePackage.cspkg é um arquivo zip que é gerado a partir do ServiceDefinition.csdef e, entre outras coisas, contém todas as dependências baseadas em binário necessárias. O Azure cria um serviço de nuvem a partir do ServicePackage.cspkg e do ServiceConfig.cscfg.

Quando o serviço de nuvem estiver em execução no Azure, você poderá reconfigurá-lo por meio do arquivo ServiceConfig.cscfg , mas não poderá alterar a definição.

Sobre o que gostaria de saber mais?

ServiceDefinition.csdef

O arquivo ServiceDefinition.csdef especifica as configurações usadas pelo Azure para configurar um serviço de nuvem. O Esquema de Definição de Serviço do Azure (Arquivo .csdef) fornece o formato permitido para um arquivo de definição de serviço. O exemplo a seguir mostra as configurações que podem ser definidas para as funções Web e de Trabalho:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="MyServiceName" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRole1" vmsize="Standard_D1_v2">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="HttpIn" endpointName="HttpIn" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
      <InternalEndpoint name="InternalHttpIn" protocol="http" />
    </Endpoints>
    <Certificates>
      <Certificate name="Certificate1" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
    <Imports>
      <Import moduleName="Connect" />
      <Import moduleName="Diagnostics" />
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
    </Imports>
    <LocalResources>
      <LocalStorage name="localStoreOne" sizeInMB="10" />
      <LocalStorage name="localStoreTwo" sizeInMB="10" cleanOnRoleRecycle="false" />
    </LocalResources>
    <Startup>
      <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple" />
    </Startup>
  </WebRole>

  <WorkerRole name="WorkerRole1">
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" />
    </ConfigurationSettings>
    <Imports>
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
    </Imports>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="tcp" port="10000" />
      <InternalEndpoint name="Endpoint2" protocol="tcp" />
    </Endpoints>
  </WorkerRole>
</ServiceDefinition>

Você pode consultar o Service Definition Schema) para uma melhor compreensão do esquema XML usado aqui, no entanto, aqui está uma explicação rápida de alguns dos elementos:

Sítios
Contém as definições para sites ou aplicativos Web hospedados no IIS7.

Pontos finais de entrada
Contém as definições para pontos de extremidade que são usados para contatar o serviço de nuvem.

Pontos finais internos
Contém as definições para pontos de extremidade que são usados por instâncias de função para se comunicar entre si.

ConfiguraçõesDefinições
Contém as definições de configuração para recursos de uma função específica.

Certificados
Contém as definições para certificados necessários para uma função. O exemplo de código anterior mostra um certificado que é usado para a configuração do Azure Connect.

Recursos Locais
Contém as definições para recursos de armazenamento local. Um recurso de armazenamento local é um diretório reservado no sistema de arquivos da máquina virtual na qual uma instância de uma função está sendo executada.

Importações
Contém as definições para módulos importados. O exemplo de código anterior mostra os módulos para Conexão de Área de Trabalho Remota e Azure Connect.

Startup
Contém tarefas que são executadas quando a função é iniciada. As tarefas são definidas em um arquivo .cmd ou executável.

ServiceConfiguration.cscfg

A configuração das configurações para seu serviço de nuvem é determinada pelos valores no arquivo ServiceConfiguration.cscfg . Você especifica o número de instâncias que deseja implantar para cada função nesse arquivo. Os valores para as definições de configuração que você definiu no arquivo de definição de serviço são adicionados ao arquivo de configuração de serviço. As impressões digitais de quaisquer certificados de gerenciamento associados ao serviço de nuvem também são adicionadas ao arquivo. O Esquema de Configuração do Serviço do Azure (Arquivo .cscfg) fornece o formato permitido para um arquivo de configuração de serviço.

O arquivo de configuração de serviço não é empacotado com o aplicativo, mas é carregado no Azure como um arquivo separado e é usado para configurar o serviço de nuvem. Você pode carregar um novo arquivo de configuração de serviço sem reimplantar seu serviço de nuvem. Os valores de configuração para o serviço de nuvem podem ser alterados enquanto o serviço de nuvem está em execução. O exemplo a seguir mostra as definições de configuração que podem ser definidas para as funções Web e de Trabalho:

<?xml version="1.0"?>
<ServiceConfiguration serviceName="MyServiceName" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
  <Role name="WebRole1">
    <Instances count="2" />
    <ConfigurationSettings>
      <Setting name="SettingName" value="SettingValue" />
    </ConfigurationSettings>

    <Certificates>
      <Certificate name="CertificateName" thumbprint="CertThumbprint" thumbprintAlgorithm="sha1" />
      <Certificate name="Microsoft.WindowsAzure.Plugins.RemoteAccess.PasswordEncryption"
         thumbprint="CertThumbprint" thumbprintAlgorithm="sha1" />
    </Certificates>
  </Role>
</ServiceConfiguration>

Você pode consultar o esquema de configuração de serviço para entender melhor o esquema XML usado aqui, no entanto, aqui está uma explicação rápida dos elementos:

Instâncias
Configura o número de instâncias em execução para a função. Para evitar que seu serviço de nuvem fique potencialmente indisponível durante as atualizações, é recomendável implantar mais de uma instância de suas funções voltadas para a Web. Ao implantar mais de uma instância, você está aderindo às diretrizes do SLA (Contrato de Nível de Serviço de Computação) do Azure, que garante 99,95% de conectividade externa para funções voltadas para a Internet quando duas ou mais instâncias de função são implantadas para um serviço.

ConfiguraçõesDefinições
Define as configurações para as instâncias em execução para uma função. O nome dos elementos deve corresponder às definições de configuração no arquivo de definição de <Setting> serviço.

Certificados
Configura os certificados usados pelo serviço. O exemplo de código anterior mostra como definir o certificado para o módulo RemoteAccess. O valor do atributo de impressão digital deve ser definido como a impressão digital do certificado a ser usado.

Nota

A impressão digital do certificado pode ser adicionada ao arquivo de configuração usando um editor de texto. Ou, o valor pode ser adicionado na guia Certificados da página Propriedades da função no Visual Studio.

Definindo portas para instâncias de função

O Azure permite apenas um ponto de entrada para uma função Web. O que significa que todo o tráfego ocorre através de um endereço IP. Você pode configurar seus sites para compartilhar uma porta configurando o cabeçalho do host para direcionar a solicitação para o local correto. Você também pode configurar seus aplicativos para ouvir portas conhecidas no endereço IP.

O exemplo a seguir mostra a configuração de uma função Web com um site e um aplicativo Web. O site é configurado como o local de entrada padrão na porta 80 e os aplicativos Web são configurados para receber solicitações de um cabeçalho de host alternativo chamado "mail.mysite.cloudapp.net".

<WebRole>
  <ConfigurationSettings>
    <Setting name="DiagnosticsConnectionString" />
  </ConfigurationSettings>
  <Endpoints>
    <InputEndpoint name="HttpIn" protocol="http" port="80" />
    <InputEndpoint name="Https" protocol="https" port="443" certificate="SSL"/>
    <InputEndpoint name="NetTcp" protocol="tcp" port="808" certificate="SSL"/>
  </Endpoints>
  <LocalResources>
    <LocalStorage name="Sites" cleanOnRoleRecycle="true" sizeInMB="100" />
  </LocalResources>
  <Site name="Mysite" packageDir="Sites\Mysite">
    <Bindings>
      <Binding name="http" endpointName="HttpIn" />
      <Binding name="https" endpointName="Https" />
      <Binding name="tcp" endpointName="NetTcp" />
    </Bindings>
  </Site>
  <Site name="MailSite" packageDir="MailSite">
    <Bindings>
      <Binding name="mail" endpointName="HttpIn" hostHeader="mail.mysite.cloudapp.net" />
    </Bindings>
    <VirtualDirectory name="artifacts" />
    <VirtualApplication name="storageproxy">
      <VirtualDirectory name="packages" packageDir="Sites\storageProxy\packages"/>
    </VirtualApplication>
  </Site>
</WebRole>

Alterando a configuração de uma função

Você pode atualizar a configuração do seu serviço de nuvem enquanto ele está sendo executado no Azure, sem colocar o serviço offline. Para alterar as informações de configuração, você pode carregar um novo arquivo de configuração ou editar o arquivo de configuração no local e aplicá-lo ao serviço em execução. As seguintes alterações podem ser feitas na configuração de um serviço:

  • Alterar os valores das definições de configuração
    Quando uma definição de configuração é alterada, uma instância de função pode optar por aplicar a alteração enquanto a instância está online ou reciclar a instância normalmente e aplicar a alteração enquanto a instância estiver offline.
  • Alterando a topologia de serviço de instâncias de função
    As alterações de topologia não afetam as instâncias em execução, exceto quando uma instância está sendo removida. Todas as instâncias restantes geralmente não precisam ser recicladas; no entanto, você pode optar por reciclar instâncias de função em resposta a uma alteração de topologia.
  • Alterar a impressão digital do certificado
    Você só pode atualizar um certificado quando uma instância de função estiver offline. Se um certificado for adicionado, excluído ou alterado enquanto uma instância de função estiver online, o Azure normalmente colocará a instância offline para atualizar o certificado e colocá-lo online novamente após a conclusão da alteração.

Manipulando alterações de configuração com eventos de tempo de execução do serviço

A Biblioteca de Tempo de Execução do Azure inclui o namespace Microsoft.WindowsAzure.ServiceRuntime, que fornece classes para interagir com o ambiente do Azure a partir de uma função. A classe RoleEnvironment define os seguintes eventos que são gerados antes e depois de uma alteração de configuração:

  • Alterar evento
    Isso ocorre antes que a alteração de configuração seja aplicada a uma instância especificada de uma função, dando a você a chance de derrubar as instâncias de função, se necessário.
  • Evento alterado
    Ocorre depois que a alteração de configuração é aplicada a uma instância especificada de uma função.

Nota

Como as alterações de certificado sempre colocam as instâncias de uma função offline, elas não geram os eventos RoleEnvironment.Changing ou RoleEnvironment.Changed.

ServicePackage.cspkg

Nota

O tamanho máximo do pacote que pode ser implantado é de 600 MB

Para implantar um aplicativo como um serviço de nuvem no Azure, você deve primeiro empacotar o aplicativo no formato apropriado. Você pode usar a ferramenta de linha de comando CSPack (instalada com o SDK do Azure) para criar o arquivo de pacote como uma alternativa ao Visual Studio.

CSPack usa o conteúdo do arquivo de definição de serviço e arquivo de configuração de serviço para definir o conteúdo do pacote. O CSPack gera um arquivo de pacote de aplicativo (.cspkg) que você pode carregar no Azure usando o portal do Azure. Por padrão, o pacote é chamado [ServiceDefinitionFileName].cspkg, mas você pode especificar um nome diferente usando a /out opção de CSPack.

CSPack está localizado em
C:\Program Files\Microsoft SDKs\Azure\.NET SDK\[sdk-version]\bin\

Nota

CSPack.exe (no Windows) está disponível executando o atalho do Prompt de Comando do Microsoft Azure instalado com o SDK.

Execute o programa CSPack.exe sozinho para ver a documentação sobre todas as opções e comandos possíveis.

Gorjeta

Execute seu serviço de nuvem localmente no Emulador de Computação do Microsoft Azure, use a opção /copyonly. Esta opção copia os arquivos binários do aplicativo para um layout de diretório a partir do qual eles podem ser executados no emulador de computação.

Exemplo de comando para empacotar um serviço de nuvem

O exemplo a seguir cria um pacote de aplicativo que contém as informações para uma função Web. O comando especifica o arquivo de definição de serviço a ser usado, o diretório onde os arquivos binários podem ser encontrados e o nome do arquivo de pacote.

cspack [DirectoryName]\[ServiceDefinition]
       /role:[RoleName];[RoleBinariesDirectory]
       /sites:[RoleName];[VirtualPath];[PhysicalPath]
       /out:[OutputFileName]

Se o aplicativo contiver uma função Web e uma função de trabalho, o seguinte comando será usado:

cspack [DirectoryName]\[ServiceDefinition]
       /out:[OutputFileName]
       /role:[RoleName];[RoleBinariesDirectory]
       /sites:[RoleName];[VirtualPath];[PhysicalPath]
       /role:[RoleName];[RoleBinariesDirectory];[RoleAssemblyName]

Onde as variáveis são definidas da seguinte forma:

Variável Valor
[DirectoryName] O subdiretório sob o diretório raiz do projeto que contém o arquivo .csdef do projeto do Azure.
[ServiceDefinition] O nome do arquivo de definição de serviço. Por padrão, esse arquivo é chamado ServiceDefinition.csdef.
[OutputFileName] O nome do arquivo de pacote gerado. Normalmente, isso é definido como o nome do aplicativo. Se nenhum nome de arquivo for especificado, o pacote do aplicativo será criado como [ApplicationName].cspkg.
[Nome da Função] O nome da função, conforme definido no arquivo de definição de serviço.
[RoleBinariesDirectory] O local dos arquivos binários para a função.
[Caminho Virtual] Os diretórios físicos para cada caminho virtual definido na seção Sites da definição de serviço.
[Caminho Físico] Os diretórios físicos do conteúdo para cada caminho virtual definido no nó do site da definição de serviço.
[RoleAssemblyName] O nome do arquivo binário para a função.

Próximos passos