Obtén acceso a más de 700 labs y cursos

Moderniza aplicaciones con Apigee X

Lab 1 hora 30 minutos universal_currency_alt 5 créditos show_chart Intermedio
info Es posible que este lab incorpore herramientas de IA para facilitar tu aprendizaje.
Obtén acceso a más de 700 labs y cursos

GSP842

Logotipo de los labs de autoaprendizaje de Google Cloud

Descripción general

La plataforma de APIs de Apigee de Google Cloud se puede usar para modernizar las aplicaciones existentes agregando nuevas funciones a tus APIs.

En este lab, implementarás un servicio de backend en Cloud Run. El servicio de backend implementa una API de REST que almacena datos bancarios (de clientes, cuentas, cajeros automáticos y transacciones) en una base de datos de Firestore y los recupera. Crearás un proxy de API de Apigee que actuará como proxy del servicio de backend. También crearás un flujo compartido que recupere y almacene en caché contenido de un servicio externo. Luego, llamarás a ese flujo compartido desde tu proxy de API y usarás código JavaScript para modificar una respuesta de la API.

Objetivos

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

  • Implementar un servicio de backend en Cloud Run
  • Crear un proxy para un servicio de backend con un proxy de Apigee X
  • Crear un flujo compartido para la funcionalidad que puedan usar varios proxies
  • Almacenar datos de configuración en un conjunto de propiedades
  • Usar una política de llamado a un servicio para recuperar contenido de él
  • Usar políticas de caché para almacenar en caché información reutilizable
  • Usar código JavaScript para modificar una carga útil de respuesta

Configuración

Antes de hacer clic en el botón Comenzar lab

Lee estas instrucciones. Los labs cuentan con un temporizador que no se puede pausar. El temporizador, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.

Este lab práctico te permitirá realizar las actividades correspondientes en un entorno de nube real, no en uno de simulación o demostración. Para ello, se te proporcionan credenciales temporales nuevas que utilizarás para acceder a Google Cloud durante todo el lab.

Para completar este lab, necesitarás lo siguiente:

  • Acceso a un navegador de Internet estándar. Se recomienda el navegador Chrome.
Nota: Usa una ventana del navegador privada o de incógnito (opción recomendada) para ejecutar el lab. Así evitarás conflictos entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.
  • Tiempo para completar el lab (recuerda que, una vez que comienzas un lab, no puedes pausarlo).
Nota: Usa solo la cuenta de estudiante para este lab. Si usas otra cuenta de Google Cloud, es posible que se apliquen cargos a esa cuenta.

Cómo iniciar tu lab y acceder a la consola de Google Cloud

  1. Haz clic en el botón Comenzar lab. Si debes pagar por el lab, se abrirá un diálogo para que selecciones la forma de pago. A la izquierda, se encuentra el panel Detalles del lab, que tiene estos elementos:

    • El botón para abrir la consola de Google Cloud
    • El tiempo restante
    • Las credenciales temporales que debes usar para el lab
    • Otra información para completar el lab, si es necesaria
  2. Haz clic en Abrir la consola de Google Cloud (o haz clic con el botón derecho y selecciona Abrir el vínculo en una ventana de incógnito si ejecutas el navegador Chrome).

    El lab inicia recursos y abre otra pestaña en la que se muestra la página de acceso.

    Sugerencia: Ordena las pestañas en ventanas separadas, una junto a la otra.

    Nota: Si ves el diálogo Elegir una cuenta, haz clic en Usar otra cuenta.
  3. De ser necesario, copia el nombre de usuario a continuación y pégalo en el diálogo Acceder.

    {{{user_0.username | "Username"}}}

    También puedes encontrar el nombre de usuario en el panel Detalles del lab.

  4. Haz clic en Siguiente.

  5. Copia la contraseña que aparece a continuación y pégala en el diálogo Te damos la bienvenida.

    {{{user_0.password | "Password"}}}

    También puedes encontrar la contraseña en el panel Detalles del lab.

  6. Haz clic en Siguiente.

    Importante: Debes usar las credenciales que te proporciona el lab. No uses las credenciales de tu cuenta de Google Cloud. Nota: Usar tu propia cuenta de Google Cloud para este lab podría generar cargos adicionales.
  7. Haz clic para avanzar por las páginas siguientes:

    • Acepta los Términos y Condiciones.
    • No agregues opciones de recuperación o autenticación de dos factores (esta es una cuenta temporal).
    • No te registres para obtener pruebas gratuitas.

Después de un momento, se abrirá la consola de Google Cloud en esta pestaña.

Nota: Para acceder a los productos y servicios de Google Cloud, haz clic en el menú de navegación o escribe el nombre del servicio o producto en el campo Buscar. Ícono del menú de navegación y campo de búsqueda

Activa Cloud Shell

Cloud Shell es una máquina virtual que cuenta con herramientas para desarrolladores. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud. Cloud Shell proporciona acceso de línea de comandos a tus recursos de Google Cloud.

  1. Haz clic en Activar Cloud Shell Ícono de Activar Cloud Shell en la parte superior de la consola de Google Cloud.

  2. Haz clic para avanzar por las siguientes ventanas:

    • Continúa en la ventana de información de Cloud Shell.
    • Autoriza a Cloud Shell para que use tus credenciales para realizar llamadas a la API de Google Cloud.

Cuando te conectes, habrás completado la autenticación, y el proyecto estará configurado con tu Project_ID, . El resultado contiene una línea que declara el Project_ID para esta sesión:

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud es la herramienta de línea de comandos de Google Cloud. Viene preinstalada en Cloud Shell y es compatible con la función de autocompletado con tabulador.

  1. Puedes solicitar el nombre de la cuenta activa con este comando (opcional):
gcloud auth list
  1. Haz clic en Autorizar.

Resultado:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. Puedes solicitar el ID del proyecto con este comando (opcional):
gcloud config list project

Resultado:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} Nota: Para obtener toda la documentación de gcloud, en Google Cloud, consulta la guía con la descripción general de gcloud CLI.

