1. Visão geral
O conector Node.js do Cloud SQL é a maneira mais fácil de conectar o aplicativo Node.js com segurança ao banco de dados do Cloud SQL. O Cloud Run é uma plataforma sem servidor totalmente gerenciada que permite executar contêineres sem estado que podem ser invocados usando solicitações HTTP. Este codelab mostra como conectar um aplicativo Node.js no Cloud Run a um banco de dados do Cloud SQL para PostgreSQL de forma segura com uma conta de serviço usando a autenticação do IAM.
O que você vai aprender
Você vai aprender a:
- Criar uma instância do Cloud SQL para o banco de dados PostgreSQL
- Implantar um aplicativo Node.js no Cloud Run
- Conecte seu aplicativo ao banco de dados usando a biblioteca do Cloud SQL Node.js Connector
Pré-requisitos
- Para fazer este laboratório, é preciso ter familiaridade com o console do Cloud e os ambientes do Cloud Shell.
2. Antes de começar
Configuração do projeto do Google Cloud
- Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Se você ainda não tiver uma Conta do Google, crie uma.
- O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google Você pode atualizar a qualquer momento.
- O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. normalmente você não se importa com o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, que normalmente é identificado como
PROJECT_ID
. Se você não gostar do ID gerado, poderá gerar outro ID aleatório. Como alternativa, você pode tentar o seu próprio e ver se ele está disponível. Ela não pode ser alterada após essa etapa e permanecerá durante a duração do projeto. - Para sua informação, há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
- Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar faturamento além deste tutorial, exclua os recursos criados ou exclua o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.
Configuração do ambiente
Ative o Cloud Shell clicando no ícone à direita da barra de pesquisa.
No Cloud Shell, ative as APIs:
gcloud services enable compute.googleapis.com sqladmin.googleapis.com \
run.googleapis.com artifactregistry.googleapis.com \
cloudbuild.googleapis.com servicenetworking.googleapis.com
Se for preciso autorizar, clique em "Autorizar" para continuar.
Esse comando pode levar alguns minutos para ser concluído, mas em algum momento ele vai produzir uma mensagem de sucesso parecida com esta:
Operation "operations/acf.p2-327036483151-73d90d00-47ee-447a-b600-a6badf0eceae" finished successfully.
3. Configurar uma conta de serviço
Criar e configurar uma conta de serviço do Google Cloud para ser usada pelo Cloud Run e ter as permissões corretas para se conectar ao Cloud SQL.
- 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"
- Execute o comando gcloud projects add-iam-policy-binding da seguinte forma para adicionar o papel Cloud SQL Client à conta de serviço do Google Cloud que você acabou de criar. No Cloud Shell, a expressão
${GOOGLE_CLOUD_PROJECT}
será substituída pelo nome do projeto. Também é possível fazer essa substituição manualmente, se você se sentir mais confortável com isso.gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/cloudsql.client"
- Execute o comando gcloud projects add-iam-policy-binding da seguinte forma para adicionar o papel Usuário da instância do Cloud SQL à 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/cloudsql.instanceUser"
- Execute o comando gcloud projects add-iam-policy-binding da seguinte maneira para adicionar o papel 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"
4. Configurar o Cloud SQL
Execute o comando gcloud sql instances create
para criar uma instância do Cloud SQL.
- –database-version: o tipo e a versão do mecanismo do banco de dados. Se não for especificado, a API padrão será usada. Consulte a documentação de versões do banco de dados gcloud para conferir as versões atuais disponíveis.
- –cpu: o número desejado de núcleos na máquina.
- –memory: valor numérico inteiro que indica a quantidade de memória desejada na máquina. É preciso fornecer uma unidade de tamanho (por exemplo, 3.072 MB ou 9 GB). Se nenhuma unidade for especificada, será usado o GB.
- –region: local regional da instância (por exemplo: us-central1, asia-east1, us-east1).
- –database-flags: permite configurar sinalizações. Neste caso, estamos ativando
cloudsql.iam_authentication
para permitir que o Cloud Run se conecte ao Cloud SQL usando a conta de serviço que criamos antes.gcloud sql instances create quickstart-instance \ --database-version=POSTGRES_14 \ --cpu=1 \ --memory=4GB \ --region=us-central1 \ --database-flags=cloudsql.iam_authentication=on
Esse comando pode levar alguns minutos para ser concluído.
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
Para acessar o banco de dados, crie um usuário do banco de dados PostgreSQL para a conta de serviço criada anteriormente.
gcloud sql users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
--instance=quickstart-instance \
--type=cloud_iam_service_account
5. Preparar inscrição
Preparar um aplicativo Node.js que responda a solicitações HTTP.
- No Cloud Shell, crie um novo diretório chamado
helloworld
e mude para ele:mkdir helloworld cd helloworld
- 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"
- Instalar a dependência do conector do Cloud SQL Node.js.
npm install @google-cloud/cloud-sql-connector
- Instale o
pg
para interagir com o banco de dados PostgreSQL.npm install pg
- Instale o Express para aceitar as solicitações HTTP recebidas.
npm install express
- Crie um arquivo
index.mjs
com o código do aplicativo. Esse código é capaz de:- Aceitar solicitações HTTP
- Conecte-se ao banco de dados
- Armazenar o horário da solicitação HTTP no banco de dados
- Retorna os tempos das últimas cinco solicitações
cat > index.mjs << "EOF" import express from 'express'; import pg from 'pg'; import {Connector} from '@google-cloud/cloud-sql-connector'; const {Pool} = pg; const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: process.env.INSTANCE_CONNECTION_NAME, authType: 'IAM' }); const pool = new Pool({ ...clientOpts, user: process.env.DB_USER, database: process.env.DB_NAME }); 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. Agora o aplicativo está pronto para ser implantado.
6. Implantar o aplicativo do Cloud Run
Execute o comando abaixo para implantar o aplicativo no Cloud Run:
- –region: local regional da instância (por exemplo: us-central1, asia-east1, us-east1).
- –source: o código-fonte a ser implantado. Nesse caso,
.
se refere ao código-fonte na pasta atualhelloworld
. - –set-env-vars: define variáveis de ambiente usadas pelo aplicativo para direcioná-lo ao banco de dados do Cloud SQL.
- –service-account: vincula a implantação do Cloud Run à conta de serviço com permissões para se conectar ao banco de dados do Cloud SQL criado no início deste codelab.
- –allow-unauthenticated: permite solicitações não autenticadas para que o aplicativo fique acessível pela Internet.
gcloud run deploy helloworld \
--region=us-central1 \
--source=. \
--set-env-vars INSTANCE_CONNECTION_NAME="${GOOGLE_CLOUD_PROJECT}:us-central1:quickstart-instance" \
--set-env-vars DB_NAME="quickstart_db" \
--set-env-vars DB_USER="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam" \
--service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
--allow-unauthenticated
Se solicitado, pressione y
e Enter
para confirmar que você quer continuar:
Do you want to continue (Y/n)? y
Depois de alguns minutos, o aplicativo fornecerá um URL para você acessar.
Navegue até o URL para ver seu aplicativo em ação. Sempre que você acessar o URL ou atualizar a página, as cinco visitas mais recentes serão retornadas como JSON.
7. Parabéns
Você implantou um aplicativo Node.js no Cloud Run capaz de se conectar a um banco de dados PostgreSQL em execução no Cloud SQL.
O que aprendemos:
- Como criar um banco de dados do Cloud SQL para PostgreSQL
- Como implantar um aplicativo Node.js no Cloud Run
- Como conectar seu aplicativo ao Cloud SQL usando o conector Node.js do Cloud SQL
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 quiser excluir o projeto inteiro, execute:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}