Azure Functions y dejar que Azure se enc ...

Azure Functions y dejar que Azure se encargue de casi todo por vos

Nov 14, 2025

image
De cero a ¿quién es este artista? con Azure Functions y Python

Encuentra el código completo aca:


https://github.com/joseantcloud/GetArtistInfo/tree/main/musicbraizfuncx

A veces querés hacer algo simple pero útil: por ejemplo, escribir una pequeña API que reciba el nombre de un artista y te devuelva info básica desde una base de datos pública de música.

Podrías montar un servidor completo, instalar frameworks, configurar puertos, pensar en escalabilidad… o podés usar Azure Functions y dejar que Azure se encargue de casi todo por vos.

En esta guía vamos a crear una función serverless en Azure que llama a la API de MusicBrainz y te devuelve, en JSON, algunos datos de los artistas que busques.

¿Qué es la API de MusicBrainz?

MusicBrainz es como una Wikipedia de la música: una base de datos abierta donde hay info de artistas, discos, canciones, etc.

La API de MusicBrainz es simplemente una forma de hablar con esa base de datos usando HTTP:

- vos mandás una URL con un parámetro (por ejemplo, ?query=metallica)

- la API te responde en JSON con una lista de artistas que coinciden con la búsqueda.

Nada raro: es la típica API REST, perfecta para practicar.

¿Y qué es eso de “serverless” en Azure Functions?

Cuando escuchás serverless, no significa que no haya servidores. Los hay, pero:

- vos no los administrás (no configurás máquinas, ni IIS, ni Nginx).

- sólo escribís funciones: pequeños pedazos de código que se ejecutan cuando pasa algo.

- Azure se encarga de levantar instancias, escalar, apagar, etc.

En nuestro caso, ese “algo” es una llamada HTTP.

Cuando alguien entra a:

https://TU-FUNC-APP.azurewebsites.net/api/GetArtistInfo?artist=metallica

Como creas el proyecto:

mkdir MusicFunction
cd MusicFunction
func init . --worker-runtime python --model V2

Ese comando crea algo como:


MusicFunction/

host.json

local.settings.json

requirements.txt

function_app.py

Acá es donde entra lo interesante: en el modelo V2 todo vive en function_app.py.
Abrí requirements.txt y dejalo con esto:

azure-functions
requests

Después instalás:

pip install -r requirements.txt

Con esto tu función ya va a poder:

  • hablar con Azure (azure-functions)

  • llamar a APIs externas (requests)

El corazón del proyecto: function_app.py



import logging
import json

# SDK de Azure Functions
import azure.functions as func 
# para llamar a la API REST externa
import requests                

# 1) Creamos el objeto principal de Functions (modelo V2, un solo archivo)
app = func.FunctionApp()


# 2) Definimos una Function HTTP:
#    - Nombre interno-> "GetArtistInfo"
#    - Ruta pública->   /api/GetArtistInfo
#    - Método->        GET
#    - Auth->         ANONYMOUS (no requiere token, ideal para pruebas)
@app.function_name(name="GetArtistInfo")
@app.route(route="GetArtistInfo",
          methods=["GET"],
          auth_level=func.AuthLevel.ANONYMOUS)
def get_artist_info(req: func.HttpRequest) -> func.HttpResponse:
    """
    Esta función recibe un HttpRequest de Azure.
    Espera un parámetro en la URL llamado "artist", ejemplo:
        ?artist=Red+Hot+Chili+Peppers

    Devuelve un JSON con los primeros artistas encontrados en MusicBrainz.
    """

    # --- Paso 1: leer el parámetro "artist" de la query-string ---
    artist = req.params.get("artist")

    # Si el usuario no manda artista, usamos uno de ejemplo
    if not artist:
        artist = "Red Hot Chili Peppers"

    logging.info(f"Buscando artista en MusicBrainz: {artist}")

    # --- Paso 2: preparar la llamada a la API de MusicBrainz ---
    url = "https://musicbrainz.org/ws/2/artist"   # endpoint de artistas
    params = {
        "query": artist,   # texto a buscar
        "fmt": "json"      # queremos respuesta en JSON
    }
    headers = {
        # MusicBrainz pide que identifiquemos la app con un User-Agent
        "User-Agent": "AzureFuncDemo/1.0 ([email protected])"
    }

    try:
        # --- Paso 3: hacer la petición HTTP GET a la API externa ---
        r = requests.get(url, params=params, headers=headers, timeout=10)

        # Si la API respondió con error (404, 500, etc.), lo propagamos
        if r.status_code != 200:
            return func.HttpResponse(
                f"Error en MusicBrainz: {r.status_code}",
                status_code=500
            )

        # Convertimos el cuerpo JSON a un diccionario de Python
        data = r.json()

        # --- Paso 4: simplificar la respuesta ---
        artistas = []
        for a in data.get("artists", [])[:3]:  # solo los 3 primeros
            artistas.append({


                "name": a.get("name"),  
                "country": a.get("country"),   
                "score": a.get("score")       
            })

        # --- Paso 5: construir el JSON de salida que verá el usuario ---
        body = json.dumps(
            {
                "busqueda": artist,
                "resultados": artistas
            },
            ensure_ascii=False,  
            indent=2         
        )

        # --- Paso 6: devolver respuesta HTTP 200 con JSON ---
        return func.HttpResponse(
            body,
            mimetype="application/json",
            status_code=200
        )

    except Exception as e:
        # Cualquier excepción no controlada llega aquí
        logging.error(f"Error en GetArtistInfo: {e}")
        return func.HttpResponse(
            "Error interno en el servidor.",
            status_code=500
        )

