Primeiros passos com o Go no Compute Engine


Neste tutorial, você aprenderá como começar a usar o Compute Engine. Para segui-lo, implante um app Go da Web "Hello World" no Compute Engine. Para receber ajuda com os primeiros passos no App Engine, consulte o ambiente padrão do App Engine.

Objetivos

  • Usar o Cloud Shell para fazer o download e implantar um app de amostra "Hello World".
  • Usar o Cloud Build para criar um app de amostra Hello World.
  • Implantar um app de amostra "Hello World" em uma única instância do Compute Engine.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

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 estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs Compute Engine and Cloud Build.

    Ative as APIs

  5. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  6. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  7. Ative as APIs Compute Engine and Cloud Build.

    Ative as APIs

  8. No console do Google Cloud, abra o app no Cloud Shell.

    Acesse o Cloud Shell

    O Cloud Shell oferece acesso de linha de comando aos seus recursos de nuvem diretamente no navegador.

  9. Se você concordar em clonar o repositório, clique em Confirmar para fazer o download do código de amostra e passar para o diretório do app.

  10. No Cloud Shell, configure a CLI gcloud para usar seu novo projeto do Google Cloud:
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    

Como executar o app no Cloud Shell

  1. No Cloud Shell, inicie um servidor da Web local:

    go build -o app
    ./app
    
  2. No Cloud Shell, clique em Visualização da Web e selecione Visualizar na porta 8080. Uma nova janela será aberta com o app em execução.

    No navegador, você vê Hello, World!.

  3. Quando estiver pronto para prosseguir, pare o servidor da Web local pressionando Control+C no Cloud Shell.

Implantar em uma instância única

Nesta seção, mostramos como executar uma única instância do aplicativo no Compute Engine.

Implantação de instância única.

No Cloud Shell, é possível implantar em uma máquina virtual (VM, na sigla em inglês) de instância única do Compute Engine que executa o aplicativo.

Usar o Cloud Build para criar o aplicativo

O Cloud Build é usado para criar o aplicativo, compactá-lo em um arquivo tar e fazer o upload dele em um bucket do Cloud Storage. buckets são os contêineres básicos que armazenam seus dados no Cloud Storage.

  1. Na janela de terminal, crie um bucket do Cloud Storage, em que YOUR_BUCKET_NAME representa o nome do bucket:

    gsutil mb gs://YOUR_BUCKET_NAME
    

    Você pode escolher qualquer nome para o bucket do Cloud Storage. Recomendamos dar ao bucket o mesmo nome do ID do projeto. Como os nomes de buckets precisam ser exclusivos em todo o Google Cloud, talvez você não consiga usar o ID do projeto como o nome do bucket.

  2. Inicie o processo do Cloud Build:

    gcloud builds submit --substitutions=_DEPLOY_DIR=gs://YOUR_BUCKET_NAME,_DEPLOY_FILENAME=app.tar.gz
    

    O comando gcloud builds submit usa --substitutions para configurar o local em que o arquivo tar resultante é enviado. Posteriormente, o arquivo tar será salvo para a instância do Compute Engine.

    O Cloud Build usa um arquivo de configuração YAML para definir as etapas exigidas pela versão.

    steps:
      # Print the Go version being used.
      - name: 'mirror.gcr.io/library/golang'
        args: ['go', 'version']
      # Make a deploy directory we'll tar after building the app.
      - name: 'debian'
        args: ['mkdir', '-p', 'deploy/etc/systemd/system/', 'deploy/usr/bin']
      # Build the app.
      - name: 'mirror.gcr.io/library/golang'
        env: [
          'GO111MODULE=on',
          'GOPROXY=https://proxy.golang.org,direct',
          'GOOS=linux',
          'GOARCH=amd64'
        ]
        args: ['go', 'build', '-o', 'deploy/usr/bin/app', '.']
      # Copy the systemd service file into the deploy directory.
      - name: 'debian'
        args: ['cp', 'my-app.service', 'deploy/etc/systemd/system/']
      # Compress the deploy directory.
      - name: 'debian'
        args: ['tar', '-czf', '${_DEPLOY_FILENAME}', '-C', './deploy', '.']
    # Upload the tarball to Cloud Storage.
    artifacts:
      objects:
        location: '${_DEPLOY_DIR}'
        paths: ['${_DEPLOY_FILENAME}']

Usar um script para inicializar uma instância

