Como se conectar ao CloudSQL particular pelo Cloud Run

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.

19c7b05f35789fda.png

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

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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.
  1. 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

  1. 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
  1. Clone o repositório e navegue até o diretório
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. 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.

  1. 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].
  1. 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.

219cb722c2dd1b82.png

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

  1. 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
  1. 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
  1. 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].
  1. 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")
  1. 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.

19c7b05f35789fda.png

  1. 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.

  1. 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] ------------------------------------------------------------------------
  1. 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
  1. 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
  1. 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.

  1. 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")
  1. 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

  1. 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"
}
  1. 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:

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.