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.
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
- 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.
- 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.
- 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
- 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
- Clona el repositorio y navega al directorio
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- 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.
- 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].
- 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.
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
- 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
- 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
- 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].
- 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")
- 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.
- 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.
- 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] ------------------------------------------------------------------------
- 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
- 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
- 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.
- 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")
- 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
- 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" }
- 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:
- Activa Cloud Workflows con Eventarc
- Activa el procesamiento de eventos desde Cloud Storage
- Conéctate a bases de datos completamente administradas desde Cloud Run
- Protección de aplicaciones sin servidores con Identity-Aware Proxy (IAP)
- Activa trabajos de Cloud Run con Cloud Scheduler
- Implementa de forma segura en Cloud Run
- Protege el tráfico de entrada de Cloud Run
- Conéctate a cuentas privadas de AlloyDB desde GKE Autopilot
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.