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

1. Antes de começar

6a5cf23c8e20491f.png

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. Assim, você pode se concentrar no que mais importa: criar apps incríveis. Ele foi criado com base no Knative, o que permite a você executar os contêineres com o Cloud Run (totalmente gerenciado) ou o Cloud Run for Anthos. O objetivo deste codelab é criar uma imagem de contêiner e implantá-la no Cloud Run.

Pré-requisitos

N/A

2. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Cloud e crie um novo projeto ou reutilize um existente. Crie uma se você ainda não tiver uma conta do Gmail ou do G Suite.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

  1. Em seguida, será necessário ativar o faturamento no Console do Cloud para usar os recursos do Google Cloud.

A execução deste codelab não será muito cara, se for o caso. Siga todas as instruções na seção "Limpeza", que orienta você sobre como encerrar recursos para não incorrer em cobranças além deste tutorial. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Cloud Shell

Embora o Google Cloud possa ser operado remotamente em um laptop, você 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 persistente de 5 GB, além de ser executada no Google Cloud. Isso 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).

  1. Para ativar o Cloud Shell no Console do Cloud, basta clicar em Ativar o Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q. Leva apenas alguns instantes para provisionar e se conectar ao ambiente.

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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>

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 do Cloud:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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>
  1. 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. Para mais informações, consulte Regiões e zonas.

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.

3. Criar o app de exemplo

Você criará um app Node.js simples e baseado no Express para responder a solicitações HTTP.

Para criar seu app, use o Cloud Shell para criar um novo diretório chamado helloworld-nodejs e acesse-o.

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 inicialização e uma dependência no framework Express para apps 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 detecta na porta definida pela variável de ambiente PORT. Agora o app está pronto para conteinerização, teste e upload no Container Registry.

4. Contentorize seu app e o envie para o Container Registry

Para conteinerizar o app de exemplo, crie um novo arquivo chamado Dockerfile no mesmo diretório dos arquivos de origem e copie o conteúdo a seguir 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 sua imagem de contêiner usando o Cloud Build. Para isso, execute o seguinte comando no diretório que contém o 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 quando executada no Cloud Shell. Você também pode consegui-lo executando gcloud config get-value project.

Depois de enviada ao registro, você 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.

Use este comando para listar todas as imagens do contêiner associadas ao projeto atual:

gcloud container images list

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

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

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

3618ca3a4a135570.png

Uma janela do navegador será aberta com a mensagem Hello World!

a0307f34cacf9e6a.png

Também é possível simplesmente usar curl localhost:8080.

5. Implantar no Cloud Run

Para implantar seu app conteinerizado no Cloud Run, use o seguinte comando. Não se esqueça de ajustar o nome da imagem correta do app que você criou ou usar a imagem pré-criada 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 que você acesse o app sem autenticação. A opção de implantação --platform managed \ significa que você está solicitando o ambiente totalmente gerenciado, e 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 do serviço em um navegador da Web:

63260b4d3aee42b8.png

O Cloud Run escalona de forma automática e horizontal a imagem do contêiner para lidar com 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.

6. Limpar

Embora o Cloud Run não gere custos quando o serviço não está em uso, você ainda pode receber cobranças pelo armazenamento da imagem do contêiner que você criou.

Exclua seu projeto do Google Cloud para evitar cobranças, o que interromperá o faturamento de todos os recursos usados nele, ou simplesmente exclua 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

7. Parabéns

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

Saiba mais

Uma boa próxima etapa é 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 adequado para 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.