Tarea 1: Implementa un servicio de backend en Cloud Run

En esta tarea, implementarás un servicio de backend en Cloud Run.

El servicio implementa una API para SimpleBank. Esta API proporciona una representación simple de un banco, con clientes, cuentas, transacciones y cajeros automáticos. El servicio de SimpleBank se compila con Node.js y los datos se almacenan en Firestore. El código se empaqueta en un contenedor de Docker, y este contenedor se implementa en Cloud Run.

Clona el repositorio de código

  1. Para clonar el repositorio que contiene el código del servicio de SimpleBank, ejecuta el siguiente comando en Cloud Shell:

    git clone --depth 1 https://github.com/GoogleCloudPlatform/training-data-analyst
  2. Crea un vínculo simbólico al directorio de trabajo:

    ln -s ~/training-data-analyst/quests/develop-apis-apigee ~/develop-apis-apigee
  3. Para cambiar al directorio que contiene el backend de REST, ejecuta el siguiente comando:

    cd ~/develop-apis-apigee/rest-backend
  4. Para actualizar la región en el archivo de configuración, ejecuta el siguiente comando:

    sed -i "s/us-west1/{{{ project_0.default_region | "REGION" }}}/g" config.sh

Inicializa el proyecto

La secuencia de comandos de inicialización del proyecto, init-project.sh, habilita las APIs dentro del proyecto. Estas APIs serán necesarias para implementar servicios de Cloud Run.

La base de datos para el servicio será Firestore en modo nativo. Un proyecto puede alojar una sola base de datos de Firestore en modo nativo o en modo Datastore. Esta secuencia de comandos creará la base de datos de Firestore en modo nativo.

  1. Para ver los comandos que ejecuta la secuencia de comandos init-project.sh, ingresa lo siguiente:

    cat init-project.sh

    La secuencia de comandos habilita las APIs y crea la base de datos de Firestore en modo nativo.

  2. Para ejecutar la secuencia de comandos, ingresa lo siguiente:

    ./init-project.sh

Haz clic en Revisar mi progreso para verificar el objetivo. Habilitar la API de Cloud Run y crear la base de datos de Firestore

Inicializa el servicio

La secuencia de comandos de inicialización del servicio, init-service.sh, crea una cuenta de servicio llamada simplebank-rest. Esta cuenta de servicio se usa como la identidad del servicio de Cloud Run. A la cuenta de servicio se le otorga el rol roles/datastore.user, que permite que el servicio lea y actualice datos en Firestore.

Se recomienda crear una cuenta de servicio para el servicio que produzcas y otorgarle permisos según el principio de privilegio mínimo, que establece que una cuenta solo debe tener los privilegios esenciales para realizar su función única.

  1. Para ver los comandos que ejecuta la secuencia de comandos init-service.sh, ingresa lo siguiente:

    cat init-service.sh

    La secuencia de comandos crea la cuenta que usará el servicio y le agrega roles.

  2. Para ejecutar la secuencia de comandos, ingresa lo siguiente:

    ./init-service.sh

Implementa el servicio de backend

La secuencia de comandos de implementación, deploy.sh, compila la aplicación de servicio simplebank con el código del directorio actual y, luego, implementa el servicio en Cloud Run con la cuenta simplebank-rest. La secuencia de comandos de implementación se ejecutará cada vez que actualices el código de la aplicación.

El servicio se implementa para requerir acceso autenticado, por lo que no puedes llamarlo sin un token de identidad de OpenID Connect válido.

  1. Para ver los comandos que ejecuta la secuencia de comandos deploy.sh, ingresa lo siguiente en Cloud Shell:

    cat deploy.sh

    La secuencia de comandos compila e implementa el servicio simplebank-grpc en Cloud Run.

Nota: La secuencia de comandos de implementación usa el parámetro max-instances para limitar la cantidad de instancias en el clúster de Cloud Run a 1. Para un servicio de producción del mundo real, no debes especificar un límite tan bajo.
  1. Para implementar la secuencia de comandos en Cloud Run, ingresa lo siguiente:

    ./deploy.sh

Haz clic en Revisar mi progreso para verificar el objetivo. Implementar el servicio de backend

Prueba el servicio

  1. Para verificar que el servicio se esté ejecutando, realiza una solicitud curl que lo llame:

    export RESTHOST=$(gcloud run services describe simplebank-rest --platform managed --region {{{project_0.default_region |REGION}}} --format 'value(status.url)') echo "export RESTHOST=${RESTHOST}" >> ~/.bashrc curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -X GET "${RESTHOST}/_status"

    El comando que establece la variable RESTHOST usa gcloud para recuperar el nombre de host del servicio de Cloud Run simplebank-rest. Luego, la variable RESTHOST se agrega al archivo .bashrc, lo que hará que esta se vuelva a cargar si se reinicia Cloud Shell.

    El comando GET /_status simplemente devuelve una respuesta JSON que indica que la API está en funcionamiento. En esta llamada, usaste gcloud auth print-identity-token para obtener un token de identidad de OpenID Connect para el usuario que accedió a Cloud Shell. Accediste con el rol de propietario del proyecto, que tiene permisos muy amplios.

  2. Para verificar que el servicio pueda escribir en Firestore, realiza una solicitud curl que cree un cliente:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -H "Content-Type: application/json" -X POST "${RESTHOST}/customers" -d '{"lastName": "Diallo", "firstName": "Temeka", "email": "temeka@example.com"}'

    El comando POST /customers crea un cliente. Los parámetros lastName, firstName y email son todos obligatorios. La dirección de correo electrónico debe ser única y se usa como identificador del cliente. El registro del cliente se almacena en Firestore.

    Nota: Si recibes un error "AlreadyExist", es posible que no hayas creado correctamente la base de datos de Firestore. La base de datos se crea ejecutando la secuencia de comandos init-project.sh.
  3. Para verificar que el servicio pueda leer desde Firestore, realiza una solicitud curl para recuperar el cliente que acabas de crear:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -X GET "${RESTHOST}/customers/temeka@example.com"

    El comando GET /customers/ recupera un registro de cliente de Firestore.

  4. Para cargar algunos datos de muestra adicionales en Firestore, ingresa este comando:

    gcloud firestore import gs://spls/shared/firestore-simplebank-data/firestore/example-data

    Este comando de gcloud usará la función de importación y exportación de Firestore para importar información de clientes, cuentas y cajeros automáticos a la base de datos.

  5. Para recuperar la lista de cajeros automáticos, ejecuta este comando curl:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -X GET "${RESTHOST}/atms"
  6. Para recuperar un solo cajero automático, ejecuta este comando curl:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -X GET "${RESTHOST}/atms/spruce-goose"

    La solicitud recupera un cajero automático por su nombre, y la respuesta contiene la latitud y la longitud, pero no una dirección:

    {"name":"spruce-goose","longitude":-118.408207,"description":"","latitude":33.977601}

    En una tarea posterior, usarás Apigee y la API de Geocoding para agregar una dirección a la respuesta que se devuelve cuando se recupera un cajero automático específico.

