Implantar e executar um contêiner com o Cloud Run no Node.js

O Cloud Run é uma plataforma de computação gerenciada onde você executa contêineres sem estado que podem ser invocados usando solicitações HTTP. O Cloud Run não tem servidor. Ele elimina a necessidade de gerenciamento de infraestrutura para que você possa se concentrar no que mais importa: criar apps incríveis. Ele foi criado com base no Knative, permitindo que você execute seus contêineres com o Cloud Run (totalmente gerenciado) ou o Cloud Run para Anthos. O objetivo deste codelab é criar uma imagem de contêiner e implantá-la no Cloud Run.

Pré-requisitos

N/A

Configuração de ambiente autoguiada

Se você ainda não tem uma Conta do Google (Gmail ou Google Apps), crie uma. Faça login no Console do Google Cloud Platform (console.cloud.google.com) e crie um projeto:

Captura de tela de 2016-02-10 12:45:26.png

Lembre-se do código do projeto, um nome exclusivo em todos os projetos do Google Cloud. O nome acima já foi escolhido e não servirá para você. Faremos referência a ele mais adiante neste codelab como PROJECT_ID.

Em seguida, ative o faturamento no console do Cloud para usar os recursos do Google Cloud.

A execução por meio deste codelab terá um custo baixo, mas poderá ser mais se você decidir usar mais recursos ou se deixá-los em execução. Consulte a seção "limpeza" no final deste documento.

Novos usuários do Google Cloud Platform têm direito a uma avaliação sem custo financeiro de US$300.

Cloud Shell

Embora o Google Cloud possa ser operado remotamente em seu laptop, você vai usar o Cloud Shell, um ambiente de linha de comando executado no Google Cloud.

O Cloud Shell é uma máquina virtual com base em Debian que contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal permanente de 5 GB, além de ser executada no Google Cloud, o que aprimora o desempenho e a autenticação da rede. Isso significa que tudo que você precisa para este codelab é um navegador (sim, funciona em um Chromebook).

Para ativar o Google Cloud Shell, clique no botão no canto superior direito do console do desenvolvedor. Leva apenas alguns instantes para provisionar e se conectar ao ambiente:

activateCloudShell.png

Clique no botão "Iniciar Cloud Shell":

Screen Shot 2017-06-14 às 10.13.43 PM.png

Depois de se conectar ao Cloud Shell, você já estará autenticado e o projeto estará configurado com seu PROJECT_ID :

gcloud auth list

Resposta ao comando

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Resposta ao comando

[core]
project = <PROJECT_ID>

O Cloud Shell também define algumas variáveis de ambiente por padrão, o que pode ser útil ao executar comandos futuros.

echo $GOOGLE_CLOUD_PROJECT

Resposta ao comando

<PROJECT_ID>

Se, por algum motivo, o projeto não estiver definido, basta emitir o seguinte comando :

gcloud config set project <PROJECT_ID>

Quer encontrar seu PROJECT_ID? Veja qual ID você usou nas etapas de configuração ou procure-o no painel do console:

Project_ID.png

IMPORTANTE: por fim, defina a zona padrão e a configuração do projeto:

gcloud config set compute/zone us-central1-f

É possível escolher uma variedade de zonas diferentes. Saiba mais na documentação sobre Zonas e Regiões.

Ative a API Cloud Run

No Cloud Shell, ative a API Cloud Run.

gcloud services enable run.googleapis.com

Uma mensagem semelhante a esta vai aparecer:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

Você vai criar um app Node.js simples, baseado no Express, que responde a solicitações HTTP.

Para criar o app, use o Cloud Shell para criar um diretório chamado helloworld-nodejs e mude para ele.

mkdir helloworld-nodejs
cd helloworld-nodejs

Crie um arquivo package.json com o seguinte conteúdo:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

O arquivo acima contém principalmente um comando de script de início e uma dependência no framework Express para aplicativos da Web.

No mesmo diretório, crie um arquivo index.js e copie o seguinte conteúdo nele:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

Esse código cria um servidor da Web básico que realiza detecções na porta definida pela variável de ambiente PORT. O app está pronto para ser conteinerizado, testado e enviado ao Container Registry.

Para contentorizar o app de exemplo, crie um arquivo chamado Dockerfile no mesmo diretório dos arquivos de origem e copie o seguinte conteúdo nele:

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

Crie a imagem do contêiner usando o Cloud Build. Para isso, execute o comando a seguir no diretório que contém seu Dockerfile:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT é uma variável de ambiente que contém o ID do projeto do Google Cloud ao executar no Cloud Shell. Você também pode consegui-lo executando gcloud config get-value project.

Depois de enviada para o registro, você vai ver uma mensagem SUCCESS contendo o nome da imagem (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld). A imagem é armazenada no Container Registry e pode ser reutilizada, se você quiser.

Liste todas as imagens do contêiner associadas ao projeto atual usando este comando:

gcloud container images list

Se você quiser executar e testar o app localmente no Cloud Shell, inicie-o usando este comando padrão do docker:

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

No Cloud Shell, clique em Visualização da Web e selecione Visualizar na porta 8080.

Isso abre uma janela do navegador com a mensagem Hello World!

Você também pode usar curl localhost:8080.

Para implantar seu app conteinerizado no Cloud Run, use o seguinte comando. Ajuste-o ao nome correto da imagem do app que você criou ou use a imagem predefinida gcr.io/cloudrun/hello:

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

A opção de implantação --allow-unauthenticated permite acessar o app sem autenticação. A opção de implantação --platform managed \ significa que você está solicitando o ambiente totalmente gerenciado, não a infraestrutura do Kubernetes via Anthos.

Aguarde alguns instantes até a implantação terminar. Quando terminar, a linha de comando vai mostrar o URL do serviço.

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

Agora você pode acessar o contêiner implantado abrindo o URL de serviço em um navegador da Web:

O Cloud Run escalona de maneira automática e horizontal a imagem do contêiner para processar as solicitações recebidas, depois reduz o escalonamento quando a demanda diminui. Você paga apenas pela CPU, memória e rede consumidas durante o processamento da solicitação.

O Cloud Run não cobra quando o serviço não está em uso, mas você ainda pode receber cobranças pelo armazenamento da imagem de contêiner criada.

Para evitar cobranças, exclua seu projeto do Google Cloud para interromper o faturamento de todos os recursos usados ou apague sua imagem helloworld usando este comando:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

Para excluir o serviço Cloud Run, use este comando:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

Parabéns! Você implantou um app empacotado em uma imagem de contêiner no Cloud Run.

Saiba mais

Uma boa próxima etapa seria conferir o Guia de início rápido: implantar no Cloud Run for Anthos no Google Cloud.

Para mais informações sobre como criar um contêiner HTTP sem estado compatível com o Cloud Run a partir do código-fonte e enviá-lo para o Container Registry, consulte os seguintes recursos:

Para saber mais sobre o Knative, o projeto de código aberto subjacente, consulte Knative (em inglês).