Como configurar e executar tarefas de arranque para um Serviço Cloud do Azure (clássico)

Importante

Serviços Cloud (clássico) foi preterido para novos clientes e será descontinuado a 31 de agosto de 2024 para todos os clientes. As novas implementações devem utilizar o novo modelo de implementação baseado em Resource Manager do Azure Serviços Cloud (suporte alargado).

Pode utilizar tarefas de arranque para efetuar operações antes de uma função ser iniciada. As operações que poderá querer executar incluem a instalação de um componente, o registo de componentes COM, a definição de chaves de registo ou o início de um processo de execução prolongada.

Nota

As tarefas de arranque não são aplicáveis a Máquinas Virtuais, apenas às funções Web e de Trabalho do Serviço Cloud.

Como funcionam as tarefas de arranque

As tarefas de arranque são ações executadas antes de as suas funções começarem e são definidas no ficheiro ServiceDefinition.csdef ao utilizar o elemento Tarefa no elemento Arranque . As tarefas de arranque frequentes são ficheiros em lote, mas também podem ser aplicações de consola ou ficheiros em lote que iniciam scripts do PowerShell.

As variáveis de ambiente transmitem informações para uma tarefa de arranque e o armazenamento local pode ser utilizado para transmitir informações de uma tarefa de arranque. Por exemplo, uma variável de ambiente pode especificar o caminho para um programa que pretende instalar e os ficheiros podem ser escritos no armazenamento local que podem ser lidos mais tarde pelas suas funções.

A tarefa de arranque pode registar informações e erros no diretório especificado pela variável de ambiente TEMP . Durante a tarefa de arranque, a variável de ambiente TEMP é resolvida para C:\Resources\temp\[guid].[ rolename]\RoleTemp diretório ao executar na cloud.

As tarefas de arranque também podem ser executadas várias vezes entre reinícios. Por exemplo, a tarefa de arranque será executada sempre que a função reciclar e a reciclagem da função pode não incluir sempre um reinício. As tarefas de arranque devem ser escritas de uma forma que permita que sejam executadas várias vezes sem problemas.

As tarefas de arranque têm de terminar com um nível de erro (ou código de saída) de zero para que o processo de arranque seja concluído. Se uma tarefa de arranque terminar com um nível de erro diferente de zero, a função não será iniciada.

Ordem de arranque da função

Segue-se uma lista do procedimento de arranque da função no Azure:

  1. A instância está marcada como A iniciar e não recebe tráfego.

  2. Todas as tarefas de arranque são executadas de acordo com o atributo taskType .

    • As tarefas simples são executadas de forma síncrona, uma de cada vez.

    • As tarefas em segundo plano e em primeiro plano são iniciadas de forma assíncrona, paralelas à tarefa de arranque.

      Aviso

      O IIS pode não estar totalmente configurado durante a fase de tarefa de arranque no processo de arranque, pelo que os dados específicos da função podem não estar disponíveis. As tarefas de arranque que requerem dados específicos de funções devem utilizar Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart.

  3. O processo de anfitrião de função é iniciado e o site é criado no IIS.

  4. O método Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart é chamado.

  5. A instância é marcada como Pronta e o tráfego é encaminhado para a instância.

  6. O método Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.Run é chamado.

Exemplo de uma tarefa de arranque

As tarefas de arranque são definidas no ficheiro ServiceDefinition.csdef , no elemento Tarefa . O atributo commandLine especifica o nome e os parâmetros do ficheiro de lote de arranque ou comando da consola, o atributo executionContext especifica o nível de privilégio da tarefa de arranque e o atributo taskType especifica como a tarefa será executada.

Neste exemplo, é criada uma variável de ambiente , MyVersionNumber, para a tarefa de arranque e definida como o valor "1.0.0.0".

ServiceDefinition.csdef:

<Startup>
    <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple" >
        <Environment>
            <Variable name="MyVersionNumber" value="1.0.0.0" />
        </Environment>
    </Task>
</Startup>

No exemplo seguinte, o ficheiro batch Startup.cmd escreve a linha "A versão atual é 1.0.0.0" no ficheiro StartupLog.txt no diretório especificado pela variável de ambiente TEMP. A EXIT /B 0 linha garante que a tarefa de arranque termina com um nível de erro de zero.

ECHO The current version is %MyVersionNumber% >> "%TEMP%\StartupLog.txt" 2>&1
EXIT /B 0

Nota

No Visual Studio, a propriedade Copiar para o Diretório de Saída do ficheiro de lote de arranque deve estar definida como Copiar Sempre para se certificar de que o ficheiro batch de arranque está corretamente implementado no seu projeto no Azure (aproot\bin para funções Web e aprovisionar funções de trabalho).

Descrição de atributos de tarefas

