1. Visão geral
Neste laboratório, você vai criar o serviço de cardápio do Cymbal Eats, expondo APIs RESTful para adicionar, atualizar, excluir e listar itens do cardápio. Você vai criar um banco de dados do Cloud SQL como o banco de dados de back-end para o serviço de menu, que será executado no Cloud Run. Como o Cloud Run não está na mesma VPC que o banco de dados do Cloud SQL, é necessário configurar um conector de acesso VPC sem servidor para permitir que o Cloud Run se comunique com o Cloud SQL usando um endereço IP particular.

O que você vai aprender
Neste laboratório, você vai aprender a:
- Configurar a rede VPC particular
- Criar um banco de dados privado do Cloud SQL para Postgres
- Conectar o Cloud Run à VPC particular
- Implante um serviço no Cloud Run que se conecte ao banco de dados do Cloud SQL
2. Configuração e requisitos
Configuração de ambiente personalizada
- Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver 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 É possível atualizar o local 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. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como
PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto. - Para sua informação, há um terceiro valor, um Número do 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 evitar cobranças além deste tutorial, exclua os recursos criados ou 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
- Criar variáveis de ambiente relacionadas a projetos e recursos
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service
export SERVERLESS_VPC_CONNECTOR=cymbalconnector
export DB_INSTANCE_NAME=menu-catalog
export DB_INSTANCE_PASSWORD=password123
export DB_DATABASE=menu-db
export DB_USER=menu-user
export DB_PASSWORD=menupassword123
- Clone o repositório e navegue até o diretório
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- Ativar os serviços
gcloud services enable \
sqladmin.googleapis.com \
run.googleapis.com \
vpcaccess.googleapis.com \
servicenetworking.googleapis.com
3. Configurar o acesso particular
O acesso a serviços particulares é fornecido como um link de peering de VPC entre sua rede VPC e a rede VPC subjacente do Google Cloud em que a instância do Cloud SQL está localizada. A conexão particular permite que as instâncias de VM na sua rede VPC e os serviços que você usa se comuniquem somente por endereços IP internos. Para acessar serviços disponíveis pelo acesso a serviços particulares, as instâncias de VM não precisam de conectividade com a Internet nem de endereços IP externos.
- Alocar um intervalo de endereços IP
gcloud compute addresses create google-managed-services-default \
--global \
--purpose=VPC_PEERING \
--prefix-length=20 \
--network=projects/$PROJECT_ID/global/networks/default
Exemplo de saída
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
- Crie uma conexão particular.
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-default \
--network=default \
--project=$PROJECT_ID
Exemplo de saída
Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.
4. Como configurar o Cloud SQL
O Cloud SQL é um serviço de banco de dados totalmente gerenciado que facilita a configuração, a manutenção, o gerenciamento e a administração dos seus bancos de dados relacionais PostgreSQL e MySQL na nuvem. Cada instância do Cloud SQL usa uma máquina virtual (VM) em execução em um servidor host do Google Cloud. A opção de alta disponibilidade também inclui uma VM em espera em outra zona com a mesma configuração da VM principal. O banco de dados é mantido em um dispositivo de armazenamento de rede escalonável e durável, conhecido como disco permanente, que é conectado à VM. Um endereço IP estático é atribuído a cada VM para garantir que o endereço IP ao qual um aplicativo se conecta permaneça constante durante a vida útil da instância do Cloud SQL.

Você vai criar um banco de dados do Cloud SQL do Postgres com um endereço IP particular.
Criar um banco de dados e um usuário
- Criar uma instância do Cloud SQL do Postgres para usar um IP particular
gcloud sql instances create $DB_INSTANCE_NAME \
--project=$PROJECT_ID \
--network=projects/$PROJECT_ID/global/networks/default \
--no-assign-ip \
--database-version=POSTGRES_12 \
--cpu=2 \
--memory=4GB \
--region=$REGION \
--root-password=${DB_INSTANCE_PASSWORD}
Exemplo de saída
Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/cymbal1/instances/menu-instance]. NAME: menu-instance DATABASE_VERSION: POSTGRES_12 LOCATION: us-east1-a TIER: db-custom-2-4096 PRIMARY_ADDRESS: - PRIVATE_ADDRESS: 10.8.80.5 STATUS: RUNNABLE
- Adicionar um banco de dados à instância
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME
Exemplo de saída
Created database [menu-db]. instance: menu-catalog name: menu-db project: cymbal1
- Criar um usuário do SQL
gcloud sql users create ${DB_USER} \
--password=$DB_PASSWORD \
--instance=$DB_INSTANCE_NAME
Exemplo de saída
Created user [menu-user].
- Armazenar o endereço IP do banco de dados
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
--format=json | jq \
--raw-output ".ipAddresses[].ipAddress")
- Adicionar o papel de cliente do Cloud SQL à conta de serviço do Compute Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"
Exemplo de saída
Updated IAM policy for project [cymbal1]. [...]
5. VPC sem servidor
O acesso VPC sem servidor permite que você se conecte diretamente à rede de nuvem privada virtual a partir de ambientes sem servidor, como Cloud Run, App Engine ou Cloud Functions. Configurar o acesso VPC sem servidor permite que o ambiente sem servidor envie solicitações à rede VPC usando DNS interno e endereços IP internos (conforme definido pelas RFCs 1918 e 6598). As respostas a essas solicitações também usam a rede interna.
Você vai criar um conector de acesso VPC sem servidor para que o serviço do Cloud Run se conecte ao Cloud SQL.