Tarea 2: Crea un proxy de servicio de backend con un proxy de API de Apigee

En esta tarea, crearás un proxy de API de Apigee que funcionará como una fachada para un servicio de backend. El proxy de API usará una cuenta de servicio para permitirle presentar tokens de identidad de OpenID Connect al servicio de Cloud Run.

Crea una cuenta de servicio para el proxy de API de Apigee

  1. Para crear una cuenta de servicio que pueda usar el proxy de API de Apigee, ingresa este comando:

    gcloud iam service-accounts create apigee-internal-access \ --display-name="Service account for internal access by Apigee proxies" \ --project=${GOOGLE_CLOUD_PROJECT}

    El comando gcloud crea una cuenta de servicio llamada apigee-internal-access, que usará tu proxy de Apigee cuando llame al servicio de backend.

  2. Para otorgar el rol que permite el acceso al servicio, ingresa este comando:

    gcloud run services add-iam-policy-binding simplebank-rest \ --member="serviceAccount:apigee-internal-access@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role=roles/run.invoker --region={{{project_0.default_region |REGION}}} \ --project=${GOOGLE_CLOUD_PROJECT}

    Este comando de gcloud otorga a la cuenta de servicio el rol roles/run.invoker para que pueda invocar el servicio de Cloud Run simplebank-rest.

  3. Para recuperar la URL del servicio de backend, usa el siguiente comando:

    gcloud run services describe simplebank-rest --platform managed --region {{{project_0.default_region |REGION}}} --format 'value(status.url)'

    Guarda esta URL. Se usará cuando se cree el proxy de API.

Haz clic en Revisar mi progreso para verificar el objetivo. Puede haber una breve demora antes de que se detecte el rol otorgado. Crear una cuenta de servicio para el proxy de API de Apigee

Abre la consola de Apigee

Para abrir la consola de Apigee, haz lo siguiente:

  • En el campo Buscar de la consola de Google Cloud, ingresa Apigee y, luego, haz clic en Administración de APIs de Apigee en los resultados de la búsqueda.

Se abrirá la consola de Apigee y, en la página de destino, se mostrarán vínculos rápidos a ubicaciones de uso frecuente.

  • En el menú de navegación (Menú de navegación), junto a Apigee, haz clic en Fijar (Ícono de fijar).

Apigee ahora está fijada en el menú de navegación.

Crea el proxy de Apigee

  1. En el menú de navegación, selecciona Desarrollo de proxies > Proxies de API.

  2. Para crear un proxy nuevo con el asistente de proxy, haz clic en +Crear.

    Crearás un proxy inverso para tu servicio de backend.

  3. En Plantilla de proxy, selecciona Plantilla general > Proxy inverso (más común).

    Nota: No uses la selección Proxy inverso (más común) en la sección de la plantilla OpenAPI spec.
  4. Especifica lo siguiente para los detalles del proxy:

    Propiedad Valor
    Nombre del proxy bank-v1
    Ruta de acceso base /bank/v1
    (API existente) de destino URL de backend
    Nota: Confirma que estás usando "/bank/v1" para la ruta de acceso base, no "/bank-v1".

    El destino debe ser la URL de backend que recuperaste anteriormente en la tarea, que debería verse de la siguiente manera:

    https://simplebank-rest-mtdtzt7yzq-ue.a.run.app
  5. Haz clic en Siguiente.

  6. Deja la configuración de Implementar (opcional) con sus valores predeterminados y haz clic en Crear.

Confirma que la instancia del entorno de ejecución esté disponible

  1. En Cloud Shell, pega y ejecuta el siguiente conjunto de comandos:

    export INSTANCE_NAME=eval-instance; export ENV_NAME=eval; export PREV_INSTANCE_STATE=; echo "waiting for runtime instance ${INSTANCE_NAME} to be active"; while : ; do export INSTANCE_STATE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}" | jq "select(.state != null) | .state" --raw-output); [[ "${INSTANCE_STATE}" == "${PREV_INSTANCE_STATE}" ]] || (echo; echo "INSTANCE_STATE=${INSTANCE_STATE}"); export PREV_INSTANCE_STATE=${INSTANCE_STATE}; [[ "${INSTANCE_STATE}" != "ACTIVE" ]] || break; echo -n "."; sleep 5; done; echo; echo "instance created, waiting for environment ${ENV_NAME} to be attached to instance"; while : ; do export ATTACHMENT_DONE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}/attachments" | jq "select(.attachments != null) | .attachments[] | select(.environment == \"${ENV_NAME}\") | .environment" --join-output); [[ "${ATTACHMENT_DONE}" != "${ENV_NAME}" ]] || break; echo -n "."; sleep 5; done; echo "***ORG IS READY TO USE***";

    Esta serie de comandos usa la API de Apigee para determinar cuándo se creó la instancia del entorno de ejecución de Apigee y se conectó el entorno de evaluación.

  2. Espera hasta que la instancia esté lista.

    Cuando se muestra el texto ***ORG IS READY TO USE***, la instancia está lista. Es posible que la organización de Apigee (org) se haya creado antes de que comenzaras el lab, por lo que tal vez no tengas que esperar a que se cree la instancia.

    Si estás esperando a que la organización esté lista, puedes obtener más información sobre Apigee, explorar la arquitectura de Apigee X o conocer las APIs y los proxies de API.