¿Qué está pasando acá, en criollo?

  • La línea app = func.FunctionApp() crea la “app de funciones”.

  • El decorador @app.function_name le pone nombre dentro de Azure: GetArtistInfo.

  • El decorador @app.route dice que esta función:

  • responde por HTTP,

  • en la ruta /api/GetArtistInfo,

  • usando el método GET,

  • y que cualquiera la puede llamar (auth anónima).

  • Adentro de la función:

  • leés el parámetro artist de la URL,

  • si no viene, usás un artista de ejemplo,

  • llamás a MusicBrainz con requests.get,

  • te quedás con los primeros 3 resultados,

  • y devolvés un JSON prolijo al usuario.

  • Probarlo en tu máquina

    func start
    
    Functions:
    
            GetArtistInfo: [GET] http://localhost:7071/api/GetArtistInfo
    
    Podés abrir en el navegador:
    
    Con artista por defecto:
    
    http://localhost:7071/api/GetArtistInfo
    
    
    Buscando otro artista:
    
    http://localhost:7071/api/GetArtistInfo?artist=metallica
    
    
    Y vas a ver el JSON con los resultados.

    Llevarlo a la nube (sin drama)

    Una vez que lo probaste localmente, viene la parte mágica: subirlo a Azure.
    --> esta parte la podes ver también en el video

    1. Crear recursos en Azure

    En la terminal:

    az group create -n musicbrainz-rg -l eastus
    
    az storage account create 
      -n musicbrainzstorage123 
      -g musicbrainz-rg 
      -l eastus
      --sku Standard_LRS
    
    az functionapp create 
      -g musicbrainz-rg
      -n musicbrainzfunc123
      --storage-account musicbrainzstorage123
      --consumption-plan-location eastus
      --runtime python
      --functions-version 4 
      --os-type linux
    

2. Publicar la Function App

Desde la carpeta donde está tu function_app.py:

func azure functionapp publish musicbrainzfunc123

Cuando termina, te muestra una URL de invocación:

Invoke url: https://musicbrainzfunc123.azurewebsites.net/api/GetArtistInfo

Ya está en la nube. Probala igual que en local:

https://musicbrainzfunc123.azurewebsites.net/api/GetArtistInfo
https://musicbrainzfunc123.azurewebsites.net/api/GetArtistInfo?artist=Coldplay

¿Por qué este ejemplo ?

  • qué es una API REST (MusicBrainz),

  • qué significa serverless en la práctica (no hay que prender servidores),

  • qué es una Function App y una Function,

  • cómo leer parámetros de una URL,

  • cómo devolver un JSON desde Python.

Y todo con un tema que a casi todo el mundo le gusta: música 🎵

Si querés llevarlo más lejos, podés:

  • agregar más campos al JSON (año, tipo de artista, etc.),

  • crear otra Function que busque álbumes,

  • o montar un front sencillo en HTML/JS que consuma esta API.

Pero con este primer paso ya tenés un excelente tutorial de “primer contacto” con Azure Functions + Python + APIs para compartir en tus Azure Guides.

::contentReference[oaicite:0]{index=0}


Recursos:
MusicBrainz API — Free Public API | Public APIs Directory

MusicBrainz - the open music encyclopedia

Enjoy this post?

Buy Ant Cloud | Microsoft Full-Stack a book

More from Ant Cloud | Microsoft Full-Stack