1. Visão geral
Neste laboratório, você vai criar o serviço de menu Cymbal Eats, expondo APIs RESTful para adicionar, atualizar, excluir e listar itens de menu. Você vai criar um banco de dados do Cloud SQL como banco de dados de back-end para o serviço de menus, que será executado no Cloud Run. Como o Cloud Run não fica na mesma VPC que o banco de dados do Cloud SQL, você precisa configurar um conector de acesso VPC sem servidor para permitir que o Cloud Run se comunique com o Cloud SQL por um endereço IP particular.
O que você vai aprender
Você vai aprender a:
- Configurar a rede VPC privada
- Criar um banco de dados particular do Cloud SQL no Postgres
- Conectar o CloudRun à VPC privada
- Implantar 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 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
- Criar variáveis de ambiente relacionadas ao projeto e aos 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 privado
O acesso a serviços particulares é fornecido como um link de peering de VPC entre sua rede VPC e a rede VPC do Google Cloud em que a instância do Cloud SQL está localizada. A conexão particular permite que as instâncias de VM da sua rede VPC e os serviços que você usa se comuniquem somente por endereços IP internos. Para acessar serviços disponíveis no Acesso privado a serviços, as instâncias de VM não exigem conectividade com a Internet ou 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 simplifica 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 é alimentada por uma máquina virtual (VM) executada 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 primária. O banco de dados é mantido em um dispositivo de armazenamento de rede escalonável e duradouro, conhecido como disco permanente, que está 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 no Postgres para usar um IP privado
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 de banco de dados
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 à sua rede de nuvem privada virtual de ambientes sem servidor, como Cloud Run, App Engine ou Cloud Functions. Configurar o acesso VPC sem servidor permite que seu ambiente sem servidor envie solicitações à rede VPC usando DNS e endereços IP internos (conforme definido pelo RFC 1918 e pelo RFC 6598). As respostas a essas solicitações também usam sua rede interna.
Você vai criar um conector de acesso VPC sem servidor para o serviço do Cloud Run se conectar ao Cloud SQL.
- Crie um conector de acesso VPC sem servidor na mesma rede VPC que a 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 conectá-lo ao conector de VPC sem servidor para acessar o banco de dados do Cloud SQL.
- Compilar 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 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
- Implantar o serviço 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 do SQL. É possível transmitir secrets como variáveis de ambiente ou montar como um volume com o Cloud Run.
- URL do serviço do menu da loja:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- Verifique o URL de serviço do cardápio
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" }
- Altere o status do item de menu enviando a 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.
O que vem em seguida:
Conheça outros codelabs da Cymbal Eats:
- Como acionar fluxos de trabalho do Cloud com o Eventarc
- Como acionar o processamento de eventos no Cloud Storage
- Como se conectar a bancos de dados totalmente gerenciados pelo Cloud Run
- Aplicativo seguro 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 no 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.