Implementa el proxy de API

  1. En el menú de navegación, selecciona Desarrollo de proxies > Proxies de API y, luego, haz clic en bank-v1.

  2. Haz clic en Implementar.

  3. En Entorno, selecciona eval.

  4. En Service account, especifica la dirección de correo electrónico de la cuenta de servicio:

    apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
  5. Haz clic en Implementar y, luego, en Confirmar.

  6. Espera a que el estado de implementación eval muestre que se implementó el proxy.

Prueba el proxy de API

Se puede llamar al entorno de evaluación en la organización de Apigee con el nombre de host eval.example.com. La entrada de DNS para este nombre de host se creó dentro de tu proyecto y se resuelve en la dirección IP de la instancia de entorno de ejecución de Apigee. Esta entrada de DNS se creó en una zona privada, lo que significa que solo es visible en la red interna.

Cloud Shell no reside en la red interna, por lo que los comandos de Cloud Shell no pueden resolver esta entrada de DNS. Una máquina virtual (VM) dentro de tu proyecto puede acceder al DNS de la zona privada. Se creó automáticamente una máquina virtual llamada apigeex-test-vm. Puedes usar esta máquina para llamar al proxy de API.

  1. En Cloud Shell, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite

    El primer comando gcloud recupera la zona de la VM de prueba y, el segundo, abre la conexión SSH a la VM.

  2. Si se te solicita autorización, haz clic en Autorizar.

    Para cada pregunta que se haga en Cloud Shell, haz clic en Intro o Retorno para especificar la entrada predeterminada.

    La identidad con la que accediste es la propietaria del proyecto, por lo que se permite la conexión SSH a esta máquina.

    Tu sesión de Cloud Shell ahora se ejecuta dentro de la VM.

  3. Llama al proxy de API bank-v1 implementado en el entorno eval:

    curl -i -k "https://eval.example.com/bank/v1/_status"

    La opción -k le indica a curl que omita la verificación del certificado TLS. El entorno de ejecución de Apigee en este lab usa un certificado autofirmado en lugar de un certificado creado por una autoridad certificadora (AC) de confianza.

    Nota: No debes usar la opción -k para omitir la verificación de certificados en casos de uso de producción.

    Se devuelve un código de estado 403 Forbidden, con un mensaje de error que indica que tu cliente no tiene permiso para obtener la URL. Se rechazó la solicitud al servicio de backend porque el cliente no proporcionó el token requerido con la solicitud. El proxy de API se ejecuta con la identidad correcta, pero aún debes forzar el envío del token de identidad de OpenID Connect con la solicitud.

  4. Regresa al proxy bank-v1 y haz clic en la pestaña Desarrollo.

  5. En el menú de la izquierda del proxy, en la sección Extremos de destino > predeterminado, haz clic en PreFlow.

  6. Busca el siguiente código (tu URL será diferente):

    <HTTPTargetConnection> <Properties/> <URL>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</URL> </HTTPTargetConnection> Nota: Si no ves la sección HTTPTargetConnection, asegúrate de haber hecho clic en PreFlow en la sección Target endpoints, no en la sección Proxy endpoints.
  7. En la sección HTTPTargetConnection, debajo de la URL, agrega una sección Authentication que se vea de la siguiente manera:

    <Authentication> <GoogleIDToken> <Audience>AUDIENCE</Audience> </GoogleIDToken> </Authentication>
  8. Reemplaza AUDIENCE por el valor de URL que ya se encuentra en la sección HTTPTargetConnection. Ahora, tu código debería ser similar al siguiente, excepto que tendrá tu URL específica en los elementos URL y Audience:

    <TargetEndpoint name="default"> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <Flows/> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <HTTPTargetConnection> <Properties/> <URL>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</URL> <Authentication> <GoogleIDToken> <Audience>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</Audience> </GoogleIDToken> </Authentication> </HTTPTargetConnection> </TargetEndpoint>
  9. Haz clic en Guardar y, luego, en Guardar como revisión nueva.

  10. Haz clic en Implementar.

  11. En Entorno, usa eval.

  12. En Service account, especifica la dirección de correo electrónico de la cuenta de servicio:

    apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
  13. Haz clic en Implementar y, luego, en Confirmar.

  14. Haz clic en la pestaña Descripción general y espera a que el estado de implementación eval muestre que se implementó la revisión nueva.

Haz clic en Revisar mi progreso para verificar el objetivo. Crear el proxy de Apigee

  1. Si se agotó el tiempo de espera de tu acceso con SSH, ejecuta este comando en Cloud Shell para restablecer la conexión:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
  2. Vuelve a ejecutar el comando de estado dentro de la VM:

    curl -i -k "https://eval.example.com/bank/v1/_status"

    Ahora deberías ver una respuesta exitosa (200) similar a esta:

    HTTP/2 200 x-powered-by: Express content-type: application/json; charset=utf-8 etag: W/"41-x4uozCo6q/yN+kzizriXxryNZvc" x-cloud-trace-context: 5c810a7faa3353bcc085473fd58805b7 date: Thu, 11 Nov 2021 22:54:35 GMT server: Google Frontend content-length: 65 x-request-id: cf109193-6d6f-49a1-b323-7f66f63c5e28 via: 1.1 google {"serviceName":"simplebank-rest","status":"API up","ver":"1.0.0"}

    Esta respuesta indica que el proxy de API está llamando correctamente al servicio de backend.

  3. Ingresa el comando exit para salir de la sesión de SSH y regresar a Cloud Shell.

