IBM Cloud Docs
App web sin servidor y gestión de sucesos para el análisis y la recuperación de datos

App web sin servidor y gestión de sucesos para el análisis y la recuperación de datos

Esta guía de aprendizaje puede incurrir en costes. Utilice Estimador de costes para generar una estimación del coste basada en el uso previsto.

En esta guía de aprendizaje, creará una aplicación para recopilar automáticamente las estadísticas de tráfico de GitHub para los repositorios y proporcionará la base para el análisis del tráfico. GitHub solo proporciona acceso a los datos del tráfico de los últimos 14 días. Si desea analizar estadísticas correspondientes a un periodo de tiempo más largo, debe descargar y almacenar los datos usted mismo. En esta guía de aprendizaje, desplegará una app sin servidor en un proyecto de IBM Cloud Code Engine. La app gestiona los metadatos para repositorios de GitHub y proporciona acceso a las estadísticas para el análisis de datos. Los datos de tráfico se recopilan de GitHub ya sea bajo demanda en la app o por desencadenamiento por parte de sucesos de Code Engine, p. ej., diariamente. La app que se describe en esta guía de aprendizaje implementa una solución con capacidad de varios arrendatarios con el conjunto de características inicial para dar soporte a la modalidad de un solo arrendatario.

de arquitectura*Diagrama de arquitectura del

Objetivos

  • Despliegue de una app de base de datos Python contenerizada con soporte de varios arrendatarios y acceso seguro
  • Integración del ID de la app como proveedor de autenticación basado en OpenID Connect
  • Configuración de la recopilación automatizada y sin servidor de estadísticas de tráfico de GitHub

Antes de empezar

Esta guía de aprendizaje requiere:

  • CLI de IBM Cloud,
    • plug-in de IBM Cloud Code Engine,
    • plug-in de IBM Cloud® Container Registry,
  • una cuenta de GitHub.

Puede ejecutar las secciones que requieren un shell en IBM® Cloud Shell.

Encontrará instrucciones para descargar e instalar estas herramientas para su entorno operativo en la guía de Iniciación a las guías de aprendizaje.

Configuración del servicio y del entorno (shell)

En esta sección, se configuran los servicios necesarios y se prepara el entorno. Todo esto se puede realizar desde el entorno de shell (terminal).

  1. Si no está conectado, utilice ibmcloud login o ibmcloud login --sso para conectarse de forma interactiva.

  2. Ejecute el mandato ibmcloud target para el grupo de recursos y la región.

    RESOURCE_GROUP_NAME=Default
    REGION=us-south
    ibmcloud target -r $REGION -g $RESOURCE_GROUP_NAME
    
  3. Cree una instancia de IBM Db2 SaaS con el plan gratuito (lite) y llámela ghstatsDB.

    ibmcloud resource service-instance-create ghstatsDB dashdb-for-transactions free $REGION
    
  4. Cree una instancia del servicio App ID. Utilice ghstatsAppID como nombre y el plan Por niveles.

    ibmcloud resource service-instance-create ghstatsAppID appid graduated-tier $REGION
    
  5. Añada un espacio de nombres nuevo ghstats a IBM Cloud® Container Registry. Lo va a utilizar para hacer referencia a las imágenes de contenedor. Hay un registro global, así como registros regionales. Utilice el registro global.

    ibmcloud cr region-set global
    NAMESPACE=ghstatsYourInitials
    ibmcloud cr namespace-add $NAMESPACE
    

Preparación de Code Engine (shell)

