Azure Blob Storage mit PowerShell


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!

Comments (0)

Skip to main content