
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 V2Ese 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
requestsDespués instalás:
pip install -r requirements.txtCon 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 video1. 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