Tarea 3: Habilita el uso de la API de Geocoding de Google Cloud

En esta tarea, habilitarás la API de Geocoding, que se usará en tu proxy de API para agregar información de la dirección a la respuesta cuando recuperes un cajero automático del servicio de SimpleBank.

  1. En Cloud Shell, ejecuta el siguiente comando para habilitar la API de Geocoding:

    gcloud services enable geocoding-backend.googleapis.com

    A continuación, crearás una clave de API que pueda acceder a la API de Geocoding.

  2. Para crear la clave, ejecuta el siguiente comando:

    API_KEY=$(gcloud alpha services api-keys create --project=${GOOGLE_CLOUD_PROJECT} --display-name="Geocoding API key for Apigee" --api-target=service=geocoding_backend --format "value(response.keyString)") echo "export API_KEY=${API_KEY}" >> ~/.bashrc echo "API_KEY=${API_KEY}" Nota: Si recibes un error que indica que la propiedad del proyecto está establecida en la cadena vacía, asegúrate de haber salido de la sesión de SSH de la VM y de haber regresado a Cloud Shell.

    El comando gcloud crea la clave de API con la capacidad de enviar solicitudes a la API de Geocoding. Si proporcionas el parámetro --format, seleccionarás el campo keyString en la respuesta y lo almacenarás en la variable de shell API_KEY. Luego, la variable API_KEY se almacena en el archivo .bashrc en Cloud Shell.

Haz clic en Revisar mi progreso para verificar el objetivo. Habilitar el uso de la API de Geocoding de Google Cloud

  1. Para recuperar la información de geocodificación de una latitud y longitud determinadas, ejecuta el siguiente comando curl:

    curl "https://maps.googleapis.com/maps/api/geocode/json?key=${API_KEY}&latlng=37.404934,-122.021411"

    Este comando llama a la API de Geocoding y proporciona la clave de API y la latitud y longitud deseadas. La respuesta contiene un array de resultados, cada uno de los cuales tiene una dirección con formato. En tu proxy de API, usarás la dirección con formato del primer resultado para agregar una dirección a la respuesta de la API cuando recuperes los detalles de un cajero automático.

Tarea 4: Crea un flujo compartido para llamar a la API de Geocoding

En esta tarea, crearás un flujo compartido para llamar a la API de Google Geocoding. Los flujos compartidos te permiten combinar políticas y recursos en un solo flujo para que se pueda consumir desde varios proxies de API o desde otros flujos compartidos.

El flujo compartido usará este patrón:

Se muestran los mensajes CACHE HIT y CACHE MISS en los pasos Lookup Cache, Service Callout, Extract Variables y Populate Cache

La cantidad de cajeros automáticos en nuestra base de datos es limitada, y sus latitudes y longitudes no cambian. Para evitar llamadas excesivas a la API de Geocoding, la dirección recuperada se almacenará en caché con la latitud y la longitud como clave de caché. Si la dirección no está en la caché para la latitud y longitud determinadas, se llamará a la API de Geocoding y la dirección devuelta se almacenará en la caché.

Crea el flujo compartido

  1. En el menú de navegación, selecciona Apigee > Desarrollo de proxies > Flujos compartidos.
  2. Haz clic en +Crear.
  3. Establece el nombre en get-address-for-location y, luego, haz clic en Crear.
  4. Haz clic en la pestaña Desarrollo.

Agrega una política de LookupCache

La política LookupCache recuperará una dirección si se almacenó en caché anteriormente.

  1. En el menú de la izquierda del flujo compartido, en la sección Flujos compartidos, haz clic en predeterminado.

  2. En el panel sharedflows/default.xml, haz clic en el paso Agregar política (Ícono del paso Agregar política).

  3. Selecciona Create new policy.

  4. En Select policy, elige Traffic Management > Lookup Cache.

  5. En la sección Details, especifica lo siguiente:

    Propiedad Valor
    Nombre LC-LookupAddress
    Nombre visible LC-LookupAddress
  6. Haz clic en Agregar y, luego, en LC-LookupAddress.

    La política se agrega al flujo y la configuración XML de la política se muestra en el panel debajo del flujo.

  7. Verifica que la configuración de LookupCache esté en el panel y reemplázala por lo siguiente:

    <LookupCache continueOnError="false" enabled="true" name="LC-LookupAddress"> <CacheResource>AddressesCache</CacheResource> <Scope>Exclusive</Scope> <CacheKey> <KeyFragment ref="geocoding.latitude"/> <KeyFragment ref="geocoding.longitude"/> </CacheKey> <AssignTo>geocoding.address</AssignTo> </LookupCache>

    La política busca en AddressesCache una entrada que coincida con la latitud y longitud especificadas y, si la encuentra, le asigna el valor a la dirección de la variable.

Agrega una política ServiceCallout

La política ServiceCallout llamará a la API de Geocoding de Google.

  1. En el menú de la izquierda del flujo compartido, en la sección Flujos compartidos, haz clic en predeterminado.

  2. En el panel sharedflows/default.xml, haz clic en el paso Agregar política (Ícono del paso Agregar política).

  3. Selecciona Create new policy.

  4. En Seletc policy, elige Extension > Service Callout.

  5. En la sección Details, especifica lo siguiente:

    Propiedad Valor
    Nombre SC-GoogleGeocode
    Nombre visible SC-GoogleGeocode
  6. Deja el campo HTTP Target sin cambios, haz clic en Agregar y, luego, en SC-GoogleGeocode.

  7. Verifica que la configuración de ServiceCallout esté en el panel y reemplázala por lo siguiente:

    <ServiceCallout continueOnError="false" enabled="true" name="SC-GoogleGeocode"> <Request> <Set> <QueryParams> <QueryParam name="latlng">{geocoding.latitude},{geocoding.longitude}</QueryParam> <QueryParam name="key">{geocoding.apikey}</QueryParam> </QueryParams> <Verb>GET</Verb> </Set> </Request> <Response>calloutResponse</Response> <HTTPTargetConnection> <URL>https://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>

    Esta política llama a la API de Geocoding con las variables geocoding.latitude, geocoding.longitude y geocoding.apikey. La respuesta de la llamada a la API se almacena en la variable calloutResponse.