Con los servicios suministrados y la configuración general realizada, lo siguiente es crear el proyecto de Code Engine, crear una imagen de contenedor para la app y desplegarla.

  1. Cree un proyecto de Code Engine llamado ghstats. El mandato los establece automáticamente como el contexto de Code Engine actual.
    ibmcloud ce project create --name ghstats
    
  2. Cree una configuración de compilación de Code Engine, es decir, configure el proyecto para que compile la imagen de contenedor por usted. Toma el código del repositorio de GitHub para este tutorial y almacena la imagen en el registro en el espacio de nombres creado previamente utilizando la información del usuario registrado.
    ibmcloud ce build create --name ghstats-build --source https://github.com/IBM-Cloud/github-traffic-stats  --context-dir /backend --commit master --image private.icr.io/$NAMESPACE/codeengine-ghstats
    
  3. Observe que el mandato de creación de compilación ha tenido el efecto secundario de crear un secreto de acceso de registro que permitirá al proyecto escribir y leer IBM Cloud® Container Registry.
    ibmcloud ce registry list
    
  4. A continuación, ejecute el proceso de compilación real.
    ibmcloud ce buildrun submit --build ghstats-build
    
    La salida indica más mandatos a ejecutar para seguir los registros de estado de la compilación a medida que progresa. Similar a:
    ibmcloud ce buildrun logs -f -n ghstats-build-run-123456-123456789
    

Despliegue de la app (shell)

