Immer, wenn ich mit Storage in Azure arbeiten muss, hab ich mir eine einfachere Möglichkeit gewünscht, die Accounts und Container anzeigen zu können. Natürlich kann man über das Portal gehen, oder Tools wie den Azure Storage Explorer oder Cloudberry Explorer nutzen, aber direkt in PowerShell, das ist schon Tipparbeit. Da dachte ich mir, schreib doch eine kleine Funktion, die das macht, und hier ist sie. Jetzt muss man dazu sagen, dass ich kein Entwickler/Programmierer/Developer bin, von daher werden dem ein oder anderen die Haare zu Berge stehen, wenn er den Code gleich sieht, aber dafür gibt es ja auch die Kommentar-Funktion am Ende des Artikels. Ich freu mich schon, ganz viel zu lernen…
Azure Storage Accounts
Vorweg ein kurzer Ausflug zu Storage in Azure, genauer zu Blob Storage, auf den möchte ich mich erst mal beschränken. Storage in Azure ist in Storage Accounts aufgeteilt. Um eine Liste aller Storage Account zu bekommen, brauchen wir nur einzutippen:
Get-AzureStorageAccount
bzw. eine etwas übersichtlichere Liste:
Get-AzureStorageAccount |select label,location,accounttype
Das gibt dann etwas in dieser Art:
Label Location AccountType
----- -------- -----------
dvtest1 North Europe Standard_LRS
dvtest2 West Europe Standard_LRS
portalsonstwas North Europe Standard_GRS
Man erkennt die unterschiedlichen Locations und Typen, das gilt jeweils für alles, was unter diesem Storage Account gespeichert wird, was den Sinn von unterschiedlichen Accounts auch klar macht.
Storage Keys
Um auf ein solches Storage Account zugreifen zu können, benötigt man einen Schlüssel. Es gibt zwei davon, den Primary und den Secondary, wir nutzen mal den Primary (genauso gut geht auch der Secondary). Den Schlüssel erhält man mit:
Get-AzureStorageKey -StorageAccountName dvtest1
und liefert sowas (verkürzte Ausgabe)
Primary : 1234567890qwertz..nertzuiopas12==
Secondary : asdfghjklyxcvbnm..1234567898rwr==
StorageAccountName : dvtest1
Mit diesen Keys hat man wie gesagt Zugriff auf das Storage Account, also klar, dass ich hier keine echten Schlüssel hinschreibe…
Storage Context
Hat man also den Namen des Storage Accounts und den Key, dann kann man ein Kontext-Objekt (AzureStorageContext) anlegen (den Key habe ich wiederabgekürzt):
$context = New-AzureStorageContext
-StorageAccountName dvtest1
–StorageAccountKey 1234567890qwertz..nertzuiopas12==
Dieser Kontext enthält jetzt also Informationen, welches Account ich meine und hat auch gleich den Schlüssel dazu (auch wenn er den nicht anzeigt). Mit diesem Kontext können wir uns endlich den Inhalt des Storage Accounts ansehen.
Storage Container
Die oberste Ebene bilden sogenannte Container, vergleichbar in etwa mit Ordnern in einem Filesystem. Der kleine Unterschied ist, dass es nur diese eine Ebene mit Ordnern, äh, Containern gibt, also keine Container in Container etc., ein ziemlich flaches System. Schauen wir mal, was es für Container gibt:
Get-AzureStorageContainer -context $context
Wir sehen, wir müssen nur den Kontext angeben, den wir uns oben erzeugt haben. Die Liste hier ist jetzt etwas kurz, das kann auch mal mehr sein:
Name PublicAccess LastModified
---- ------------ ------------
test Blob 10.12.2015 07:54:37 +00:00
Für längere Listen gibt es dann noch die Möglichkeit, mit –Prefix zu filtern oder –MaxCount zu begrenzen – und natürlich mit pipen nach where etc…
Container-Inhalt
Jetzt aber endlich zum Inhalt des Containers:
Get-AzureStorageBlob -Context $context -Container test
und das zeigt uns:
Name BlobType Length ContentType LastModified
---- -------- ------ ----------- ------------
lukas.jpg BlockBlob 160719 image/jpeg 10.12.2015 08:12:34 +00:00
lea.jpg BlockBlob 158224 image/jpeg 10.12.2015 08:15:34 +00:00
Die Abkürzung
Bis hierher ist es also ein langer, langer Weg. Und um das abzukürzen, hab ich mir eben eine kleine Funktion gebaut und in mein Profile eingefügt:
function blobdir {
param(
[parameter(Position=0, Mandatory=$false)][string]$account,
[parameter(Position=1, Mandatory=$false)][string]$container
)
if (-not $account) {
#empty call, list storage accounts
get-azurestorageaccount |select label,location,accounttype
} elseif (-not $container){
#account given, list containers
$context=New-AzureStorageContext
-StorageAccountName $account -StorageAccountKey
(get-azurestoragekey -StorageAccountName $account |
select -ExpandProperty Primary)
get-azurestoragecontainer -context $context
} else {
$context=New-AzureStorageContext
-StorageAccountName $account -StorageAccountKey
(get-azurestoragekey -StorageAccountName $account |
select -ExpandProperty Primary)
get-azurestorageblob -context $context -container $container
}
}
(Den Script ohne die lästigen Zeilenumbrüche gibt es auch auf github unter examples...)
Die Funktion hab ich “blobdir” genannt und kann entweder mit keinem, einem oder mit zwei Argumenten aufgerufen werden.
- Aufruf ohne Argument: Es wird eine Liste aller StorageAccounts angezeigt
- Aufruf mit einem Argument: Angegeben wird das StorageAccount, angezeigt wird eine Liste aller Container in diesem StorageAccount
- Aufruf mit zwei Argumenten: Das erste Argument ist der StorageAccount, das zweite der Container, und angezeigt wird der Inhalt des Containers.
Also quasi: blobdir [StorageAccount [Container]]
…und schon verkürzen sich unsere Aufrufe von oben drastisch zu:
blobdir
blobdir dvtest1
blobdir dvtest1 test
Aufruf
Ob man das jetzt als PowerShell-Modul lädt, oder wie ich im Profile, bleibt jedem selbst überlassen… Oder vielleicht kann ja jemand in den Kommentaren was dazu sagen?
Das Einbinden ins Profil geht übrigens einfach:
notepad.exe $PROFILE
und dann reinkopieren. Beim nächsten Starten der PowerShell kann’s losgehen.
Zusammenfassung
Man kann sich die Arbeit mit Storage also ein ganzes Stück einfacher machen. Wie gesagt, noch einfacher geht es mit diversen (auch frei erhältlichen) Tools. Die hier gezeigte Mini-Funktion lässt sich natürlich ausbauen und mit kleinen Gimmicks versehen, also Ändern der Hintergrundfarbe, Ausgabe von weiterem Text, Neuformatierung der Listen etc… Nur zu!