Agrega una política ExtractVariables

La política ExtractVariables extraerá la dirección con formato de la respuesta de la API de Geocoding de Google.

  1. En el menú de la izquierda del flujo compartido, en la sección Flujos compartidos, haz clic en predeterminado.

  2. En el panel sharedflows/default.xml, haz clic en el paso Agregar política (Ícono del paso Agregar política).

  3. Selecciona Create new policy.

  4. En Select policy, elige Mediación > Extract Variables.

  5. En la sección Details, especifica lo siguiente:

    Propiedad Valor
    Nombre EV-ExtractAddress
    Nombre visible EV-ExtractAddress
  6. Haz clic en Agregar y, luego, en EV-ExtractAddress.

  7. Verifica que la configuración de ExtractVariables esté en el panel y reemplázala por lo siguiente:

    <ExtractVariables continueOnError="false" enabled="true" name="EV-ExtractAddress"> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <JSONPayload> <Variable name="address"> <JSONPath>$.results[0].formatted_address</JSONPath> </Variable> </JSONPayload> <Source clearPayload="false">calloutResponse.content</Source> <VariablePrefix>geocoding</VariablePrefix> </ExtractVariables>

    Esta política usa JSONPath para extraer formatted_address del primer resultado en la carga útil JSON del mensaje calloutResponse. La dirección se almacena en la variable geocoding.address.

Agrega una política PopulateCache

La política PopulateCache almacenará la dirección en la caché.

  1. En el menú de la izquierda del flujo compartido, en la sección Flujos compartidos, haz clic en predeterminado.

  2. En el panel sharedflows/default.xml, haz clic en el paso Agregar política (Ícono del paso Agregar política).

  3. Selecciona Create new policy.

  4. En Select policy, selecciona Traffic Management > PopulateCache.

  5. En la sección Details, especifica lo siguiente:

    Propiedad Valor
    Nombre PC-StoreAddress
    Nombre visible PC-StoreAddress
  6. Haz clic en Agregar y, luego, en PC-StoreAddress.

  7. Verifica que la configuración de PopulateCache esté en el panel y reemplázala por lo siguiente:

    <PopulateCache continueOnError="false" enabled="true" name="PC-StoreAddress"> <CacheResource>AddressesCache</CacheResource> <Scope>Exclusive</Scope> <Source>geocoding.address</Source> <CacheKey> <KeyFragment ref="geocoding.latitude"/> <KeyFragment ref="geocoding.longitude"/> </CacheKey> <ExpirySettings> <TimeoutInSec>3600</TimeoutInSec> </ExpirySettings> </PopulateCache>

    La política almacena el valor en la variable address en AddressesCache con los mismos fragmentos de clave de latitud y longitud que usa la política LookupCache, en el mismo orden. El parámetro de configuración ExpirySettings/TimeoutInSec especifica que los datos almacenados se guardarán en caché durante 3,600 segundos, es decir, 1 hora.

Omite políticas de forma condicional

Cuando se encuentra la dirección en la caché para una latitud y longitud específicas (acierto de caché), las políticas ServiceCallout, ExtractVariables y PopulateCache no son necesarias y se deben omitir.

  1. En el menú de la izquierda del flujo compartido, en la sección Flujos compartidos, haz clic en predeterminado.

    El panel Código contiene el flujo predeterminado, que enumera las cuatro políticas que se adjuntaron:

    <SharedFlow name="default"> <Step> <Name>LC-LookupAddress</Name> </Step> <Step> <Name>SC-GoogleGeocode</Name> </Step> <Step> <Name>EV-ExtractAddress</Name> </Step> <Step> <Name>PC-StoreAddress</Name> </Step> </SharedFlow>

    Cada elemento Step especifica una política que se adjuntó. Name especifica el nombre de la política adjunta. También se puede agregar un elemento Condition, que especifique una condición booleana para determinar si se debe ejecutar la política.

    Vuelve a observar el patrón de flujo compartido al comienzo de la tarea. Cuando la búsqueda de direcciones se realiza correctamente, no es necesario llamar al servicio ni almacenar los datos en la caché. En este caso, se deben omitir los pasos dos, tres y cuatro de la política.

    La política LookupCache establece una variable que indica si se encontró el elemento en la caché. Si la variable lookupcache.{policyName}.cachehit es falsa, no se encontró el elemento. Las políticas de los pasos dos, tres y cuatro solo deben ejecutarse cuando no haya un acierto de caché.

  2. En el segundo, tercer y cuarto paso, agrega la siguiente condición dentro del elemento Step:

    <Condition>lookupcache.LC-LookupAddress.cachehit == false</Condition>

    Después de agregarlos todos, el flujo compartido debería verse de la siguiente manera:

    <SharedFlow name="default"> <Step> <Name>LC-LookupAddress</Name> </Step> <Step> <Condition>lookupcache.LC-LookupAddress.cachehit == false</Condition> <Name>SC-GoogleGeocode</Name> </Step> <Step> <Condition>lookupcache.LC-LookupAddress.cachehit == false</Condition> <Name>EV-ExtractAddress</Name> </Step> <Step> <Condition>lookupcache.LC-LookupAddress.cachehit == false</Condition> <Name>PC-StoreAddress</Name> </Step> </SharedFlow>
  3. Haz clic en Guardar.

  4. Haz clic en Implementar.

  5. En Entorno, usa eval.

  6. Deja en blanco el campo Service Account, haz clic en Deploy y, luego, en Confirm.

    El flujo compartido usa una clave de API para llamar a la API de Geocoding, por lo que no se requiere una cuenta de servicio.

    Un flujo compartido solo se puede probar llamándolo desde un proxy de API.

