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, que expondrá APIs de RESTful para agregar, actualizar, borrar y enumerar elementos del menú. Crearás una base de datos de Cloud SQL como base de datos de backend para el servicio de menú, que se ejecutará en Cloud Run. Dado 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 de Cloud SQL de Postgres privada
  • Conecta Cloud Run 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 importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (suele identificarse como PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usará el mismo durante todo el proyecto.
  • Recuerda que 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 generen cobros 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 el proyecto y los 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 que están disponibles a través del acceso privado a los 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

Ejemplo de resultado:

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

Ejemplo de resultado:

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

4. Configura Cloud SQL

Cloud SQL es un servicio de bases 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 mantiene en un dispositivo de almacenamiento de red escalable y duradero conocido como disco persistente, que está conectado a la VM. A cada VM se le asigna una dirección IP estática para garantizar que la dirección IP a la que se conecta una aplicación permanezca constante durante la vida útil de la instancia de Cloud SQL.

219cb722c2dd1b82.png

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

Crea una base de datos y un usuario

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

Ejemplo de resultado:

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 base de datos
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

Ejemplo de resultado:

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

Ejemplo de resultado:

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 de 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"

Ejemplo de resultado:

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 el entorno sin servidores envíe solicitudes a la red de VPC mediante 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

Ejemplo de resultado:

Created connector [cymbalconnector].

6. Implementa en Cloud Run

Compilarás e implementarás una imagen de Docker en Cloud Run y conectarás Cloud Run 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

Ejemplo de resultado:

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

Ejemplo de resultado:

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

Ejemplo de resultado:

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 menú:
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

Ejemplo de resultado:

[...]
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 usar Secret Manager para almacenar información sensible, como credenciales de SQL. Puedes pasar secretos como variables de entorno o activar como un volumen con Cloud Run.

  1. URL del servicio de Store Menu:
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

Ejemplo de resultado:

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

7. Cómo probar el servicio

  1. Crea un nuevo elemento de menú enviando 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!!"
   }'

Ejemplo de resultado:

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

Ejemplo de resultado:

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

Pasos siguientes:

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.