Stefan Zawacki

Das Kopieren von Storage Blobs innerhalb einer Azure Subscription ist einfach. PowerShell bietet hier Cmdlets die diese Aufgabe bewältigen. Aber wie kopiert man einen Storage Blob aus einer Subscription in eine andere hinein?

Durch meine Arbeit beschäftige ich mich nun seit längerem mit der automatisierten Erstellung von virtuellen Computern in Azure. Dazu habe ich unterschiedliche Custom Images in Azure bereitgestellt, die als Vorlage für die Erstellung neuer virtueller Maschinen dienen. Seit dem Release von Azure PowerShell Version 1.0.0 (und höher) lassen sich Resourcen, unter der Verwendung des Resource Managers, leicht in Azure anlegen. Jedoch fehlt die Möglichkeit Resourcen von einer Subscription in eine andere zu transferieren. Beispielsweise kann das Cmdlet Start-AzureStorageBlobCopy nur Kopiervorgänge innerhalb einer Subscription ausführen.

Die VHD-Datein jedesmal erst lokal herunterzuladen und anschließend in die neue Subscription wieder hochzuladen ist keine Option, da die Kopiervorgänge für Dateien die mehr als 100 GB groß sein können, einfach viel zu lange dauern.

Nach ein wenig Recherche stieß ich auf einen Blog-Post im Microsoft Azure Storage Team Blog, in dem der Release einer neue Version von AzCopy angekündigt wurde.

AzCopy?

AzCopy ist ein kleines Befehlszeilenprogramm, das für das Kopieren großer Datenmengen nach Azure, oder aus Azure heraus erstellt wurde. Des Weiteren bietet es auch die Möglichkeit Storage Blobs innerhalb von Azure, auch über Subscriptions hinaus zu kopieren. Die aktuelle Version kann hier heruntergeladen werden.

Nach der Installation des MSIs steht die AzCopy.exe in einem Unterverzeichnis der Microsoft SDKs bereit. Der Pfad kann je nach Betriebssystemarchitektur  „%ProgramFiles(x86)%\Microsoft SDKs\Azure\AzCopy\AzCopy.exe“ oder „%ProgramFiles%\Microsoft SDKs\Azure\AzCopy\AzCopy.exe“ lauten.

AzCpoy wird auch in den Azure Resource Deployment Templates für das Visual Studio verwendet, um Resourcen nach Azure hochzuladen. Die Syntax von AzCopy hat sich gegenüber früherer Versionen leicht verändert. In den Azure Resource Deployment Templates wird beispielsweise noch eine ältere Version verwendet. Dies muss man im Hinterkopf behalten, da es sonst zu unerklärlichen Fehlermeldungen kommen kann, obwohl die vermeintlich richtige Syntax verwendet wird. In diesem Beitrag beziehe ich mich daher auf die Datei Version 5.0.0.27, die zum jetzigen Zeitpunkt die aktuelle Version darstellt.

Auf der Befehlszeile kann mit dem Parameter „/?“ die Dokumentation angezeigt werden. Die Syntax zum kopieren von Blobs ist sehr einfach aufgebaut, es werden minimal die folgenden fünf Parameter benötigt:

 

/Source:“<filepath>“                  Pfad zum Quell-Storage.

/Dest:“<filepath>“                      Pfad zum Ziel-Storage.

/Pattern:“<filepattern>“            Dateiname, der zu kopierenden Datei, oder Pattern.

/SourceKey:“<storageKey>“     Der Access Key zum Quell-Storage Account

/DestKey:“<storagekey>“          Der Access Key zum Ziel-Storage Account

 

Die Acces Keys der Storage Accounts sind für die Authentifizierung notwendig. Standardmäßig ist der Zugriff neu angelegter Storage Accounts auf „private“ gesetzt, was bedeutet das nur authentifizierte Benutzer Zugriff auf die Resourcen dieses Storage Accounts haben. Mit Hilfe der Access Keys kann trotzdem, wie in meinem Fall skriptgesteuert, auf die Storage Accounts zugegriffen werden. Die Keys können im Azure Portal unter „Settings“ -> „Access keys“ bezogen werden.

 

Ermitteln der Storage Account Access Keys für AzCopy

 

In der Übersicht werden zwei Keys angezeigt, die beide die gleiche Funktion haben. Ebenso können die Keys hier neu generiert werden, für den Fall das man bereits verwendete Keys ungültig machen möchte.

Mit den notwendigen Keys sieht dann mein Befehlszeilenaufruf zum Kopieren alle VHD-Dateien eines Storage Accounts in eine Storage Account einer anderen Subscription wie folgt aus:

 

AzCopy /Source:“ https://<mySourceStorageAccountName>.blob.core.windows.net/<Container name>“
/Dest:“ <myDestStorageAccountName>.blob.core.windows.net/<Container name>“ /Pattern:“*.vhd“
/SourceKey:“*********“ /DestKey:“***********“

 

Mit diesem Aufruf habe ich mir dann eine Funktion in PowerShell geschrieben, die ich in meinen Skripten jeder Zeit wiederverwenden kann.

 

 

Für diese Funktion habe ich den Name des Quell-Storage Account festgeschrieben, ebenso den Quell-Key, da ich alle Images, die ich in Azure bereitgestellt habe, in einem Storage Account („imagestorage“) hinterlegt habe. Somit sind Name und Key immer gleichbleibend. Den Key des Ziel-Storage Accounts lese ich nach dem Login mit dem Cmdlet Get-AzureRmStorageAccountKey aus. Sowohl im Quell- wie auch im Ziel-Storage Account verwende ich zur Speicherung der Images einen Container namens „images“. Nachdem in der neuen Subscription meine virtuellen Computer erstellt sind, lösche ich die Images wieder und verwahre nur die Quell-Images in meinem extra dafür angelegten Storage Account.

Der Kopiervorgang kann je nach Größe des Images ein wenig Zeit in Anspruch nehmen, der Zeitaufwand es jedoch viel geringer als der Upload vom lokalen Computer aus. Meine bisherigen Kopiervorgänge mit Blobs im Größenbereich von 64-127 GB lagen bei ca. 40 – 45 Minuten. Im Vergleich dazu benötigt ein Upload vom lokalen Rechner 4 Stunden und mehr.