Como se conectar ao CloudSQL particular pelo Cloud Run

Como se conectar ao CloudSQL particular pelo Cloud Run

Sobre este codelab

subjectÚltimo jan. 24, 2023 atualizado
account_circleEscrito por ameenahb

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.