Implantar um aplicativo JavaScript no Cloud Run com o Cloud SQL para PostgreSQL

1. Visão geral

O Cloud Run é uma plataforma sem servidor totalmente gerenciada que permite executar contêineres sem estado que podem ser invocados por solicitações HTTP. Este codelab vai mostrar como conectar um aplicativo Node.js no Cloud Run a um banco de dados Cloud SQL para PostgreSQL.

O que você vai aprender

Neste laboratório, você vai aprender a:

  • Crie uma instância do Cloud SQL para PostgreSQL (configurada para usar o Private Service Connect).
  • Implantar um aplicativo no Cloud Run que se conecte ao seu banco de dados do Cloud SQL
  • Usar o Gemini Code Assist para adicionar funcionalidades ao seu app

O que você vai aprender

  • Crie uma instância do Cloud SQL para PostgreSQL (configurada para usar o Private Service Connect).
  • Implantar um aplicativo no Cloud Run que se conecte ao seu banco de dados do Cloud SQL
  • Usar o Gemini Code Assist para adicionar funcionalidades ao seu app

2. Pré-requisitos

  1. Se você ainda não tem uma Conta do Google, crie uma.
    • Use uma conta pessoal em vez de uma conta de trabalho ou escolar. As contas escolares e de trabalho podem ter restrições que impedem a ativação das APIs necessárias para este laboratório.

3. Configurar o projeto

  1. Faça login no Console do Google Cloud.
  2. Ative o faturamento no Console do Cloud.
    • A conclusão deste laboratório deve custar menos de US $1 em recursos do Cloud.
    • Siga as etapas no final deste laboratório para excluir recursos e evitar cobranças.
    • Novos usuários estão qualificados para o teste sem custo financeiro de US$300.
  3. Crie um novo projeto ou escolha reutilizar um projeto atual.

4. Abrir editor do Cloud Shell

  1. Acesse o editor do Cloud Shell.
  2. Se o terminal não aparecer na parte de baixo da tela, abra-o:
    • Clique no menu de navegação Ícone do menu de navegação.
    • Clique em Terminal.
    • Clique em Novo Terminal.Abrir um novo terminal no editor do Cloud Shell
  3. No terminal, defina seu projeto com este comando:
    • Formato:
      gcloud config set project [PROJECT_ID]
      
    • Exemplo:
      gcloud config set project lab-project-id-example
      
    • Se você não souber o ID do projeto:
      • É possível listar todos os IDs de projeto com:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Definir o ID do projeto no terminal do Editor do Cloud Shell
  4. Se for preciso autorizar, clique em Autorizar para continuar. Clique para autorizar o Cloud Shell
  5. Você vai receber esta mensagem:
    Updated property [core/project].
    
    Se você receber uma WARNING e receber uma solicitação Do you want to continue (Y/N)?, provavelmente inseriu o ID do projeto incorretamente. Pressione N, pressione Enter e tente executar o comando gcloud config set project novamente.

5. Ativar APIs

No terminal, ative as APIs:

gcloud services enable \
  compute.googleapis.com \
  sqladmin.googleapis.com \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  networkconnectivity.googleapis.com \
  servicenetworking.googleapis.com \
  cloudaicompanion.googleapis.com

Se for preciso autorizar, clique em Autorizar para continuar. Clique para autorizar o Cloud Shell

Esse comando pode levar alguns minutos para ser concluído, mas vai gerar uma mensagem de sucesso semelhante a esta:

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.

6. Configurar uma conta de serviço

Crie e configure uma conta de serviço do Google Cloud para ser usada pelo Cloud Run, de modo que ela tenha as permissões corretas para se conectar ao Cloud SQL.

  1. Execute o comando gcloud iam service-accounts create da seguinte maneira para criar uma nova conta de serviço:
    gcloud iam service-accounts create quickstart-service-account \
      --display-name="Quickstart Service Account"
    
  2. Execute o comando gcloud projects add-iam-policy-binding da seguinte maneira para adicionar o papel de Gravador de registros à conta de serviço do Google Cloud que você acabou de criar.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

7. Criar uma instância do Cloud SQL

  1. Crie uma política de conexão de serviço para permitir a conectividade de rede do Cloud Run ao Cloud SQL com o Private Service Connect.
    gcloud network-connectivity service-connection-policies create quickstart-policy \
        --network=default \
        --project=${GOOGLE_CLOUD_PROJECT} \
        --region=us-central1 \
        --service-class=google-cloud-sql \
        --subnets=https://www.googleapis.com/compute/v1/projects/${GOOGLE_CLOUD_PROJECT}/regions/us-central1/subnetworks/default
    
  2. Gerar uma senha exclusiva para seu banco de dados
    export DB_PASSWORD=$(openssl rand -base64 20)
    
  3. Execute o comando gcloud sql instances create para criar uma instância do Cloud SQL.
    gcloud sql instances create quickstart-instance \
        --project=${GOOGLE_CLOUD_PROJECT} \
        --root-password=${DB_PASSWORD} \
        --database-version=POSTGRES_17 \
        --tier=db-perf-optimized-N-2 \
        --region=us-central1 \
        --ssl-mode=ENCRYPTED_ONLY \
        --no-assign-ip \
        --enable-private-service-connect \
        --psc-auto-connections=network=projects/${GOOGLE_CLOUD_PROJECT}/global/networks/default
    

