Como se conectar ao CloudSQL particular pelo Cloud Run

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.

19c7b05f35789fda.png

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

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

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

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

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

19c7b05f35789fda.png

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

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

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

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

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.