O seguinte descreve os atributos do elemento Tarefa no ficheiro ServiceDefinition.csdef :

commandLine - Especifica a linha de comandos para a tarefa de arranque:

  • O comando, com parâmetros opcionais da linha de comandos, que inicia a tarefa de arranque.
  • Frequentemente, este é o nome de ficheiro de um ficheiro .cmd ou .bat batch.
  • A tarefa é relativa à pasta AppRoot\Bin da implementação. As variáveis de ambiente não são expandidas para determinar o caminho e o ficheiro da tarefa. Se a expansão do ambiente for necessária, pode criar um pequeno script .cmd que chama a sua tarefa de arranque.
  • Pode ser uma aplicação de consola ou um ficheiro batch que inicia um script do PowerShell.

executionContext - Especifica o nível de privilégio para a tarefa de arranque. O nível de privilégio pode ser limitado ou elevado:

  • limitado
    A tarefa de arranque é executada com os mesmos privilégios que a função. Quando o atributo executionContext para o elemento Runtime também é limitado, são utilizados privilégios de utilizador.
  • elevado
    A tarefa de arranque é executada com privilégios de administrador. Isto permite que as tarefas de arranque instalem programas, façam alterações de configuração do IIS, efetuem alterações ao registo e outras tarefas ao nível do administrador, sem aumentar o nível de privilégio da própria função.

Nota

O nível de privilégio de uma tarefa de arranque não tem de ser o mesmo que a própria função.

taskType - Especifica a forma como uma tarefa de arranque é executada.

  • simples
    As tarefas são executadas de forma síncrona, uma de cada vez, pela ordem especificada no ficheiro ServiceDefinition.csdef . Quando uma tarefa de arranque simples termina com um nível de erro de zero, a próxima tarefa de arranque simples é executada. Se não existirem mais tarefas de arranque simples para executar, a própria função será iniciada.

    Nota

    Se a tarefa simples terminar com um nível de erro diferente de zero, a instância será bloqueada. As tarefas de arranque simples subsequentes e a própria função não serão iniciadas.

    Para garantir que o ficheiro batch termina com um nível de erro de zero, execute o comando EXIT /B 0 no final do processo de ficheiro batch.

  • background
    As tarefas são executadas de forma assíncrona, em paralelo com o arranque da função.

  • primeiro plano
    As tarefas são executadas de forma assíncrona, em paralelo com o arranque da função. A principal diferença entre um primeiro plano e uma tarefa em segundo plano é que uma tarefa em primeiro plano impede a função de reciclar ou encerrar até que a tarefa termine. As tarefas em segundo plano não têm esta restrição.

Variáveis de ambiente

As variáveis de ambiente são uma forma de transmitir informações para uma tarefa de arranque. Por exemplo, pode colocar o caminho para um blob que contém um programa para instalar ou números de porta que a sua função irá utilizar ou definições para controlar as funcionalidades da tarefa de arranque.

Existem dois tipos de variáveis de ambiente para tarefas de arranque; variáveis de ambiente estático e variáveis de ambiente com base nos membros da classe RoleEnvironment . Ambos estão na secção Ambiente do ficheiro ServiceDefinition.csdef e utilizam o atributo Variable element e name .

As variáveis de ambiente estático utilizam o atributo de valor do elemento Variable . O exemplo acima cria a variável de ambiente MyVersionNumber , que tem um valor estático de "1.0.0.0". Outro exemplo seria criar uma variável de ambiente StagingOrProduction que pode definir manualmente para valores de "teste" ou "produção" para executar diferentes ações de arranque com base no valor da variável de ambiente StagingOrProduction .

As variáveis de ambiente baseadas em membros da classe RoleEnvironment não utilizam o atributo de valor do elemento Variable . Em vez disso, o elemento subordinado RoleInstanceValue , com o valor de atributo XPath adequado, é utilizado para criar uma variável de ambiente com base num membro específico da classe RoleEnvironment . Os valores do atributo XPath para aceder a vários valores RoleEnvironment podem ser encontrados aqui.

Por exemplo, para criar uma variável de ambiente que seja "true" quando a instância está em execução no emulador de computação e "false" ao ser executada na cloud, utilize os seguintes elementos Variable e RoleInstanceValue :

<Startup>
    <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
        <Environment>

            <!-- Create the environment variable that informs the startup task whether it is running
                in the Compute Emulator or in the cloud. "%ComputeEmulatorRunning%"=="true" when
                running in the Compute Emulator, "%ComputeEmulatorRunning%"=="false" when running
                in the cloud. -->

            <Variable name="ComputeEmulatorRunning">
                <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
            </Variable>

        </Environment>
    </Task>
</Startup>

Passos seguintes

Saiba como realizar algumas tarefas de arranque comuns com o seu Serviço Cloud.

Empacote o seu Serviço Cloud.