É necessário instruir sua instância para que ela faça o download e execute o código. Isso pode ser feito por meio de um script de inicialização que é executado sempre que a instância for iniciada ou reiniciada.

Um script de inicialização é executado quando uma instância é inicializada pela primeira vez.

set -ex

# Install logging monitor. The monitor will automatically pickup logs sent to syslog.
curl "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" --output google-fluentd-install.sh
checksum=$(sha256sum google-fluentd-install.sh | awk '{print $1;}')
if [ "$checksum" != "ec78e9067f45f6653a6749cf922dbc9d79f80027d098c90da02f71532b5cc967" ]; then
    echo "Checksum does not match"
    exit 1
fi
chmod +x google-fluentd-install.sh && ./google-fluentd-install.sh
service google-fluentd restart &

APP_LOCATION=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/app-location" -H "Metadata-Flavor: Google")
gsutil cp "$APP_LOCATION" app.tar.gz
tar -xzf app.tar.gz

# Start the service included in app.tar.gz.
service my-app start

Estas tarefas são executadas no script de inicialização:

  • Instala o agente do Cloud Logging e o configura para monitorar os registros do aplicativo.

  • Faz o download e extrai o arquivo tar de implantação.

  • Inicia um serviço systemd para executar o aplicativo.

Criar e configurar uma instância do Compute Engine

  1. Crie uma instância do Compute Engine:

    Linux/macOS

    gcloud compute instances create my-app-instance \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --machine-type=g1-small \
    --scopes userinfo-email,cloud-platform \
    --metadata-from-file startup-script=startup-script.sh \
    --metadata app-location="gs://YOUR_BUCKET_NAME/app.tar.gz" \
    --zone YOUR_ZONE \
    --tags http-server
    

    Substitua YOUR_ZONE por uma zona de desenvolvimento. Por exemplo, us-central1-a. Para mais informações sobre regiões e zonas, consulte Geografia e regiões.

    A sinalização --metadata app-location informa ao script de inicialização onde fazer o download do arquivo tar do aplicativo.

    Windows

    gcloud compute instances create my-app-instance ^
    --image-family=debian-10 ^
    --image-project=debian-cloud ^
    --machine-type=g1-small ^
    --scopes userinfo-email,cloud-platform ^
    --metadata-from-file startup-script=startup-script.sh ^
    --metadata app-location="gs://YOUR_BUCKET_NAME/app.tar.gz" ^
    --zone YOUR_ZONE ^
    --tags http-server
    

    Substitua YOUR_ZONE por uma zona de desenvolvimento. Por exemplo, us-central1-a. Para mais informações sobre regiões e zonas, consulte Geografia e regiões.

    A sinalização --metadata app-location informa ao script de inicialização onde fazer o download do arquivo tar do aplicativo.

    Isso cria uma nova instância e permite que ela acesse os serviços do Google Cloud e execute o script de inicialização. O nome da instância é my-app-instance.

  2. Verifique o andamento da criação da instância:

    gcloud compute instances get-serial-port-output my-app-instance --zone YOUR_ZONE
    

    Quando o script de inicialização estiver concluído, você verá a seguinte mensagem:

    startup-script: INFO Finished running startup scripts.
    
  3. Crie uma regra de firewall para permitir o tráfego para a instância:

    gcloud compute firewall-rules create default-allow-http-80 \
        --allow tcp:80 \
        --source-ranges 0.0.0.0/0 \
        --target-tags http-server \
        --description "Allow port 80 access to http-server"
    

  4. Receba o endereço IP externo da instância:

    gcloud compute instances list
    
  5. Para ver a execução do aplicativo, insira este URL no navegador:

    http://YOUR_INSTANCE_IP
    

    Substitua YOUR_INSTANCE_IP pelo endereço IP externo da instância.

Gerenciar e monitorar uma instância

Use o console do Google Cloud para monitorar e gerenciar a instância.

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

    Acessar instâncias de VM

  2. Na lista de instâncias de máquina virtual, clique em SSH na linha da instância à qual você quer se conectar.
  3. Para visualizar todos os registros gerados pelos recursos do Compute Engine, acesse a página Análise de registros. Acessar a Análise de registros

    O Cloud Logging é configurado automaticamente para reunir registros de vários serviços comuns, incluindo o syslog.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Exclua o projeto

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

    Acessar "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 recursos individuais

gcloud compute instances delete my-app-instance --zone=YOUR_ZONE --delete-disks=all
gcloud compute firewall-rules delete default-allow-http-80

A seguir