Una vez que la compilación esté lista, puede utilizar la imagen de contenedor para desplegar la app, enlazando posteriormente los servicios suministrados anteriormente.

  1. Desplegar la aplicación significa crear una app de Code Engine llamada ghstats-app. Extrae la imagen del registro y del espacio de nombres dados.

    ibmcloud ce app create --name ghstats-app --image private.icr.io/$NAMESPACE/codeengine-ghstats:latest --registry-secret ce-auto-icr-private-global
    

    Una vez que la app se ha desplegado, puede comprobar que está disponible en el URL que se muestra en la salida. La app no está configurada y por lo tanto no se puede utilizar todavía. Puede comprobar el estado del despliegue mediante ibmcloud ce app list o puede obtener detalles ejecutando ibmcloud ce app get --name ghstats-app.

    De forma predeterminada, el escalado mínimo es cero (0). Esto significa que Code Engine reduce las instancias en ejecución a cero si no hay carga de trabajo en la app. Esto ahorra costes, pero requiere un breve reinicio de la app cuando se escala desde cero de nuevo. Puede evitarlo mediante el parámetro --min 1 al crear o actualizar la app.

  2. Para utilizar los servicios suministrados, debe enlazarlos a la app. En primer lugar, enlace IBM Db2 SaaS, después App ID:

    ibmcloud ce application bind --name ghstats-app --service-instance ghstatsDB
    
    ibmcloud ce application bind --name ghstats-app --service-instance ghstatsAppID
    

    Cada application bind crea los siguientes recursos y relaciones:

    1. Un ID deIAM Service.
    2. Se crea una clave de API de IAM en el ID de IAM Service.
    3. Una clave de servicio de recurso. Se denominan (Credenciales de servicio en la consola de IBM Cloud. Intente el mandato siguiente para visualizar la entrada App ID:
    ibmcloud resource service-keys  --instance-name ghstatsAppID
    

    En lugar de enlazar los servicios a la app, también puede utilizar secretos o configmaps. Se pueden llenar a partir de valores almacenados en archivos o pasarse como literales. En el repositorio de GitHub de este tutorial hay un archivo de muestra de secretos e instrucciones relacionadas.

Configuración del ID de app y de GitHub (navegador)

Los pasos siguientes se llevan a cabo mediante el navegador de Internet. En primer lugar, configure App ID de modo que utilice Cloud Directory y trabaje con la app. A continuación, cree una señal de acceso de GitHub. La app la necesita para recuperar los datos de tráfico.

  1. En la Lista de recursos de IBM Cloud®, abra la visión general de los servicios. Localice la instancia del servicio App ID en la sección Servicios. Pulse la entrada para abrir los detalles.

  2. En el panel de control del servicio, pulse Gestionar autenticación en el menú de la parte izquierda. Aparecerá una lista de los proveedores de identidades disponibles, como Facebook, Google, SAML 2.0 Federation y Cloud Directory. Cambie el valor de Cloud Directory por Enabled y deje todos los demás proveedores en Disabled.

    Es posible que desee configurar la Autenticación de varios factores (MFA) y reglas de contraseña avanzadas. Estos temas no quedan cubiertos en esta guía de aprendizaje.

  3. Pulse sobre el separador Valores de autenticación en el mismo cuadro de diálogo. En Añadir URL de redirección web especifique el url de la aplicación + /redirect_uri, por ejemplo https://ghstats-app.56ab78cd90ef.us-south.codeengine.appdomain.cloud/redirect_uri.

    Para probar la app localmente, el URL de redirección es http://127.0.0.1:5000/redirect_uri. Puede configurar varios URL de redirección. Para probar la app localmente, copie .env.local.template en .env, adáptelo e inicie la app mediante python3 ghstats.py.

  4. En el menú de la izquierda, amplíe Directorio en la nube y pulse Usuarios. Se abre la lista de usuarios en el directorio de Cloud. Pulse el botón Crear usuario para añadirse como primer usuario. Ahora ha terminado de configurar el servicio App ID.

  5. En el navegador, visita Github.com y ve a Configuración -> Configuración de desarrollador -> Tokens de acceso personales. Haga clic en el botón Generar nuevo token (clásico). Especifique GHStats Tutorial para la Nota. Luego habilite public_repo bajo la categoría repo y read:org bajo admin:org. Ahora, en la parte inferior de esta página, pulse Generar señal. La nueva señal de acceso se visualiza en la página siguiente. Lo necesita durante la siguiente configuración de la aplicación.

    GitHub Token de Acceso
    GitHub Token de Acceso

Configuración y prueba de la app Python

Después de la preparación, debe configurar y probar la app. La aplicación está escrita en Python con el popular microframework Flask. Puede añadir repositorios para la recopilación de estadísticas o eliminarlos. Puede acceder a los datos de tráfico en una vista tabular o como gráfico de líneas.

  1. En un navegador, abra el URI de la app desplegada. Debería ver una página de bienvenida.

    Pantalla de bienvenida
    Pantalla de bienvenida

  2. En el navegador, añada /admin/initialize-app al URI y acceda a la página. Se utiliza para inicializar la aplicación y sus datos. Pulse el botón Iniciar inicialización. Esto le llevará a una página de configuración protegida con contraseña. La dirección de correo electrónico con la que se inicia la sesión se toma como identificación para el administrador del sistema. Utilice la dirección de correo electrónico y la contraseña que ha configurado anteriormente.

  3. En la página de configuración, escriba un nombre (se utiliza para el saludo), su nombre de usuario de GitHub y la señal de acceso que ha generado antes. Pulse Inicializar. Esto crea las tablas de base de datos e inserta algunos valores de configuración. Por último, crea registros de base de datos para el administrador del sistema y un arrendatario.

    Primer paso
    Primer paso

  4. Una vez realizado, se le lleva a la lista de repositorios gestionados. Ahora puede añadir repositorios proporcionando el nombre de la cuenta de GitHub o la organización y el nombre del repositorio. Después de especificar los datos, pulse Añadir repositorio. El repositorio, junto con un identificador que se acaba de asignar, deberían aparecer en la tabla. Puede eliminar repositorios del sistema especificando su ID y pulsando Suprimir repositorio.

    Lista de repositorios
    Lista de repositorios

  5. Para probar, pulse Administración y, a continuación, Recopilar estadísticas. Esto recupera los datos de tráfico bajo demanda. A continuación, pulse Repositorios y Tráfico diario. Debe mostrar los datos recopilados.

    Datos de tráfico
    Datos de tráfico

Configuración de la recuperación de datos diaria (shell)

Con la app en su sitio y configurada, la última parte es iniciar la recuperación diaria de los datos de tráfico de GitHub. Va a crear una suscripción de cron. De forma similar a un cron job, la aplicación se suscribe a eventos en el horario especificado (eventing).

  1. Cree la suscripción de cron ghstats-daily con una planificación diaria a las 6 AM UTC con un suceso POST en la vía de acceso /collectStats. Sustituya SECRET_TOKEN_AS_IDENTIFIER por el valor del secreto elegido. Se utiliza para dar a conocer a la app el suministrador de sucesos.

    ibmcloud ce subscription cron create --name ghstats-daily --destination ghstats-app --path /collectStats --schedule '0 6 * * *' --data '{"token":"SECRET_TOKEN_AS_IDENTIFIER"}' --content-type application/json
    
  2. Para dar a conocer la señal secreta a la app, actualice la app. Sustituya SECRET_TOKEN_AS_IDENTIFIER por el valor que ha seleccionado en el paso anterior.

    ibmcloud ce app update --name ghstats-app --registry-secret usicr --env EVENT_TOKEN=SECRET_TOKEN_AS_IDENTIFIER
    

    Esto crea una revisión de app nueva. Puede comprobar que la app ha recibido y procesado los sucesos accediendo en la app a Administración y luego a Registro del sistema.

    El mandato anterior crea una planificación diaria para las 6 am UTC. Para comprobar directamente que la gestión de sucesos funciona, elija una hora unos minutos después de la hora actual, convertida a UTC.

Conclusiones

En esta guía de aprendizaje, ha desplegado una app sin servidor en IBM Cloud Code Engine. El código fuente de la app se saca de un repositorio de GitHub. Ha dado instrucciones a Code Engine para crear la imagen de contenedor y almacenarla en IBM Cloud® Container Registry. A continuación, se ha extraído de allí y se ha desplegado como contenedor. La app está enlazada a los servicios de IBM Cloud.

La app y la gestión de sucesos asociada permiten recuperar automáticamente los datos sobre el tráfico de los repositorios GitHub. La información sobre esos repositorios, incluida la señal de acceso específica del arrendatario, se almacena en una base de datos de SQL (IBM Db2 Warehouse SaaS). La app de Python utiliza esta base de datos para gestionar usuarios y repositorios y para presentar estadísticas sobre tráfico. Los usuarios pueden ver las estadísticas de tráfico en las tablas de búsqueda o visualizadas en un gráfico de líneas simple (vea la imagen siguiente). También se puede descargar la lista de repositorios y los datos sobre el tráfico como archivos CSV.

Gráfico de líneas
Gráfico de líneas

Seguridad: rotar credenciales de servicio

Si utiliza esta solución en producción, debería rotar las credenciales de servicio de forma regular. Muchas políticas de seguridad tienen como requisito cambiar las contraseñas y credenciales cada 90 días o una frecuencia similar.

Puede volver a crear y, por lo tanto, rotar las credenciales de los servicios enlazadas a la app desenlazando y, a continuación, enlazando los servicios de nuevo. Al utilizar secretos en lugar de enlaces de servicio, incluso tiene más opciones, volviendo a crear primero las claves de servicio y actualizando luego los secretos y actualizando la app como último paso.

Eliminación de recursos

Para limpiar los recursos utilizados para esta guía de aprendizaje, puede suprimir el proyecto y los servicios relacionados.

  1. Desenlace los servicios suministrados. En primer lugar, visualice los enlaces y, a continuación, suprímalos por Nombres de enlaces de servicio (FIRST y SECOND a continuación son de la salida de obtención)
    ibmcloud ce application get --name ghstats-app
    
    ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-FIRST
    
    ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-SECOND
    
  2. Suprima el proyecto y los componentes correspondientes.
    ibmcloud ce project delete --name ghstats --hard -f
    
  3. Suprima los servicios:
    ibmcloud resource service-instance-delete -f ghstatsDB
    
    ibmcloud resource service-instance-delete -f ghstatsAppID
    
  4. Eliminar el espacio de nombres Container Registry
    ibmcloud cr namespace-rm $NAMESPACE -f
    
  5. Suprima la señal de Github.com

En función del recurso, es posible que no se suprima de inmediato sino que se retenga (durante 7 días de forma predeterminada). Puede reclamar el recurso suprimiéndolo de forma permanente o lo puede restaurar dentro del periodo de retención. Consulte este documento sobre cómo utilizar una reclamación de recurso.

Ampliación de la guía de aprendizaje

¿Desea ampliar o modificar esta guía de aprendizaje? Estas son algunas de las ideas:

  • Amplíe la app para el soporte de varios arrendatarios.
  • Utilice proveedores de identidades sociales.
  • Añada un selector de fechas a la página de estadísticas para filtrar los datos mostrados.
  • Utilice una página de inicio de sesión personalizada para App ID.

Contenido relacionado

Estos son algunos enlaces con información adicional sobre los temas tratados en esta guía de aprendizaje. La aplicación está disponible en este repositorio de GitHub.

Documentación: