Dateien effizient mit cURL zu Microsoft Azure exportieren
Der Export von Dateien zu Microsoft Azure Storage mit cURL bietet eine flexible und effiziente Möglichkeit, direkt über die Befehlszeile mit Cloud-Storage zu arbeiten. Diese Anleitung zeigt, wie Sie Dateien mithilfe von cURL zu Azure Blob Storage exportieren, und hebt die empfohlene Authentifizierung über Microsoft Entra ID, eine sichere Token-Verwaltung sowie bewährte Verfahren zur robusten Fehlerbehandlung hervor.
Die Shell-Beispiele verwenden Bash und cURL 7.76.0 oder neuer für --fail-with-body.
Azure-Storage-Konto einrichten
Bevor Sie cURL mit Azure Storage verwenden, erstellen Sie über das Azure-Portal oder die Azure CLI ein Azure-Storage-Konto und einen Container. Wir empfehlen, die Authentifizierung über Microsoft Entra ID (früher Azure AD) zu aktivieren, um höhere Sicherheit und eine schlankere Token-Verwaltung zu erhalten.
Authentifizierungsmethoden
Azure Blob Storage unterstützt zwei primäre Authentifizierungsmethoden:
Microsoft Entra ID (empfohlen)
Rufen Sie mit der Azure CLI ein Zugriffstoken ab. Stellen Sie sicher, dass Sie sich mit az login angemeldet
haben und über eine Data-Plane-Rolle wie Storage Blob Data Contributor verfügen, die auf den
Zielcontainer beschränkt ist.
token=$(az account get-access-token --resource https://storage.azure.com/ --query accessToken -o tsv) || exit 1
: "${token:?Azure returned no access token}"
Verwenden Sie das Token in cURL-Anfragen:
curl --fail-with-body --show-error -X PUT \
-H "Authorization: Bearer $token" \
-H "x-ms-version: 2023-11-03" \
-H "x-ms-blob-type: BlockBlob" \
-H "Content-Type: application/octet-stream" \
--upload-file "localfile.txt" \
"https://youraccount.blob.core.windows.net/container/remotefile.txt"
Shared Access Signature (Alternative)
Für Szenarien, in denen Microsoft Entra ID nicht praktikabel ist, verwenden Sie SAS-Token mit
strengen Sicherheitskontrollen. Diese Methode unterstützt zusätzlich Integritätsprüfungen mithilfe
des Headers Content-MD5:
set -o pipefail
content_md5=$(openssl dgst -md5 -binary localfile.txt | base64) || exit 1
curl --fail-with-body --show-error -X PUT \
-H "x-ms-blob-type: BlockBlob" \
-H "x-ms-version: 2023-11-03" \
-H "Content-Type: application/octet-stream" \
-H "Content-MD5: $content_md5" \
--upload-file "localfile.txt" \
"https://youraccount.blob.core.windows.net/container/remotefile.txt?your_sas_token"
Umgang mit großen Datei-Uploads
Für Dateien, die das Limit von 5.000 MiB pro Schreibvorgang überschreiten, verwenden Sie die Block Blob API, um große Dateien in Blöcken hochzuladen. Ab API-Version 2019-12-12 und höher beträgt die maximale Blockgröße 4.000 MiB, wodurch bei bis zu 50.000 Blöcken eine maximale Blob-Größe von nahezu 190,7 TiB möglich ist.
#!/bin/bash
set -euo pipefail
: "${token:?Acquire an Azure access token first}"
file="largefile.txt"
block_size=$((4000*1024*1024)) # 4,000 MiB blocks
base_url="https://youraccount.blob.core.windows.net/container/largefile.txt"
[ -s "$file" ] || { echo 'Use a single PUT for an empty file.' >&2; exit 1; }
temp_dir=$(mktemp -d)
trap 'rm -rf -- "$temp_dir"' EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
run_id=$(openssl rand -hex 8)
# Isolate this run's parts so retries cannot pick up stale files.
split -a 5 -b "$block_size" "$file" "$temp_dir/block_"
blocks=("$temp_dir"/block_*)
[ "${#blocks[@]}" -le 50000 ] || { echo 'Too many blocks.' >&2; exit 1; }
printf '%s\n' '<?xml version="1.0" encoding="utf-8"?><BlockList>' > "$temp_dir/blocklist.xml"
index=0
# Upload blocks
for block in "${blocks[@]}"; do
block_id=$(printf '%s%08d' "$run_id" "$index" | base64 | tr -d '\n')
encoded_id=${block_id//+/%2B}
encoded_id=${encoded_id//\//%2F}
encoded_id=${encoded_id//=/%3D}
curl --fail-with-body --show-error --retry 3 --upload-file "$block" \
-H "Authorization: Bearer $token" \
-H "x-ms-version: 2023-11-03" \
"$base_url?comp=block&blockid=$encoded_id"
printf '<Latest>%s</Latest>\n' "$block_id" >> "$temp_dir/blocklist.xml"
index=$((index + 1))
done
printf '%s\n' '</BlockList>' >> "$temp_dir/blocklist.xml"
# Commit only after every block succeeded.
curl --fail-with-body --show-error --upload-file "$temp_dir/blocklist.xml" \
-H "Authorization: Bearer $token" \
-H "x-ms-version: 2023-11-03" \
-H "Content-Type: application/xml" \
"$base_url?comp=blocklist"
--upload-file streamt jeden PUT; --data-binary @file würde die Datei zunächst in den Arbeitsspeicher
laden. Dieses Beispiel benötigt temporären Speicherplatz, der ungefähr der Größe der Eingabe
entspricht. Lassen Sie die Eingabe während des Durchlaufs unverändert. Block-IDs müssen gleich lang
sein und im Query-String URL-codiert werden; die XML-Liste verwendet ihre ursprüngliche Base64-Form.
Fehlgeschlagene Durchläufe entfernen ihre lokalen Teile und übergeben niemals eine unvollständige
Liste. Blob-Namen mit Leerzeichen oder reservierten Zeichen müssen ebenfalls URL-codiert werden.
Fehlerbehandlung und Retries
Implementieren Sie eine robuste Fehlerbehandlung mit exponentiellem Backoff für vorübergehende Fehler. Die folgende Funktion wiederholt PUTs für einzelne Dateien bei HTTP 408, 429, 500, 502, 503 und 504, bricht aber bei Authentifizierungsfehlern (HTTP 401 oder 403) sofort ab. Andere Transport- oder HTTP-Fehler meldet sie als Fehlschlag:
upload_with_retry() {
local url="$1"
local file="$2"
local max_attempts=5
local attempt=1
local wait_time=2
local status
local curl_status
while [ $attempt -le $max_attempts ]; do
curl_status=0
status=$(curl --fail-with-body --silent --show-error -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $token" \
-H "x-ms-version: 2023-11-03" \
-H "x-ms-blob-type: BlockBlob" \
--upload-file "$file" \
"$url") || curl_status=$?
if [ "$curl_status" -eq 0 ] && [ "$status" = 201 ]; then
return 0
elif [ "$status" = 401 ] || [ "$status" = 403 ]; then
echo "Authentication failed. Check credentials."
return 1
elif [ "$status" = 408 ] || [ "$status" = 429 ] || [ "$status" = 500 ] || [ "$status" = 502 ] || [ "$status" = 503 ] || [ "$status" = 504 ]; then
echo "Transient error $status encountered. Retrying in $wait_time seconds..."
else
echo "Upload failed with HTTP status $status and curl exit code $curl_status."
return 1
fi
attempt=$((attempt + 1))
[ "$attempt" -le "$max_attempts" ] || break
sleep $wait_time
wait_time=$((wait_time * 2))
done
echo "File upload failed after $max_attempts attempts."
return 1
}
Überwachung und Validierung
Prüfen Sie den Upload-Status und die Blob-Metadaten mit dem folgenden Befehl:
curl --fail-with-body --silent --show-error --head \
-H "Authorization: Bearer $token" \
-H "x-ms-version: 2023-11-03" \
"https://youraccount.blob.core.windows.net/container/file.txt"
Überwachen Sie den Übertragungsfortschritt mit der Option für den Fortschrittsbalken:
curl --fail-with-body --show-error --progress-bar \
-H "Authorization: Bearer $token" \
-H "x-ms-version: 2023-11-03" \
-H "x-ms-blob-type: BlockBlob" \
--upload-file "largefile.txt" \
"https://youraccount.blob.core.windows.net/container/largefile.txt"
Bewährte Verfahren für die Sicherheit
- Verwenden Sie nach Möglichkeit die Authentifizierung über Microsoft Entra ID, um von verbesserter Sicherheit und Token-Verwaltung zu profitieren.
- Verwenden Sie für sichere Datenübertragungen mit Azure Storage immer HTTPS.
- Schränken Sie die von SAS-Token gewährten Berechtigungen ein und verwenden Sie kurze Ablaufzeiten.
- Erzwingen Sie IP-Adressbeschränkungen, um den Zugriff auf Ihr Storage-Konto zu begrenzen.
- Legen Sie für jeden Vorgang die minimal erforderlichen Berechtigungen fest.
- Überwachen und protokollieren Sie alle Vorgänge für Audits und die Fehlersuche.
- Rotieren Sie Zugangsdaten regelmäßig, um mögliche Sicherheitsverletzungen abzumildern.
- Validieren Sie die Dateiintegrität mithilfe des Headers
Content-MD5.
Performance-Optimierung
So maximieren Sie die Übertragungsleistung:
- Wählen Sie passende Blockgrößen (bis zu 4.000 MiB pro Block).
- Aktivieren Sie nach Möglichkeit parallele Uploads für mehrere Dateien.
- Wählen Sie die nächstgelegene Azure-Region, um die Latenz zu reduzieren.
- Überwachen Sie Netzwerkbandbreite und Latenz, um Übertragungen zu optimieren.
- Setzen Sie Komprimierung ein, wo sie sinnvoll ist, und berücksichtigen Sie dabei, dass manche Dateien bereits komprimiert sind.
- Implementieren Sie eine umfassende Fehlerbehandlung und Retries für robuste Uploads.
Fazit
Die Integration von Azure Blob Storage mit cURL ist eine leistungsstarke Strategie für die Verwaltung von Cloud-Storage-Vorgängen. Wenn Sie diese aktualisierten Authentifizierungsmethoden, bewährten Sicherheitsverfahren und Tipps zur Performance-Optimierung befolgen, können Sie eine zuverlässige und sichere Lösung für Dateiübertragungen aufbauen. Für weitergehende Möglichkeiten im Umgang mit Dateien lohnt sich ein Blick auf die Dienste von Transloadit, die Funktionen wie Uppy und tus für eine verbesserte Dateiverarbeitung unterstützen.
