Automatiza transferencias de archivos en la nube con Azure CLI
Azure CLI es una herramienta versátil que te permite automatizar transferencias de archivos y gestionar Azure Storage de forma eficiente. Esta guía ofrece ejemplos prácticos e instrucciones paso a paso para agilizar tus flujos de trabajo en la nube.
Instalación y configuración
Instala Azure CLI en tu sistema. Después de la instalación, ejecuta los ejemplos en Bash (en Windows, usa WSL o Azure Cloud Shell). La creación de la cuenta y el almacenamiento generan cargos en Azure; usa un grupo de recursos de prueba dedicado y archivos de ejemplo sin datos sensibles.
En Windows
winget install -e --id Microsoft.AzureCLI
En macOS
brew install azure-cli
En Linux (Ubuntu/Debian)
# Install pre-requisites
sudo apt-get update
sudo apt-get install -y ca-certificates curl apt-transport-https lsb-release gnupg
# Download and install the Microsoft signing key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc |
gpg --dearmor |
sudo tee /etc/apt/keyrings/microsoft.gpg > /dev/null
sudo chmod go+r /etc/apt/keyrings/microsoft.gpg
# Add the Azure CLI software repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/azure-cli/ $(lsb_release -cs) main" |
sudo tee /etc/apt/sources.list.d/azure-cli.list
# Update repository information and install the azure-cli package
sudo apt-get update
sudo apt-get install azure-cli
Después de la instalación, autentícate en Azure:
az login
Para la automatización hospedada en Azure, es preferible una identidad administrada asignada. En el host de Azure que tiene esa identidad, reemplaza el inicio de sesión interactivo por:
az login --identity
Verifica la instalación y comprueba la versión:
az --version
Crear una cuenta de almacenamiento
Selecciona la suscripción prevista con az account set --subscription YOUR_SUBSCRIPTION_ID. Define
estas variables en la misma sesión de Bash y elige un nombre de cuenta de almacenamiento único a
nivel global que contenga entre 3 y 24 letras minúsculas y dígitos:
export RESOURCE_GROUP="file-transfer-demo"
export STORAGE_ACCOUNT="youruniquestorageaccount"
export CONTAINER_NAME="transfers"
export SOURCE_DIR="/path/to/local/files"
location="eastus"
La siguiente cuenta permite el acceso HTTPS autenticado desde tu estación de trabajo, a la vez que deniega el acceso anónimo a blobs y la autenticación con clave compartida. No convierte el endpoint de red en privado. Para una cuenta exclusivamente privada, configura primero un endpoint privado accesible y el DNS; deshabilitar el acceso a la red pública antes de eso bloquearía las transferencias posteriores. Consulta la referencia de CLI para cuentas de almacenamiento.
# Create resource group
az group create --name "$RESOURCE_GROUP" --location "$location"
# Create storage account with security settings
az storage account create \
--name "$STORAGE_ACCOUNT" \
--resource-group "$RESOURCE_GROUP" \
--location "$location" \
--kind StorageV2 \
--sku Standard_LRS \
--min-tls-version TLS1_2 \
--allow-blob-public-access false \
--allow-shared-key-access false \
--public-network-access Enabled \
--https-only true \
--encryption-services blob
Usar la autenticación de Microsoft Entra ID
Crear una cuenta no otorga acceso a los datos de blobs. Un administrador con permisos de asignación
de roles debe otorgar al usuario interactivo el rol
Storage Blob Data Contributor en esta cuenta. Para la
automatización, asigna el rol al ID de objeto de la entidad de seguridad de la identidad
administrada, con el tipo de entidad ServicePrincipal. Las asignaciones de roles
pueden tardar varios minutos en propagarse.
storage_account_id=$(az storage account show \
--name "$STORAGE_ACCOUNT" --resource-group "$RESOURCE_GROUP" --query id --output tsv)
user_id=$(az ad signed-in-user show --query id --output tsv)
# For the interactive user logged in above
az role assignment create \
--role "Storage Blob Data Contributor" \
--assignee-object-id "$user_id" \
--assignee-principal-type User \
--scope "$storage_account_id"
Transferir archivos con Azure CLI
Subir archivos
Sube archivos con la autenticación de Microsoft Entra ID:
# Create a container
az storage container create \
--name "$CONTAINER_NAME" \
--account-name "$STORAGE_ACCOUNT" \
--auth-mode login
# Upload a file
az storage blob upload \
--container-name "$CONTAINER_NAME" \
--file /path/to/local/file.txt \
--name remote-file.txt \
--account-name "$STORAGE_ACCOUNT" \
--overwrite false \
--auth-mode login
Descargar archivos
Recupera archivos con la autenticación de Microsoft Entra ID:
az storage blob download \
--container-name "$CONTAINER_NAME" \
--name remote-file.txt \
--file /path/to/local/destination.txt \
--account-name "$STORAGE_ACCOUNT" \
--overwrite false \
--auth-mode login
Automatizar transferencias de archivos por lotes con Azure CLI
Guarda este script de Bash y ejecútalo después de exportar la configuración anterior y crear el contenedor. Incluye los archivos normales ocultos, omite los directorios y los enlaces simbólicos, y realiza como máximo tres intentos por archivo. Nunca reemplaza blobs existentes y devuelve un estado distinto de cero si falla alguna subida, incluida una colisión de nombres. Usa un contenedor nuevo o nombres únicos para un lote nuevo. Reintentar ante una respuesta incierta no prueba que la solicitud anterior haya fallado: inspecciona el objeto remoto antes de decidir reemplazarlo.
#!/bin/bash
set -euo pipefail
shopt -s nullglob dotglob
: "${SOURCE_DIR:?Set SOURCE_DIR}"
: "${CONTAINER_NAME:?Set CONTAINER_NAME}"
: "${STORAGE_ACCOUNT:?Set STORAGE_ACCOUNT}"
if [ ! -d "$SOURCE_DIR" ]; then
printf 'Source directory does not exist\n' >&2
exit 1
fi
failed=0
max_retries=3
for file in "$SOURCE_DIR"/*; do
[ -f "$file" ] && [ ! -L "$file" ] || continue
filename=${file##*/}
retry_count=0
while [ $retry_count -lt $max_retries ]; do
if az storage blob upload \
--container-name "$CONTAINER_NAME" \
--file "$file" \
--name "$filename" \
--account-name "$STORAGE_ACCOUNT" \
--auth-mode login \
--overwrite false \
--only-show-errors --output none; then
printf 'Uploaded: %s\n' "$filename"
break
else
retry_count=$((retry_count + 1))
if [ $retry_count -lt $max_retries ]; then
printf 'Retry %s for %s\n' "$retry_count" "$filename" >&2
sleep 5
else
printf 'Failed to upload %s after %s attempts\n' "$filename" "$max_retries" >&2
failed=1
fi
fi
done
done
exit "$failed"
Optimizar el rendimiento de las transferencias
Para lotes grandes, az storage copy delega las transferencias en AzCopy. Sigue la
referencia de copia de Azure CLI
y permite su configuración de AzCopy cuando se te solicite. Este ejemplo copia el contenido del
directorio de forma recursiva, sin reemplazar los objetos existentes:
az storage copy \
--source "$SOURCE_DIR/*" \
--destination "https://$STORAGE_ACCOUNT.blob.core.windows.net/$CONTAINER_NAME" \
--recursive \
--put-md5 \
--auth-mode login \
-- --overwrite=false
Gestionar el acceso a los archivos con Azure Storage
Genera un token SAS de delegación de usuario de solo lectura y de corta duración. Otorga acceso a nombres de blobs conocidos en todo este contenedor, así que usa un contenedor dedicado o un SAS limitado a un blob cuando compartas un solo archivo. Trata la salida como un secreto: no la incluyas en logs, en el control de versiones ni en URL públicas. Python 3 ofrece un cálculo portátil de expiración en UTC en macOS y Linux:
end_time=$(python3 -c 'from datetime import datetime, timedelta, timezone; print((datetime.now(timezone.utc) + timedelta(minutes=30)).strftime("%Y-%m-%dT%H:%MZ"))')
az storage container generate-sas \
--name "$CONTAINER_NAME" \
--account-name "$STORAGE_ACCOUNT" \
--permissions r \
--expiry "$end_time" \
--auth-mode login \
--as-user \
--https-only --output tsv
Monitoreo y registro
Para conservar los logs de solicitudes, usa un workspace de Log Analytics existente y una identidad
con permiso para configurar ajustes de diagnóstico. Define WORKSPACE_GROUP y WORKSPACE_NAME con el
grupo de recursos y el nombre de ese workspace. La recepción y la retención de logs generan cargos.
Configura el recurso del servicio de blobs, no solo la cuenta de almacenamiento principal, tal como
se describe en la
guía de monitoreo de Blob Storage:
: "${WORKSPACE_GROUP:?Set WORKSPACE_GROUP}"
: "${WORKSPACE_NAME:?Set WORKSPACE_NAME}"
log_analytics_workspace_id=$(az monitor log-analytics workspace show \
--resource-group "$WORKSPACE_GROUP" --workspace-name "$WORKSPACE_NAME" \
--query id --output tsv)
workspace_id=$(az monitor log-analytics workspace show \
--resource-group "$WORKSPACE_GROUP" --workspace-name "$WORKSPACE_NAME" \
--query customerId --output tsv)
az monitor diagnostic-settings create \
--name "storage-diagnostics" \
--resource "$storage_account_id/blobServices/default" \
--logs '[{"category": "StorageRead","enabled": true},{"category": "StorageWrite","enabled": true}]' \
--export-to-resource-specific true \
--workspace "$log_analytics_workspace_id"
# List all blobs in a container
az storage blob list \
--container-name "$CONTAINER_NAME" \
--account-name "$STORAGE_ACCOUNT" \
--auth-mode login \
--output table
Mejores prácticas
-
Usa identidades administradas: implementa identidades administradas de Microsoft Entra ID para la autenticación en lugar de claves de la cuenta de almacenamiento.
-
Habilita la eliminación temporal: protégete frente a eliminaciones accidentales.
az storage account blob-service-properties update \ --delete-retention-days 7 \ --enable-delete-retention true \ --account-name "$STORAGE_ACCOUNT" \ --resource-group "$RESOURCE_GROUP" -
Usa endpoints privados donde sea necesario: configura una red virtual accesible y un DNS privado, verifica el acceso desde el host de transferencia y luego restringe el acceso público. Crear un endpoint por sí solo no deshabilita el endpoint público. Sigue la configuración de endpoints privados.
-
Habilita el versionado: mantén varias versiones de tus archivos.
az storage account blob-service-properties update \ --account-name "$STORAGE_ACCOUNT" \ --resource-group "$RESOURCE_GROUP" \ --enable-versioning true -
Implementa la gestión del ciclo de vida: revisa los costos de retención y recuperación antes de aplicar una directiva. Limítala al prefijo de blob previsto y valídala con datos de prueba; las reglas de eliminación borran archivos. Usa la guía de directivas de ciclo de vida.
-
Elige el cifrado de infraestructura al crear la cuenta si lo necesitas. No es una opción que se active al actualizar la cuenta. Consulta cifrado de infraestructura.
Solución de problemas comunes
-
Revisa la configuración del firewall y del endpoint público. Esta consulta del plano de administración no demuestra el acceso a los datos; ejecuta también el listado autenticado de blobs que aparece a continuación:
az storage account show \ --name "$STORAGE_ACCOUNT" --resource-group "$RESOURCE_GROUP" \ --query '{publicNetworkAccess:publicNetworkAccess,networkRuleSet:networkRuleSet}' -
Consulta los logs de operaciones después de habilitar el ajuste de diagnóstico anterior. El comando de consulta puede solicitarte instalar la extensión de Log Analytics de Azure CLI:
az monitor log-analytics query \ --workspace "$workspace_id" \ --analytics-query "StorageBlobLogs | where TimeGenerated > ago(1h) | take 20" -
Prueba el acceso a la cuenta de almacenamiento:
az storage blob list \ --container-name "$CONTAINER_NAME" --account-name "$STORAGE_ACCOUNT" \ --auth-mode login --output tableUn error de permisos puede significar que el rol de datos no se ha propagado, que la identidad con la sesión iniciada no es la correcta o que la ruta de red está bloqueada.
az storage account check-namesolo comprueba la disponibilidad del nombre; no es una prueba de acceso.
Próximos pasos
- Configura tu primera transferencia de archivos automatizada.
- Configura la gestión del ciclo de vida para tu cuenta de almacenamiento.
- Habilita el versionado para los archivos críticos.
¿Necesitas gestionar flujos de trabajo complejos de procesamiento de archivos? Consulta Transloadit para servicios completos de importación y exportación de archivos.
