Deployment von Custom Scripts via Storage Account mit User-Assigned Managed Identity

Für die Bereitstellung von Session Hosts kann es Sinnvoll sein, Dateien von einem Storage Account zu kopieren die während der Bereitstellung oder dem Betrieb benötigt werden. Diese Dateien sollen aber nicht öffentlich verfügbar sein, und ein Storage Access Key soll auch nicht verwendet werden.

Damit vom Betriebssystem aus eine Datei heruntergeladen werden kann, ohne Storage Access Key, kann mein eine kurzfristig gültige, Shared Access Signature (SAS) erstellen. Damit lassen sich die Dateien dann von einem Container herunterladen. Dies lässt sich mit einer User-Assigned Managed Identity bewerkstelligen.

Um das realisieren zu können, brauchen wir als erstes eine User-Assigned Managed Identity und ein Stroage Account. Die Informationen werden innerhalb Nerdio in Variablen gespeichert. Um nun die Identity an einem Session Host hinzuzufügen verwenden wir eine Scripted Action.

Sobald die User-Assigned Managed Identity und der Storage Account erstellt sind, die User-Assigned Managed Identity berechtigt ist, können wir mit der Scripted Action die User-Assigned Managed Identity einer VM zuweisen. Mit einer weiteren Scripted Action können wir nun die Datein vom Storage Account herunterladen und ausführen.

Voraussetzungen

Als generelle Voraussetzung gillt, dass auf der VM PowerShell aktuell ist und folgende Module installiert sind:

  • az.accounts
  • az.resources
  • az.storage
  • az.keyvault

Für alles andere wird eine Nerdio Instanz und eine Resource Group benötigt, wo der Storage Account und die User-Assigned Managed Identity gespeichert werden sollen. Diese sollte ebenfalls in Nerdio hinzugefügt werden, damit die Berechtigungen Stimmen.

Storage Account erstellen

Ein Storage Account wird ganz klassisch erstellt. Dabei können unterschiedliche Konfigurationen vorgenommen werden. Für einen Storage Account für ein Deployiment reicht in der Regel einen Standard Account mit der Verfügbarkeit ZRS oder GRS aus, welcher über einen Private Endpoint verfügen kann. Nachfolgend eine Scripted Action, die dies automatisiert:

Beim ausführen werden dann die Parameter konfiguriert:

Der Output kann verwendet werden, um die Variable in Nerdio anzulegen:

User-Assigned Managed Identity erstellen

Eine User-Assigned Managed Identity ist ganz einfach erstellt. Wenn diese über das Azure Portal erstellt werden soll, kann dies wie folgt aussehen:

Später werden wir die Informationen aus den Eigenschaften benötigen, um die Variable in Nerdio anzulegen

Alternativ kann folgende Scripted Action verwendet werden:

Beim ausführen werden dann die Parameter konfiguriert:

Der Output kann verwendet werden, um die Variable in Nerdio anzulegen:

Variablen erstellen

Wir erstellen nun zwei Secure Variablen in Nerdio, welche alle relevanten Informationen zum Storage Account und zu der User-Assigned Managed Identity beinhaltet.

DeployStorageAccount

Der Storage Account wird fürs Deployment verwendet, weshalb ich die Variable DeployStorageAccount nenne:

Die Variable binhaltet ein JSON formatierten String, mit allen relevanten Informationen:

DeploymentIdentity

Da es um die User Assigened Managed Identity für das Deplyoment handelt, heist diese DeploymentIdentity:

Die Variable binhaltet ein JSON formatierten String, mit allen relevanten Informationen:

Um später die User Assigned Managed Idnetity nutzen zu können, speichern wir nicht nur der Name, sondern alle relevanten Informationen, um diese mit dem CmdLet Get-AzUserAssignedIdentity zu finden.

User-Assigned Managed Identity auf dem Storage Account berechtigen

Nach dem nun der Storage Account und die User-Assigned Managed Identity erstellt wurde, muss die Identity noch auf dem Storage Account berechtigt werden.

Auch dies kann wieder mit einer Scripted Action konfiguriert werden. Voraussetzung ist dazu, dass die beiden Variablen konfiguriert sind.

Beim ausführen werden dann die Parameter konfiguriert:

Scripted Action um User-Assigned Managed Identity einer VM hinzuzufügen

Mit dem folgenden Script wird die User-Assigned Managed Identity der VM hinzugefügt. Dabei wird berücksichtigt, ob bereits schon eine System-Assigned Managed Identity oder User-Assigned Managed Identity vorhanden ist.

Was das Script für das Hinzufügen der User-Assigned Managed Identity noch nicht unterstützt, ist die Möglichkeit gleichzeitig mehrere User Assigned Managed Identites an einer VM zuzuordnen. Da dieses Script aber beim Erstellen der VM ausgeführt wird, macht das übergeben einer Variable als Parameter keinen Sinn. Mann müsste für unterschiedliche Identities kopien des Scriptes anlegen.

Das Script wird nun in der Regel beim VM Deployment als Step nach dem erstellend er VM hinzugefügt:

Praktisches Beispiel

Nach dem wir nun den Storage Account erstellt, die User-Assigned Managed Identity erstellt, berechtigt und zugewiesen haben, können wir nun Scripte vom Container herunterladen und auf der VM ausführen. Dazu speichern wir zwei Scripte im Container deplyoment. Diese Scripte werden in der Regel während dem erstellen des Images genutzt.

Das erste Script nutze ich, um ein par Informationen in das Betriebssystem zu speichern, um später noch zu wissen, wann das Image erstellt wurde:

Mit dem zweiten Script deaktivieren wir die Möglichkeit, eine VM aus dem Startmenü nur Herunterzufahren. Dies soll verhindern, dass aus Versehen die VM ausgeschalten, aber nicht Dealloziert werden.

Da nun die Scripte auf dem Storage Account erstellt sind, kann man mit der folgenden Scripted Action diese herunterladen und ausführen:

Abschluss

Nerdio bietet in der Zwischenzeit Möglichkeiten Pakete oder Scripte auch über andere Wege zu installieren oder auszuführen. Jedoch habe ich mir diesen Weg vor Jahren erstellt, welcher immer noch funktioniert, und ich mir auch weiterhin einrichte, um mehr Flexibilität zu haben.

Gerade der Deployment Storage Account hat mir schon geholfen, PowerShell Module zwischenzuspeichern, und dann ohne Internet Access installieren zu können. Das wäre aber ein weiterer Blog Post wert.

Ich hoffe das eine oder andere Script hilft dir auch, ein oder mehrere Herausforderungen in deinem Deployment zu lösen.