Haz clic en Revisar mi progreso para verificar el objetivo. Crear un flujo compartido para llamar a la API de Geocoding

Tarea 5: Agrega la dirección de un cajero automático cuando este se recupere

En esta tarea, agregarás una política de FlowCallout al proxy de API para llamar al flujo compartido que acabas de crear. Cuando recuperes un cajero automático específico, tu proxy de API debe extraer la latitud y la longitud de la respuesta del servicio de Cloud Run y llamar al flujo compartido para recuperar la dirección correspondiente. Luego, una política de JavaScript agregará la dirección a la respuesta de la API.

Agrega un conjunto de propiedades para la clave de API

Se puede usar un conjunto de propiedades para almacenar datos que no vencen y a los que se puede acceder fácilmente desde el proxy de API. Un valor de conjunto de propiedades contendrá la clave de API.

  1. En el menú de navegación de la izquierda, selecciona Desarrollo de proxies > Proxies de API.

  2. Haz clic en bank-v1 y, luego, selecciona la pestaña Desarrollo.

  3. En el menú de la izquierda del proxy, en la sección Resources, haz clic en Add resource (Ícono de agregar recurso).

  4. En el menú desplegable Resource type, selecciona Property Set.

  5. En Resource name, especifica geocoding.properties y, luego, haz clic en Agregar.

  6. En el panel geocoding.properties, agrega la siguiente propiedad:

    apikey=<APIKEY>
  7. Reemplaza <APIKEY> por la API_KEY que creaste en la tarea 3.

  8. Puedes recuperar API_KEY con este comando en Cloud Shell:

    echo ${API_KEY}

    Tu archivo geocoding.properties debería ser similar al siguiente:

    apikey=AIzaSyC8-B6nt7M240wwZtsxR2O5sb0xznuhQWc

Crea un flujo condicional

  1. En el menú de la izquierda del proxy, en la sección Proxy endpoints, haz clic en default.

  2. En el panel proxy-endpoints/default.xml, junto a Proxy endpoint: default, haz clic en Add conditional flow (Ícono para agregar un flujo condicional).

  3. En el diálogo Add conditional flow, especifica los siguientes valores:

    Propiedad Valor
    Nombre del flujo GetATM
    Descripción recupera un solo cajero automático
    Tipo de condición selecciona Path and Verb
    Ruta de acceso /atms/{name}
    Verbo selecciona GET

    Deja en blanco Target URL.

  4. Haz clic en Agregar.

    Un proxy de API se compone de muchos flujos. Cada uno proporciona una ubicación para adjuntar políticas como pasos. A continuación, se muestra un diagrama de un proxy de API:

    Flujo de solicitudes desde el extremo de proxy hasta el extremo de destino y, luego, el regreso de las respuestas

    Una configuración de flujo condicional solo se ejecutará cuando la condición sea verdadera. Para este flujo condicional, la variable proxy.pathsuffix debe coincidir con el formato /atms/{name}, y la variable request.verb debe ser GET.

    Adjuntarás algunas políticas al flujo condicional GetATM para que solo se ejecuten para una solicitud GET /atms/{name}. Las políticas deben ejecutarse después de que se llame al servicio de backend, por lo que deben adjuntarse en un flujo condicional de Proxy Endpoint Response.

Extrae la latitud y la longitud

  1. En la sección Response del flujo Proxy endpoint: default, a la derecha de GetATM, haz clic en Add Policy Step (Ícono del paso Agregar política).

    Nota: Asegúrate de agregar el paso al lado de Response, no al lado de Request.
  2. Selecciona Create new policy.

  3. En Select policy, elige Mediación > Extract Variables.

  4. En la sección Details, especifica lo siguiente:

    Propiedad Valor
    Nombre EV-ExtractLatLng
    Nombre visible EV-ExtractLatLng
  5. Haz clic en Agregar y, luego, en EV-ExtractLatLng.

  6. Verifica que la configuración de ExtractVariables esté en el panel y reemplázala por lo siguiente:

    <ExtractVariables name="EV-ExtractLatLng"> <Source>response</Source> <JSONPayload> <Variable name="latitude"> <JSONPath>$.latitude</JSONPath> </Variable> <Variable name="longitude"> <JSONPath>$.longitude</JSONPath> </Variable> </JSONPayload> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>

    Esta política extrae la latitud y la longitud de la respuesta JSON GET /atms/{name} del servicio de backend. El elemento IgnoreUnresolvedVariables se establece en verdadero, lo que hace que el procesamiento continúe incluso si no se encuentran la latitud y la longitud en la respuesta.

Llama al flujo compartido

  1. En la sección Response del flujo Proxy endpoint: default, a la derecha de GetATM, haz clic en Add Policy Step (Ícono del paso Agregar política).

  2. Selecciona Create new policy.

  3. En Select policy, selecciona Extension > Flow Callout.

  4. En la sección Details, especifica lo siguiente:

    Propiedad Valor
    Nombre FC-GetAddress
    Nombre visible FC-GetAddress
    Flujo compartido selecciona get-address-for-location
    Condición latitude != null AND longitude != null

    Si no se recuperó la latitud o la longitud de un cajero automático, no se puede determinar la dirección, por lo que se omite el paso de la política.

  5. Haz clic en Agregar y, luego, en FC-GetAddress.

  6. Verifica que la configuración de FlowCallout esté en el panel y reemplázala por lo siguiente:

    <FlowCallout continueOnError="false" enabled="true" name="FC-GetAddress"> <Parameters> <Parameter name="geocoding.latitude">{latitude}</Parameter> <Parameter name="geocoding.longitude">{longitude}</Parameter> <Parameter name="geocoding.apikey">{propertyset.geocoding.apikey}</Parameter> </Parameters> <SharedFlowBundle>get-address-for-location</SharedFlowBundle> </FlowCallout>

    Esta política establece las variables de latitud, longitud y apikey como parámetros del flujo compartido y llama al flujo. El flujo compartido establece la variable geocoding.address.

