google-cloud y azure-sdk
No todas las cargas de trabajo se ejecutan en AWS. Los SDKs de Python para Google Cloud (google-cloud-*) y Azure (azure-*) siguen patrones de cliente similares a boto3: credenciales del entorno, puntos de conexión regionales y operaciones de lista paginadas.
Receta
from google.cloud import storage
client = storage.Client()
bucket = client.bucket("my-gcs-bucket")
blob = bucket.blob("data/report.csv")
blob.upload_from_filename("report.csv")from azure.storage.blob import BlobServiceClient
service = BlobServiceClient.from_connection_string(conn_str)
container = service.get_container_client("uploads")
container.upload_blob(name="report.csv", data=b"hello", overwrite=True)Cuándo recurrir a esto:
- Estrategia multicloud o integraciones de adquisición
- GCP BigQuery / GCS o Azure Blob / Service Bus como plano de datos principal
- Patrones portátiles que abstraen el almacenamiento detrás de una interfaz
- Cargas de trabajo híbridas con la mejor opción de nube por servicio
Ejemplo de trabajo
Abstracción delgada sobre la carga de GCS y Azure Blob con una interfaz compartida.
from __future__ import annotations
from dataclasses import dataclass
from typing import Protocol
@dataclass
class ObjectRef:
bucket: str
key: str
class ObjectStore(Protocol):
def upload_bytes(self, ref: ObjectRef, data: bytes, content_type: str) -> None: ...
class GCSStore:
def __init__(self, project: str | None = None) -> None:
from google.cloud import storage
self._client = storage.Client(project=project)
def upload_bytes(self, ref: ObjectRef, data: bytes, content_type: str) -> None:
bucket = self._client.bucket(ref.bucket)
blob = bucket.blob(ref.key)
blob.upload_from_string(data, content_type=content_type)
class AzureBlobStore:
def __init__(self, connection_string: str) -> None:
from azure.storage.blob import BlobServiceClient
self._service = BlobServiceClient.from_connection_string(connection_string)
def upload_bytes(self, ref: ObjectRef, data: bytes, content_type: str) -> None:
container = self._service.get_container_client(ref.bucket)
container.upload_blob(name=ref.key, data=data, overwrite=True, content_type=content_type)
def persist_report(store: ObjectStore, ref: ObjectRef, payload: bytes) -> None:
store.upload_bytes(ref, payload, "text/csv")
if __name__ == "__main__":
ref = ObjectRef(bucket="reports", key="daily/summary.csv")
# persist_report(GCSStore(), ref, b"date,total\n2026-07-09,42\n")
print(ref)Lo que esto demuestra:
- La interfaz del protocolo mantiene el código de la aplicación independiente de la nube.
- GCS usa
google.cloud.storage; Azure usaazure-storage-blob. - Las credenciales provienen de ADC (
GOOGLE_APPLICATION_CREDENTIALS) o de la cadena de conexión de Azure /DefaultAzureCredential.
Inmersión profunda
Modelos de credenciales
| Nube | Fuente de credenciales de Python |
|---|---|
| GCP | Credenciales predeterminadas de aplicación, JSON de cuenta de servicio |
| Azure | DefaultAzureCredential, cadenas de conexión, identidad administrada |
| AWS | Cadena de boto3 (comparar con Patrones de credenciales y sesiones) |
Diseño del SDK
- GCP: un paquete por producto (
google-cloud-storage,google-cloud-pubsub) - Azure: paquetes de productos (
azure-storage-blob,azure-identity,azure-servicebus) - Instala solo los paquetes que necesites: mantén las capas de Lambda delgadas.
Notas de Python
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
credential = DefaultAzureCredential()
service = BlobServiceClient(account_url="https://acct.blob.core.windows.net", credential=credential)Errores comunes
- Cadenas de conexión en git: acceso completo al almacenamiento si se filtran. Solución: identidad administrada en Azure; identidad de carga de trabajo en GCP/GKE.
- Mezclar SDK síncrono en FastAPI asíncrono: bloquea el bucle de eventos. Solución: pool de hilos o clientes compatibles con asíncronos donde estén disponibles.
- APIs de paginación diferentes: iteradores de GCP frente a continuaciones de Azure. Solución: envolver en un ayudante compartido por proveedor.
- Asumir patrones IAM de boto3: los roles RBAC de GCP/Azure difieren. Solución: menor privilegio por cuenta de servicio / registro de aplicación.
- Instalar el metapaquete
google-cloud: extrae dependencias enormes. Solución: fijargoogle-cloud-storageespecífico, etc.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Solo boto3 | Tienda exclusiva de AWS | El contrato requiere GCP/Azure |
| REST + httpx | Superficie de integración diminuta | Se necesita el conjunto completo de funciones del SDK |
| Proveedores de Terraform | Aprovisionamiento de infraestructura | Cargas de objetos en tiempo de ejecución de la aplicación |
Preguntas frecuentes
¿Cómo funcionan las credenciales de GCP localmente?
gcloud auth application-default login establece ADC; CI usa JSON de cuenta de servicio o federación de identidad de carga de trabajo.
¿Qué reemplaza a AWS S3 en Azure?
Azure Blob Storage a través de azure-storage-blob: los contenedores se mapean a buckets, los blobs a claves.
¿Puedo compartir código entre nubes?
Sí: interfaz + implementaciones de proveedor; evita filtrar tipos de SDK por encima de la capa del adaptador.
¿Cómo manejo los reintentos?
Los SDKs incluyen políticas de reintento; ajústalas de manera similar a la configuración de botocore para tiempos de espera y número máximo de intentos.
¿BigQuery desde Python?
El cliente google-cloud-bigquery ejecuta consultas y carga desde GCS: un patrón de datos común en GCP.
¿Azure Service Bus vs SNS/SQS?
Colas/temas de Service Bus para mensajería nativa de Azure: patrones de desacoplamiento similares a la documentación de mensajería de AWS.
¿Cómo hago pruebas?
Usa emuladores (Azurite, fake-gcs-server) o adaptadores mock en pytest: evita acceder al almacenamiento de producción en pruebas unitarias.
Gestión de paquetes con uv?
uv add google-cloud-storage azure-storage-blob azure-identity fija las versiones en pyproject.toml.
Registro multicloud?
Emite registros estructurados independientes de la nube; incluye el campo cloud.provider para dirigir los paneles.
¿Cuándo no abstraer?
Cuando se usa una sola nube durante años: los envoltorios delgados agregan indirección sin el beneficio de la portabilidad.
Relacionado
- Conceptos básicos de boto3 - Paralelos del SDK de AWS
- S3 - Patrones de almacenamiento de objetos de AWS
- Patrones de credenciales y sesiones - Patrones de identidad
- Mejores prácticas de SDK en la nube - Higiene multicloud
- Aprovisionamiento de recursos en la nube - Arranque de cuentas
Versiones de la pila: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.