Isso pode demorar alguns minutos.

  1. Execute o comando gcloud sql databases create para criar um banco de dados do Cloud SQL no quickstart-instance.
    gcloud sql databases create quickstart_db \
      --instance=quickstart-instance
    

8. Preparar a inscrição

Prepare um aplicativo Node.js que responda a solicitações HTTP.

  1. No Cloud Shell, crie um novo diretório chamado helloworld e mude para ele:
    mkdir helloworld
    cd helloworld
    
  2. Inicialize um arquivo package.json como um módulo.
    npm init -y
    npm pkg set type="module"
    npm pkg set main="index.mjs"
    npm pkg set scripts.start="node index.mjs"
    
  3. Instale o pg para interagir com o banco de dados PostgreSQL.
    npm install pg
    
  4. Instale o Express para aceitar solicitações HTTP de entrada.
    npm install express
    
  5. Crie um arquivo index.mjs com o código do aplicativo. Esse código pode:
    • Aceitar solicitações HTTP
    • Conecte-se ao banco de dados
    • Armazenar o horário da solicitação HTTP no banco de dados
    • Retornar os horários das últimas cinco solicitações
    Execute o comando a seguir no Cloud Shell:
    cat > index.mjs << "EOF"
    import express from 'express';
    import pg from 'pg';
    const { Pool } = pg;
    
    const pool = new Pool({
      host: process.env.DB_HOST,
      user: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
      ssl: {
        require: true,
        rejectUnauthorized: false, // required for self-signed certs
        // https://node-postgres.com/features/ssl#self-signed-cert
      }
    });
    
    const app = express();
    
    app.get('/', async (req, res) => {
      await pool.query('INSERT INTO visits(created_at) VALUES(NOW())');
      const {rows} = await pool.query('SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5');
      console.table(rows); // prints the last 5 visits
      res.send(rows);
    });
    
    const port = parseInt(process.env.PORT) || 8080;
    app.listen(port, async () => {
      console.log('process.env: ', process.env);
      await pool.query(`CREATE TABLE IF NOT EXISTS visits (
        id SERIAL NOT NULL,
        created_at timestamp NOT NULL,
        PRIMARY KEY (id)
      );`);
      console.log(`helloworld: listening on port ${port}`);
    });
    
    EOF
    

Esse código cria um servidor da Web básico que detecta na porta definida pela variável de ambiente PORT. O aplicativo está pronto para ser implantado.

9. Implantar o aplicativo no Cloud Run

  1. Execute o comando gcloud projects add-iam-policy-binding da seguinte maneira para adicionar o papel Usuário da rede à conta de serviço do Cloud Run para o serviço do Cloud Run que você está prestes a criar.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member "serviceAccount:service-$(gcloud projects describe ${GOOGLE_CLOUD_PROJECT} --format="value(projectNumber)")@serverless-robot-prod.iam.gserviceaccount.com" \
    --role "roles/compute.networkUser"
    
  1. Execute o comando abaixo para implantar seu aplicativo no Cloud Run:
    gcloud run deploy helloworld \
      --region=us-central1 \
      --source=. \
      --set-env-vars DB_NAME="quickstart_db" \
      --set-env-vars DB_USER="postgres" \
      --set-env-vars DB_PASSWORD=${DB_PASSWORD} \
      --set-env-vars DB_HOST="$(gcloud sql instances describe quickstart-instance --project=${GOOGLE_CLOUD_PROJECT} --format='value(settings.ipConfiguration.pscConfig.pscAutoConnections.ipAddress)')" \
      --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --network=default \
      --subnet=default \
      --allow-unauthenticated
    
  2. Se necessário, pressione Y e Enter para confirmar que você quer continuar:
    Do you want to continue (Y/n)? Y
    

Após alguns minutos, o aplicativo vai fornecer um URL para você acessar.

Navegue até o URL para conferir o aplicativo em ação. Toda vez que você visitar o URL ou atualizar a página, as cinco visitas mais recentes serão retornadas como JSON.

10. Parabéns

Neste laboratório, você aprendeu a:

  • Crie uma instância do Cloud SQL para PostgreSQL (configurada para usar o Private Service Connect).
  • Implantar um aplicativo no Cloud Run que se conecte ao seu banco de dados do Cloud SQL
  • Usar o Gemini Code Assist para adicionar funcionalidades ao seu app

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto ou mantenha o projeto e exclua cada um dos recursos. Se você quiser excluir o projeto inteiro, execute:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}