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. Neste codelab, vamos demonstrar como conectar um aplicativo Node.js no Cloud Run ao AlloyDB com segurança usando uma conta de serviço com autenticação do IAM.
O que você vai aprender
Neste laboratório, você vai aprender a:
- Criar uma instância do AlloyDB (configurada para usar o Private Service Connect)
- Implantar um aplicativo no Cloud Run que se conecte à sua instância do AlloyDB
- Usar o Gemini Code Assist para adicionar funcionalidades ao seu app
2. Pré-requisitos
- Se você ainda não tem uma Conta do Google, crie uma.
- Use uma conta pessoal em vez de uma conta escolar ou de trabalho. 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
- Faça login no Console do Google Cloud.
- 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.
- Crie um novo projeto ou escolha reutilizar um projeto atual.
4. Abrir editor do Cloud Shell
- Acesse o editor do Cloud Shell.
- Se o terminal não aparecer na parte de baixo da tela, abra-o:
- Clique no menu de navegação
.
- Clique em Terminal.
- Clique em Novo Terminal.
- Clique no menu de navegação
- No terminal, defina o 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}'
- É possível listar todos os IDs de projeto com:
- Formato:
- Se for preciso autorizar, clique em Autorizar para continuar.
- Você vai receber esta mensagem:
Se você receber umaUpdated property [core/project].
WARNING
e receber uma solicitaçãoDo you want to continue (Y/N)?
, provavelmente inseriu o ID do projeto incorretamente. PressioneN
, pressioneEnter
e tente executar o comandogcloud config set project
novamente.
5. Ativar APIs
No terminal, ative as APIs:
gcloud services enable \
compute.googleapis.com \
alloydb.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
cloudaicompanion.googleapis.com
Se for preciso autorizar, clique em Autorizar para continuar.
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 AlloyDB.
- 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 maneira para adicionar o papel Usuário do banco de dados do AlloyDB à 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/alloydb.databaseUser"
- Execute o comando gcloud projects add-iam-policy-binding da seguinte maneira para adicionar o papel Consumidor do Service Usage à 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/serviceusage.serviceUsageConsumer"
- 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 instância do AlloyDB
- Execute o comando
gcloud alloydb clusters create
para criar uma instância do Cloud SQL.gcloud alloydb clusters create quickstart-cluster \ --password=$(openssl rand -base64 20) \ --region=us-central1 \ --project=${GOOGLE_CLOUD_PROJECT} \ --enable-private-service-connect \ --database-version=POSTGRES_16
Isso pode demorar alguns minutos.
- Execute o comando
gcloud alloydb instances create
para criar uma instância do Cloud SQL.gcloud alloydb instances create quickstart-instance \ --project=${GOOGLE_CLOUD_PROJECT} \ --instance-type=PRIMARY \ --cpu-count=2 \ --region=us-central1 \ --cluster=quickstart-cluster \ --allowed-psc-projects=${GOOGLE_CLOUD_PROJECT} \ --database-flags=alloydb.iam_authentication=on
- Execute o comando
gcloud alloydb instances describe
para receber o link do anexo do serviço PSC e exportá-lo para uma variávelexport SERVICE_ATTACHMENT=$(gcloud alloydb instances describe quickstart-instance \ --cluster=quickstart-cluster --region=us-central1 \ --format="value(pscInstanceConfig.serviceAttachmentLink)")
gcloud compute addresses create quickstart-address \ --region=us-central1 \ --subnet=default
gcloud compute forwarding-rules create quickstart-endpoint \ --region=us-central1 \ --network=default \ --address=quickstart-address \ --target-service-attachment=${SERVICE_ATTACHMENT}
Crie um usuário do banco de dados PostgreSQL para a conta de serviço que você criou anteriormente para acessar o banco de dados.
gcloud alloydb users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
--cluster=quickstart-cluster \
--region=us-central1 \
--type=IAM_BASED \
--superuser=true
8. Preparar a inscrição
Prepare 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"
- Instale a biblioteca do Google Cloud Auth.
npm install google-auth-library
- Instale o
pg
para interagir com o banco de dados PostgreSQL.npm install pg
- Instale o Express para aceitar solicitações HTTP de entrada.
npm install express
- 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
cat > index.mjs << "EOF" import express from 'express'; import pg from 'pg'; const { Pool } = pg; import {GoogleAuth} from 'google-auth-library'; const auth = new GoogleAuth({ scopes: ['https://www.googleapis.com/auth/alloydb.login'], }); const pool = new Pool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: async () => { return await auth.getAccessToken(); }, 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 do Cloud Run
- 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"
- 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
- Se necessário, pressione
Y
eEnter
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.
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:
- Criar uma instância do AlloyDB configurada para usar o Private Service Connect
- Implantar um aplicativo no Cloud Run que se conecte à sua instância do AlloyDB
- 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 todo o projeto, execute:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}