Conéctate a Cloud SQL privado desde Cloud Run

1. Descripción general

En este lab, crearás el servicio de menú de Cymbal Eats y expondrás las APIs de RESTful para agregar, actualizar, borrar y enumerar elementos del menú. Crearás una base de datos de Cloud SQL como la base de datos de backend para el servicio de menú, que se ejecutará en Cloud Run. Debido a que Cloud Run no reside en la misma VPC que la base de datos de Cloud SQL, deberás configurar un conector de Acceso a VPC sin servidores para permitir que Cloud Run se comunique con Cloud SQL a través de una dirección IP privada.

19c7b05f35789fda.png

Qué aprenderás

En este lab, aprenderás a realizar las siguientes tareas:

  • Configura la red de VPC privada
  • Crea una base de datos privada de Cloud SQL de Postgres
  • Conecta CloudRun a una VPC privada
  • Implementa un servicio en Cloud Run que se conecte a la base de datos de Cloud SQL

2. Configuración y requisitos

Cómo configurar el entorno a tu propio ritmo

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. por lo general, no te importa qué es. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (por lo general, se identifica como PROJECT_ID). Si no te gusta el ID generado, puedes generar otro aleatorio. También puedes probar el tuyo propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá mientras dure el proyecto.
  • Para tu información, hay un tercer valor, un número de proyecto que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se te facture más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

Configuración del entorno

  1. Crea variables de entorno relacionadas con proyectos y 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. Clona el repositorio y navega al directorio
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. Habilita los servicios
gcloud services enable \
    sqladmin.googleapis.com \
    run.googleapis.com \
    vpcaccess.googleapis.com \
    servicenetworking.googleapis.com

3. Configura el acceso privado

El acceso privado a servicios se proporciona como un vínculo de intercambio de tráfico de VPC entre tu red de VPC y la red de VPC subyacente de Google Cloud en la que se encuentra tu instancia de Cloud SQL. La conexión privada permite que las instancias de VM en tu red de VPC y los servicios que usas se comuniquen únicamente a través de direcciones IP internas. Para acceder a los servicios disponibles a través del acceso privado a servicios, las instancias de VM no requieren conectividad a Internet ni direcciones IP externas.

  1. Asigna un rango de direcciones IP
gcloud compute addresses create google-managed-services-default \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=20 \
    --network=projects/$PROJECT_ID/global/networks/default

Resultado de ejemplo

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
  1. Crea una conexión privada.
gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-default \
    --network=default \
    --project=$PROJECT_ID

Resultado de ejemplo

Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.

4. Configura Cloud SQL

Cloud SQL es un servicio de base de datos completamente administrado que facilita la configuración, el mantenimiento y la administración de tus bases de datos relacionales de PostgreSQL y MySQL en la nube. Cada instancia de Cloud SQL funciona con una máquina virtual (VM) que se ejecuta en un servidor host de Google Cloud. La opción de alta disponibilidad también incluye una VM en espera en otra zona con la misma configuración que la VM principal. La base de datos se guarda en un dispositivo de almacenamiento de red escalable y de larga duración conocido como disco persistente, que está conectado a la VM. Se asigna una dirección IP estática a cada VM para garantizar que la dirección IP a la que se conecta una aplicación permanezca constante durante la vida de la instancia de Cloud SQL.

219cb722c2dd1b82.png

Crearás una base de datos de Postgres de Cloud SQL con una dirección IP privada.

Crea una base de datos y un usuario

  1. Crea una instancia de Postgres de Cloud SQL para usar una IP privada
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}

Resultado de ejemplo

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. Agrega una base de datos a la instancia de la base de datos
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

Resultado de ejemplo

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. Crea un usuario de SQL
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

Resultado de ejemplo

Created user [menu-user].
  1. Almacena la dirección IP de la base de datos
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. Agrega el rol Cliente de Cloud SQL a la cuenta de servicio de Compute Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"

Resultado de ejemplo

Updated IAM policy for project [cymbal1].
[...]

5. VPC sin servidores

El Acceso a VPC sin servidores te permite conectarte directamente a tu red de nube privada virtual desde entornos sin servidores como Cloud Run, App Engine o Cloud Functions. La configuración del Acceso a VPC sin servidores permite que tu entorno sin servidores envíe solicitudes a tu red de VPC con DNS interno y direcciones IP internas (como se define en RFC 1918 y RFC 6598). Las respuestas a estas solicitudes también usan tu red interna.

Crearás un conector de Acceso a VPC sin servidores para que el servicio de Cloud Run se conecte a Cloud SQL.

19c7b05f35789fda.png

  1. Crea un conector de Acceso a VPC sin servidores en la misma red de VPC en la que se encuentra tu instancia de Cloud SQL.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
    --region=${REGION} \
    --range=10.8.0.0/28

Resultado de ejemplo

Created connector [cymbalconnector].

6. Implementa en Cloud Run

Compilarás e implementarás una imagen de Docker en Cloud Run y lo conectarás al conector de VPC sin servidores para acceder a la base de datos de Cloud SQL.

  1. Compila la aplicación con Maven
./mvnw package -DskipTests

Resultado de ejemplo

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. Compila una imagen de Docker:
docker build -f src/main/docker/Dockerfile.jvm \
    --tag gcr.io/$PROJECT_NAME/menu-service .

Resultado de ejemplo

[...]
Successfully built 4ef5d7a3befc
Successfully tagged gcr.io/cymbal1/menu-service:latest
  1. Envía la imagen de Docker a Container Registry:
docker push gcr.io/$PROJECT_NAME/menu-service

Resultado de ejemplo

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. Implementa el servicio 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

Resultado de ejemplo

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

Google recomienda que uses Secret Manager para almacenar información sensible, como credenciales de SQL. Con Cloud Run, puedes pasar Secrets como variables de entorno o activarlos como un volumen.

  1. URL del servicio de menú de la tienda:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Verifica la URL del servicio de menú
echo $MENU_SERVICE_URL

Resultado de ejemplo

https://menu-service-g2mfphytdq-uk.a.run.app

7. Prueba el servicio

  1. Crea un elemento de menú nuevo mediante el envío de una solicitud 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!!"
   }'

Resultado de ejemplo

{
    "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. Cambia el estado del elemento de menú enviando una solicitud PUT:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Ready"}'

Resultado de ejemplo

{
    "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. ¡Felicitaciones!

¡Felicitaciones! Completaste el codelab.

¿Qué sigue?

Explora otros codelabs de Cymbal Eats:

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.