Introducción
Crear e implementar recursos manualmente en Azure y otros proveedores de la nube es relativamente fácil y, en algunos casos, puede ser suficiente. Sin embargo, la mayoría de las veces, los recursos implementados deberán cambiar con el tiempo, lo que a su vez requiere mucho trabajo adicional para mantener y redistribuir los recursos. Para automatizar estas tareas, los desarrolladores y profesionales de datos pueden utilizar un enfoque de infraestructura como código (IaC) y crear canales para una integración e implementación continuas (CI/CD). Este enfoque permite a los desarrolladores escribir código que defina y vuelva a implementar recursos automáticamente cada vez que se realizan cambios.
En esta guía paso a paso, crearemos canalizaciones para que una aplicación de procesamiento de datos realice las siguientes tareas:
- Aprovisionar un registro de contenedor
- construir y enviar una imagen de Docker al registro
- crear una instancia de contenedor que ejecute la carga de trabajo de procesamiento de datos
- habilitar el acceso de ‘identidad administrada’ a Azure Key Vault, lo que permite que nuestra aplicación recupere claves de acceso a otros recursos, como cuentas de almacenamiento
- implementar los recursos anteriores en un entorno de prueba y producción utilizando diferentes activadores para ejecutar las canalizaciones
Empezando
A efectos de demostración, la aplicación en sí consta de un script R muy simple que carga un conjunto de datos, imprime las primeras filas y devuelve el conjunto de datos a una cuenta de almacenamiento. Tenga en cuenta que el código de la aplicación no es importante para el resto del proceso y puede sustituirse fácilmente por su propio código.
Para comenzar necesitará una cuenta de Azure. Quizás también quieras instalar la CLI de Azure en su sistema local. Sin embargo, también puede optar por ejecutar comandos de la CLI de Azure a través de Cloud Shell que se encuentra en Azure Portal.
A medida que nuestra aplicación transfiere datos hacia y desde Azure Blob Storage y regresa, puede resultarle útil instalar Azure Storage Explorer, lo que facilita un poco la carga de archivos y la verificación de que la aplicación se ejecuta correctamente y devuelve los datos procesados.
Paso 1: clonar el repositorio y configurar recursos estáticos.
Primero necesitarás clonar este repositorio. El archivo README detalla cómo hacer esto usando RStudio, pero puedes usar tu IDE preferido.
A continuación, utilizando Azure Portal, cree los siguientes recursos:
- un grupo de recursos que contendrá todos los demás recursos.
- una cuenta de almacenamiento con un contenedor de blobs con dos carpetas: una para archivos de entrada y otra para archivos de salida. En nuestro caso, estos deberían denominarse “entrada” y “salida”, respectivamente. Almacene un pequeño conjunto de datos como un archivo csv llamado ‘input_data.csv’ dentro del contenedor de entrada.
- un almacén de claves en el que deberá almacenar la clave de acceso principal a su cuenta de almacenamiento como secreto.
En el paso 3, necesitará el nombre de su almacén de claves, así como el nombre de su secreto que contiene la clave de acceso principal.
Paso 2: vincular GitHub a Azure
Para actualizar los recursos de Azure, debemos otorgar permiso a GitHub para hacerlo.
Primero, inicie sesión en su cuenta de Azure mediante la CLI de Azure.
az login
Luego copia el id valor de la salida JSON, que es la identificación de la suscripción. Pegue la identificación de la suscripción en el siguiente comando y ejecútelo. Esto crea una ‘principal de servicio’ con control de acceso basado en roles, que puede considerarse como un usuario que actúa en su nombre al implementar o actualizar recursos con un flujo de trabajo de GitHub Actions.
az ad sp create-for-rbac \
--name "your-app-name" \
--role Owner \
--scopes /subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group-name> \
--sdk-auth
Copie la salida JSON completa, vaya a su repositorio de GitHub y haga clic en configuración > Secretos y variables > Acciones.
Cree un nuevo secreto de repositorio y asígnele el nombre AZURE_CREDENTIALS. Pegue el resultado JSON del comando anterior y guárdelo.
Paso 3: modificar scripts
En este escenario, estamos implementando un script R simple que no hace mucho. Como tal, el Dockerfile también se mantiene muy simple. Obviamente, ambos archivos deberán modificarse según sus requisitos y su lenguaje de programación preferido. Sin embargo, si es nuevo en esto, podría resultar útil poner en marcha su canalización con el código tal como está antes de aplicar su propio código.
Si elige continuar con el script R actual (guión.R), sólo necesitarás modificar los valores {keyvault-name} , {access-key-name} y {storage-account-name} (omitiendo los corchetes).
A continuación, modifique los siguientes valores en env: en los dos archivos de flujo de trabajo llamados flujo de trabajo.yml y flujo de trabajo_release_prod.yml en el .github/flujos de trabajo/ directorio:
env:
RESOURCEGROUP_NAME: my-rg
REGISTRY_NAME: my-cr
SHORT_NAME: mycr
ACI_NAME: my-ci-test
KV_NAME: my-kv
ENVIRONMENT: test
CPU: 1
MEMORY: 1.5
Paso 4: ejecutar la instancia de canalización y contenedor
Cuando todos los cambios relevantes se hayan realizado y enviado a la rama ‘principal’, debería ver su canalización ejecutándose en el panel Acciones. Esto se debe a que el flujo de trabajo está configurado con un activador de rama para que se ejecute cuando se actualice la rama principal.
Si no encuentra ningún error, su instancia de contenedor debería estar lista para ejecutarse en aproximadamente diez minutos. Vaya al portal de Azure, busque su nueva instancia de contenedor y haga clic en Iniciar. En el panel Registros, es posible que vea su script ejecutándose en la consola. Una vez completado, verifique que haya un nuevo archivo cv llamado datos_salida.csv ha aterrizado en la carpeta ‘salida’ de su contenedor de blobs.
¡Y eso es! Si lo desea, ahora puede activar manualmente el segundo flujo de trabajo que crea una instancia de contenedor idéntica destinada a cargas de trabajo de producción.
Para comprender lo que sucede en el proceso de CI/CD, lea la sección siguiente.