Invocar código legado

Você quer migrar seu aplicativo para o App Engine, mas há um problema: o código do servidor está vinculado a um sistema operacional específico e a portabilidade não é das mais simples. Talvez você esteja usando um objeto COM mais antigo escrito em C++ ou Visual Basic. Ou, ainda pior: seu código-fonte não existe mais e somente o binário executável permanece.

Neste tutorial, descrevemos um padrão de arquitetura para invocar o código legado com o App Engine, o Compute Engine e o Pub/Sub e apresentamos um exemplo de implementação do padrão. Ainda que o exemplo de implementação se concentre no código específico do Windows, é possível reutilizar o padrão descrito aqui em qualquer código legado.

Objetivos

  • Saiba mais sobre um padrão de arquitetura simples para invocar código legado no Google Cloud.
  • Fazer o download e implantar um exemplo do padrão de arquitetura.

Um padrão de arquitetura para invocar o código legado

O diagrama a seguir ilustra um padrão de arquitetura usado para invocar o código herdado do seu aplicativo do App Engine.

Padrão de arquitetura para invocar o código legado
Figura 1: padrão de arquitetura para invocar o código legado

Essa arquitetura funciona da seguinte forma:

  1. O cliente da Web envia uma solicitação ao aplicativo do App Engine, que grava a solicitação em um tópico de Pub/Sub.

  2. Um wrapper de código puxa a solicitação do tópico.

  3. O wrapper de código invoca o código legado.

  4. O código legado retorna o resultado ao wrapper. Em seguida, o wrapper retorna o resultado ao aplicativo do App Engine, que o retorna ao cliente da Web.

Exemplo de implementação do padrão

Há uma implementação do padrão anterior no GitHub. Esse aplicativo de exemplo toma uma string de caracteres como entrada, a processa usando os componentes descritos no padrão e retorna uma versão em letras maiúsculas. O código do aplicativo consiste em dois componentes principais:

  • O aplicativo do Google App Engine, que publica as solicitações recebidas em um tópico de Pub/Sub.
  • O wrapper de código, que se inscreve no tópico do Pub/Sub e, quando recebe uma solicitação, envia-a para algum código legado do Windows.

Nessa implementação, o wrapper é um serviço do Windows escrito em C#. Esse serviço de wrapper está configurado para ser executado quando a instância é iniciada e pode invocar qualquer script ou binário no C#. Tanto o serviço de wrapper quanto o binário invocado residem em uma instância do Compute Engine que executa o Windows Server 2012 R2.

A interface do usuário do aplicativo é semelhante a esta:

Interface do usuário do aplicativo Shout
Figura 2: interface do usuário do aplicativo Shout

Se você digitar a palavra "mars" e clicar em Enviar, o resultado será este:

Resultado do aplicativo Shout
Figura 3: resultado do aplicativo Shout

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:

  • Uma instância do Compute Engine com uma licença do Windows Server 2012
  • Serviços de Pub/Sub

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem ser qualificados para uma avaliação gratuita.

Pré-requisitos

Para este aplicativo de exemplo, partimos dos seguintes pressupostos:

Conseguir o código-fonte

Faça o download do código de exemplo aqui e descompacte-o. Se preferir, você poderá clonar o repositório do projeto do GitHub executando o seguinte comando:

C:\> git clone https://github.com/GoogleCloudPlatform/pubsub-shout-csharp.git

Instale as dependências

No seu terminal de linha de comando, navegue até a pasta appengine-python-flask na cópia local do repositório pubsub-shout-csharp e execute o seguinte:

C:\> pip install -r requirements.txt -t lib

Crie uma instância do Compute Engine

Crie a instância do Google Compute Engine em que o wrapper de código e o código legado serão executados:

  1. No Console do Cloud, acesse a página Criar uma nova instância.

  2. Na seção Disco de inicialização, clique em Alterar.

  3. Na guia Imagens públicas, selecione o sistema operacional Windows Server e a versão 2012 R2 Datacenter Edition.

  4. Clique em Salvar para confirmar as opções do disco de inicialização.

  5. Na seção Firewalls, permita o tráfego HTTP e HTTPS.

  6. Na seção Acesso do projeto, permita o acesso total da API a todos os serviços do Google Cloud no seu projeto.

  7. Clique em Gerenciamento, segurança, discos, rede, locatário único e na guia Rede para acessar as opções avançadas.

  8. Na seção Tags de rede, adicione a tag rdp-tag. Posteriormente no tutorial, você criará uma regra de firewall que permite o acesso RDP externo a todas as instâncias marcadas com esta tag.

  9. Para começar a criar sua nova instância, clique em Criar.

Depois de criar a instância, adicione um usuário padrão do Windows a ela:

  1. No Console do Cloud, acesse a página instâncias de VM.

  2. Clique no nome da instância recém-implantada.

  3. Na página da instância, clique no botão Definir senha do Windows.

  4. Para criar a conta de usuário na instância, na caixa de diálogo Definir nova senha do Windows, adicione seu nome de usuário e clique em Definir.

  5. Anote a senha fornecida e feche a caixa de diálogo.

Em seguida, crie uma regra de firewall para ativar o acesso RDP à instância:

  1. No Console do Cloud, acesse a página Criar uma regra de firewall.

  2. Preencha o formulário da seguinte maneira:

    • Nome: rdp-rule
    • Intervalos de IP de origem: 0.0.0.0/0
    • Portas e protocolos permitidos: tcp:3389
    • Tags de meta: rdp-tag
  3. Para criar a regra de firewall, clique em Criar.

Criar e implantar o wrapper do código

Para criar o serviço de wrapper de código:

  1. No Console do Cloud, acesse a página credenciais.

  2. Clique em Novas credenciais e selecione a Chave da conta de serviço.

  3. Na página Criar chave da conta de serviço, preencha o formulário da seguinte maneira:

    • Conta de serviço: nova conta de serviço
    • Nome: um nome de sua escolha
    • ID da conta de serviço: uma identificação de sua escolha
    • Tipo de chave: JSON
  4. Clique em Criar. Após alguns segundos, um arquivo de chave JSON é enviado para o computador local.

  5. Na máquina local, crie uma nova variável de ambiente chamada GOOGLE_APPLICATION_CREDENTIALS e configure-a como o caminho absoluto do arquivo de chave JSON.

  6. Acesse a pasta windows-csharp na sua cópia local do repositório pubsub-shout-csharp.

  7. Abra ShoutService.sln no Visual Studio 2012 ou posterior.

  8. Edite ShoutLib/Constants.cs, defina a variável ProjectId como seu ID do projeto do https://console.cloud.google.com/ e salve.

  9. No menu Compilar, clique em Compilar solução para criar o aplicativo.

Depois de criar o serviço de wrapper de código, copie-o para a instância do Compute Engine:

  1. Estabeleça uma conexão entre o computador remoto e a instância criada anteriormente no tutorial.

  2. Na máquina local, no Windows Explorer, acesse a pasta ShoutService\bin na pasta windows-csharp.

  3. Copie a pasta Release do Windows Explorer e cole-a na janela da conexão remota para copiar a pasta para a instância. A pasta Release contém o wrapper e o serviço Shout.

Em seguida, permita que o Gerenciador de Controle de Serviços do Windows comece, pare e interaja com o serviço concedendo permissões apropriadas ao SERVIÇO LOCAL, uma conta de usuário predefinida do Windows usada pelo Gerenciador de Controle de Serviços:

  1. No Windows Explorer, acesse a pasta Release.

  2. Clique com o botão direito na pasta para abrir o menu de contexto e, em seguida, clique em Propriedades.

  3. Na caixa de diálogo Propriedades de Versão, clique na guia Segurança.

  4. Clique em Editar.

  5. Na caixa de diálogo Permissões para versão, clique em Adicionar.

  6. Na caixa de diálogo Selecionar usuários ou grupos, em Ativar os nomes dos objetos para seleção, digite LOCAL SERVICE e clique em OK.

  7. Na caixa de diálogo Permissões para versão, clique em LOCAL SERVICE.

  8. Em Permissões para LOCAL SERVICE, verifique se as seguintes permissões estão ativadas:

    • Ler e executar
    • Listar conteúdo da pasta
    • Leitura
  9. Clique em OK.

Por último, instale o serviço de wrapper de código:

  1. Na máquina remota, abra o terminal da linha de comando como Administrador e navegue até a pasta Release.

  2. Instale o serviço de wrapper de código:

    C:\> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe ShoutService.exe
    

Implantar o aplicativo do App Engine

Para implantar o aplicativo do App Engine:

  1. Na sua máquina local, no seu terminal de linha de comando, navegue até a pasta appengine-python-flask em sua cópia local do repositório pubsub-shout-csharp.

  2. Implante o aplicativo.

    C:\> appcfg.py -A <your_project_id> -V 1 --oauth2 update .
  3. Autentique o aplicativo, quando solicitado.

  4. Ative a API Pub/Sub.

    Ative a API

  5. Para inicializar o aplicativo, acesse o seguinte URL no seu navegador da Web:

    https://<your_project_id>.appspot.com/init

    Quando você visita esse URL, o aplicativo do App Engine cria um tópico do Pub/Sub e, em seguida, inscreve o serviço de wrapper de código no tópico.

Parabéns! Agora seu aplicativo está ativo. Acesse <your_project_id>.appspot.com para vê-lo em ação.

Limpar

Depois de concluir o tutorial "Como invocar código legado", limpe os recursos criados no Google Cloud para que não consumam sua cota e você não seja cobrado por eles no futuro. Veja como excluir e desativar esses recursos nas seções a seguir.

Excluir seu projeto do Google Cloud

A maneira mais fácil de evitar cobranças é excluir o projeto criado para o tutorial.

Para excluir o projeto, faça o seguinte:

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar a página "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir a instância do Compute Engine

Para excluir uma instância do Compute Engine, faça o seguinte:

  1. No Console do Cloud, acesse a página Instâncias de VM.

    Acessar a página "Instâncias de VMs"

  2. Marque a caixa de seleção para instância que você quer excluir.
  3. Clique em Excluir para remover a instância.

A seguir