Agrega la dirección

  1. En la sección Response del flujo Proxy endpoint: default, a la derecha de GetATM, haz clic en Add Policy Step (Ícono del paso Agregar política).

  2. Selecciona Create new policy.

  3. En Select policy, selecciona Extension > JavaScript.

  4. En la sección Details, especifica lo siguiente:

    Propiedad Valor
    Nombre JS-AddAddress
    Nombre visible JS-AddAddress
    Archivo JavaScript Selecciona Create New Resource.
  5. En la sección Add resource, especifica lo siguiente:

    Propiedad Valor
    Fuente Selecciona Create new file.
    Nombre del recurso addAddress.js
  6. Haz clic en Agregar y, luego, selecciona addAddress.js.

  7. En Condition, especifica latitude != null AND longitude != null.

  8. Haz clic en Agregar y, luego, en JS-AddAddress.

  9. En el menú de la izquierda del proxy, en la sección Resources > jsc, haz clic en addAddress.js.

    El panel de código de addAddress.js está vacío.

  10. Agrega este código de JavaScript para agregar la dirección a la respuesta:

    // get the flow variable 'geocoding.address' var address = context.getVariable('geocoding.address'); // parse the response payload into the responsePayload object var responsePayload = JSON.parse(context.getVariable('response.content')); try { // add address to the response responsePayload.address = address; // convert the response object back into JSON context.setVariable('response.content', JSON.stringify(responsePayload)); } catch(e) { // catch any exception print('Error occurred when trying to add the address to the response.'); }

    Este código analiza la carga útil de la respuesta JSON en un objeto, agrega un campo de dirección al objeto, lo vuelve a convertir en una cadena JSON y, luego, lo almacena en la respuesta.

    Se usa un bloque try/catch para que no se arroje una excepción fuera de la política de JavaScript. Se genera una falla si no se detecta una excepción, lo que anularía el procesamiento del proxy de API.

Valida que las políticas se omitan de forma condicional

  1. En el menú de la izquierda del proxy, en la sección Proxy endpoints > default, haz clic en GetATM.

    El panel Código contiene el flujo Get ATM, que enumera las tres políticas que se adjuntaron, con condiciones en la segunda y la tercera:

    <Flow name="GetATM"> <Description>retrieve a single ATM</Description> <Request/> <Response> <Step> <Name>EV-ExtractLatLng</Name> </Step> <Step> <Condition>latitude != null AND longitude != null</Condition> <Name>FC-GetAddress</Name> </Step> <Step> <Condition>latitude != null AND longitude != null</Condition> <Name>JS-AddAddress</Name> </Step> </Response> <Condition>(proxy.pathsuffix MatchesPath "/atms/{name}") and (request.verb = "GET")</Condition> </Flow>
  2. Haz clic en Guardar y, luego, en Guardar como revisión nueva.

  3. Haz clic en Implementar.

  4. En Entorno, usa eval.

  5. En Service account, especifica la dirección de correo electrónico de la cuenta de servicio:

    apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
  6. Haz clic en Implementar y, luego, en Confirmar.

  7. Haz clic en la pestaña Descripción general y espera a que el estado de implementación eval muestre que se implementó la revisión nueva.

Haz clic en Revisar mi progreso para verificar el objetivo. Agregar la dirección de un cajero automático cuando este se recupere

Prueba el proxy de API actualizado

  1. En Cloud Shell, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
  2. Usa el siguiente comando para llamar al proxy bank-v1 y recuperar todos los cajeros automáticos:

    curl -i -k "https://eval.example.com/bank/v1/atms"

    La respuesta no contiene direcciones porque la solicitud no usa el flujo GET /atms/{name}.

  3. Recupera un solo cajero automático:

    curl -i -k "https://eval.example.com/bank/v1/atms/spruce-goose"

    Esta respuesta ahora contiene la dirección que se agregó en el proxy de API:

    {"longitude":-118.408207,"latitude":33.977601,"description":"","name":"spruce-goose","address":"5865 S Campus Center Dr, Los Angeles, CA 90094, USA"}

¡Felicitaciones!

En este lab, implementaste un servicio de backend en Cloud Run. Creaste un proxy de API de Apigee que actuó como proxy del servicio de backend. También creaste un flujo compartido que recuperó y almacenó en caché contenido de un servicio externo. Llamaste a ese flujo desde tu proxy de API y usaste código JavaScript para modificar una respuesta de la API.

Próximos pasos y más información

Última actualización del manual: 16 de julio de 2024

Prueba más reciente del lab: 16 de julio de 2024

Copyright 2025 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.

Antes de comenzar

  1. Los labs crean un proyecto de Google Cloud y recursos por un tiempo determinado
  2. .
  3. Los labs tienen un límite de tiempo y no tienen la función de pausa. Si finalizas el lab, deberás reiniciarlo desde el principio.
  4. En la parte superior izquierda de la pantalla, haz clic en Comenzar lab para empezar

Usa la navegación privada

  1. Copia el nombre de usuario y la contraseña proporcionados para el lab
  2. Haz clic en Abrir la consola en modo privado

Accede a la consola

  1. Accede con tus credenciales del lab. Si usas otras credenciales, se generarán errores o se incurrirá en cargos.
  2. Acepta las condiciones y omite la página de recursos de recuperación
  3. No hagas clic en Finalizar lab, a menos que lo hayas terminado o quieras reiniciarlo, ya que se borrará tu trabajo y se quitará el proyecto

Este contenido no está disponible en este momento

Te enviaremos una notificación por correo electrónico cuando esté disponible

¡Genial!

Nos comunicaremos contigo por correo electrónico si está disponible

Un lab a la vez

Confirma para finalizar todos los labs existentes y comenzar este

Usa la navegación privada para ejecutar el lab

Usa una ventana de navegación privada o de Incógnito para ejecutar el lab. Así evitarás cualquier conflicto entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.