- Crie um conector de acesso VPC sem servidor na mesma rede VPC da sua instância do Cloud SQL.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
--region=${REGION} \
--range=10.8.0.0/28
Exemplo de saída
Created connector [cymbalconnector].
6. Como implantar no Cloud Run
Você vai criar e implantar uma imagem Docker no Cloud Run e conectar o Cloud Run ao conector de VPC sem servidor para acessar o banco de dados do Cloud SQL.
- Compile o aplicativo usando o Maven
./mvnw package -DskipTests
Exemplo de saída
[...] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 42.864 s [INFO] Finished at: 2022-04-28T16:15:33Z [INFO] ------------------------------------------------------------------------
- Crie a imagem do Docker:
docker build -f src/main/docker/Dockerfile.jvm \
--tag gcr.io/$PROJECT_NAME/menu-service .
Exemplo de saída
[...] Successfully built 4ef5d7a3befc Successfully tagged gcr.io/cymbal1/menu-service:latest
- Envie a imagem do Docker para o Container Registry:
docker push gcr.io/$PROJECT_NAME/menu-service
Exemplo de saída
Using default tag: latest The push refers to repository [gcr.io/cymbalsql/menu-service] 17b374963800: Pushed d9a51c06430d: Pushed fff5d2a2cfc9: Pushed f21fceb558c6: Pushed 5ffbbbf218dd: Pushed 60609ec85f86: Layer already exists f2c4302f03b8: Layer already exists latest: digest: sha256:f64cb7c288dbf4ad9b12bd210c23c5aec1048dee040450ff2d9dbdf96e83a426 size: 1789
- Implante o serviço de menu:
gcloud run deploy $MENU_SERVICE_NAME \
--image=gcr.io/$PROJECT_NAME/menu-service:latest \
--region $REGION \
--allow-unauthenticated \
--set-env-vars DB_USER=$DB_USER \
--set-env-vars DB_PASS=$DB_PASSWORD \
--set-env-vars DB_DATABASE=$DB_DATABASE \
--set-env-vars DB_HOST=$DB_INSTANCE_IP \
--vpc-connector $SERVERLESS_VPC_CONNECTOR \
--project=$PROJECT_ID \
--quiet
Exemplo de saída
[...] Done. Service [menu-service] revision [menu-service-00002-xox] has been deployed and is serving 100 percent of traffic. Service URL: https://menu-service-g2mfphytdq-uk.a.run.app
O Google recomenda que você use o Secret Manager para armazenar informações sensíveis, como credenciais SQL. É possível transmitir secrets como variáveis de ambiente ou montá-los como um volume com o Cloud Run.
- Armazene o URL do serviço de cardápio da loja:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- Verificar o URL do serviço de menu
echo $MENU_SERVICE_URL
Exemplo de saída
https://menu-service-g2mfphytdq-uk.a.run.app
7. Como testar o serviço
- Crie um novo item de menu enviando uma solicitação POST:
curl -X POST "${MENU_SERVICE_URL}/menu" \
-H 'Content-Type: application/json' \
-d '{
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.5,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 3,
"status": "Ready",
"tagLine": "Spicy touch for your taste buds!!"
}'
Exemplo de saída
{
"id": 16,
"createDateTime": "2022-04-28T18:14:04.17225",
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.5,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 3,
"status": "Processing",
"tagLine": "Spicy touch for your taste buds!!",
"updateDateTime": "2022-04-28T18:14:04.172298"
}
- Mude o status do item de menu enviando uma solicitação PUT:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
-H 'Content-Type: application/json' \
-d '{"status": "Ready"}'
Exemplo de saída
{
"id": 1,
"createDateTime": "2022-04-28T17:21:02.369093",
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.50,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 0,
"status": "Ready",
"tagLine": "Spicy touch for your taste buds!!",
"updateDateTime": "2022-04-28T17:21:02.657636"
}
8. Parabéns!
Parabéns, você concluiu o codelab.
Qual é a próxima etapa?
Confira outros codelabs do Cymbal Eats:
- Como acionar o Cloud Workflows com o Eventarc
- Acionamento do processamento de eventos do Cloud Storage
- Como se conectar a bancos de dados totalmente gerenciados pelo Cloud Run
- Proteger um aplicativo sem servidor com o Identity-Aware Proxy (IAP)
- Como acionar jobs do Cloud Run com o Cloud Scheduler
- Como implantar com segurança no Cloud Run
- Como proteger o tráfego de entrada do Cloud Run
- Como se conectar ao AlloyDB particular pelo Autopilot do GKE
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.
Excluir o projeto
O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para este tutorial.