Pequeña consola .NET que ejecuta un pipeline de Azure Data Factory (ADF) vía REST, enviando parámetros y verificando lo que ADF registró en el run.
- Obtiene un token de Azure AD con client credentials para el scope
https://management.azure.com/.default. - Llama al endpoint de ADF
Pipelines - Create Runpara iniciar un pipeline y le envía parámetros en el cuerpo JSON (forma plana: claves/valores en la raíz). - Muestra en consola el
REQUEST BODY, elSTATUS/RESPONSE BODYy, tras crear el run, hace un GET apipelineruns/{runId}para imprimir los detalles del run, incluidos losparametersque ADF registró.
Esto ayuda a:
- Automatizar ejecuciones de pipelines desde código.
- Diagnosticar por qué parámetros no están llegando o aparecen con tipos inesperados.
- .NET 9 SDK
- Suscripción de Azure con ADF y un pipeline publicado.
- Aplicación en Azure AD (App registration) con permiso para
Azure Service Managementy un secreto de cliente (client secret) válido.
El proyecto lee la configuración desde variables de entorno y/o User Secrets (solo desarrollo). Las claves requeridas son:
AZURE_TENANT_IDAZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_SUBSCRIPTION_IDADF_RESOURCE_GROUPADF_FACTORY_NAMEADF_PIPELINE_NAME
Puedes definirlas de dos formas:
- Variables de entorno (recomendado en CI/CD y producción)
- Windows PowerShell (temporal en la sesión):
$env:AZURE_TENANT_ID = "<tu-tenant-id>"- Repite para todas las claves requeridas.
- Windows (persistente para el usuario):
setx AZURE_TENANT_ID "<tu-tenant-id>"- Repite para cada clave. Abre una nueva sesión para que apliquen.
- User Secrets (solo local)
- Asegúrate de que el proyecto tenga
UserSecretsId(ya configurado en este repo). - Crea o edita el archivo
secrets.jsonen el directorio de User Secrets de tu usuario y coloca este contenido de ejemplo:
{
"AZURE_TENANT_ID": "00000000-0000-0000-0000-000000000000",
"AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
"AZURE_CLIENT_SECRET": "<no-lo-expongas>",
"AZURE_SUBSCRIPTION_ID": "00000000-0000-0000-0000-000000000000",
"ADF_RESOURCE_GROUP": "<tu-rg>",
"ADF_FACTORY_NAME": "<tu-factory>",
"ADF_PIPELINE_NAME": "<tu-pipeline>"
}
El código usa Microsoft.Extensions.Configuration para leer primero variables de entorno y después User Secrets.
En Program.cs hay un diccionario parameters con las claves/valores a enviar (forma plana):
{
"Filial": "1000095671",
"nPActivo": 70005908,
"nPAnterior": 70005906,
"Ciclo": 5,
"Escuela": "1,2,3,...",
"Tipo": 2,
"Programa": 1
}
Asegúrate que en ADF el pipeline define parámetros con exactamente esos nombres y tipos.
Importante en ADF:
- Define los parámetros en el pipeline (no solo en actividades).
- Dentro de las actividades, usa
@pipeline().parameters.<Nombre>(ej.:@pipeline().parameters.Filial). - Publica los cambios (Publish All). La API ejecuta la versión publicada.
- Configura las credenciales y valores de ADF (ver Configuración).
- Restaura/compila y ejecuta el proyecto.
- Observa la consola: verás el
REQUEST BODY, la respuesta decreateRuny luegoPIPELINE RUN DETAILScon los parámetros que ADF registró.
- Si en
PIPELINE RUN DETAILSves que losparameterstienen los valores correctos, pero tu actividad recibenullo valores por defecto, revisa mapeos dentro del pipeline (uso de@pipeline().parameters.*) y publicaciones. - Si los
parametersaparecen como un string JSON (con llaves y comillas), tu parámetro en ADF es de tipoString. Cámbialo aObjecto envía parámetros individuales. - Si quieres enviar un único parámetro
Object(por ejemploparameters), cambia tu pipeline para que defina un parámetroObjecty adapta el cuerpo a:
{
"parameters": {
"parameters": { "Filial": "...", "nPActivo": 70005908, ... }
}
}
Y dentro de las actividades usa @pipeline().parameters.parameters.Filial.
POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.DataFactory/factories/{factoryName}/pipelines/{pipelineName}/createRun?api-version=2018-06-01- El código también realiza
GET .../pipelineruns/{runId}para mostrar los parámetros registrados en el run.
- No incluyas secretos en el repositorio.
- Usa User Secrets en desarrollo local y variables de entorno/secretos del sistema en CI/CD.
- El token se solicita con
client_credentialsyscopede ARM:https://management.azure.com/.default.
- 401/403: revisa credenciales, rol/permisos del principal y el scope del token.
- 404: valida
subscriptionId,resourceGroup,factoryNameypipelineName. - Parámetros vacíos: confirma nombres y tipos, que estén definidos en el pipeline y que uses
@pipeline().parameters.*. Publica los cambios. - Diferencia de formas del cuerpo:
- Forma plana (este repo): parámetros en la raíz del JSON.
- Forma anidada:
{ "parameters": { ... } }si prefieres seguir literalmente el ejemplo HTTP de la documentación.
MIT (o la que prefieras).