Übung: Konfigurieren und Initialisieren der Clientbibliothek

Abgeschlossen

So sieht der typische Workflow für Apps aus, die Azure Blob Storage verwenden:

  1. Konfiguration abrufen: Laden Sie beim Start die Speicherkontokonfiguration, in der Regel eine Verbindungszeichenfolge für das Speicherkonto.

  2. Initialisieren des Clients: Verwenden Sie die Verbindungszeichenfolge, um die Azure Storage-Clientbibliothek zu initialisieren. Bei dieser Initialisierung werden die Objekte erstellt, die die App für die Arbeit mit der Blob-Speicher-API verwendet.

  3. Verwenden: Um mit Containern und Blobs zu arbeiten, führen Sie API-Aufrufe mit der Clientbibliothek durch.

Konfigurieren der Verbindungszeichenfolge

Bevor Sie Ihre App ausführen, rufen Sie die Verbindungszeichenfolge für das von Ihnen verwendete Speicherkonto ab. Sie können dafür jede beliebige Azure-Verwaltungsschnittstelle verwenden, einschließlich des Azure-Portals, der Azure-CLI und der Azure PowerShell. Wenn Sie die Web-App zur Ausführung Ihres Codes am Ende dieses Moduls einrichten, verwenden Sie die Azure CLI, um die Verbindungszeichenfolge für das zuvor erstellte Speicherkonto abzurufen.

Diese enthält den Kontoschlüssel. Betrachten Sie den Kontoschlüssel als Geheimnis, und speichern Sie ihn stets sicher. Hier speichern Sie die Verbindungszeichenfolge in einer App Service-App-Einstellung. Die App Service-App-Einstellungen sind ein sicherer Ort für App-Geheimnisse. Dieses Design unterstützt die lokale Entwicklung nicht und ist für sich allein genommen keine robuste End-to-End-Lösung.

Wichtig

In diesem Codebeispiel wird eine Verbindungszeichenfolge verwendet, um den Zugriff auf Ihr Speicherkonto zu autorisieren. Diese Konfiguration dient nur zu Demonstrationszwecken. Verbindungszeichenfolgen und Kontozugriffsschlüssel sollten im Anwendungscode vorsichtig verwendet werden. Wenn Ihr Kontozugriffsschlüssel verloren geht oder versehentlich an einem unsicheren Ort gespeichert wird, kann Ihr Dienst anfällig werden. Jeder, der über den Zugriffsschlüssel verfügt, kann Anforderungen für das Speicherkonto autorisieren und hat somit Zugriff auf alle Daten.

Um optimale Sicherheit zu gewährleisten, empfiehlt Microsoft möglichst die Verwendung von Microsoft Entra ID mit verwalteten Identitäten, um Anforderungen für Blob-, Warteschlangen- und Tabellendaten zu autorisieren. Weitere Informationen finden Sie unter Autorisieren des Zugriffs auf Blobs mit Microsoft Entra ID.

Initialisieren des Blob Storage-Objektmodells

Im Azure Storage SDK für .NET verläuft die Verwendung von Blob Storage wie folgt:

  1. Sie instanziieren ein neues BlobServiceClient-Objekt und geben die Verbindungszeichenfolge für Ihr Speicherkonto an.

  2. Um ein BlobContainerClient-Objekt abzurufen, rufen Sie GetBlobContainerClient für das BlobServiceClient-Objekt auf, das den Namen des Containers trägt, mit dem Sie interagieren oder den Sie erstellen möchten.

Im Code werden diese Schritte wie folgt ausgedrückt.

BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);

Keiner dieser Initialisierungscodes führt Aufrufe über das Netzwerk durch. Das bedeutet, dass einige Ausnahmen, die aufgrund von falschen Informationen auftreten, erst später ausgelöst werden. Wenn dem Konstruktor der BlobServiceClient-Klasse beispielsweise eine falsch formatierte Verbindungszeichenfolge übergeben wird, führt dies sofort zu einer Ausnahme. Wenn die Verbindungszeichenfolge jedoch auf ein Speicherkonto verweist, das nicht existiert, wird keine Ausnahme ausgelöst, bis Sie versuchen, einen Vorgang für das Speicherkonto auszuführen.

Im Azure Storage SDK für Java verläuft die Verwendung von Blob Storage standardmäßig wie folgt:

  1. Erstellen Sie einen BlobServiceClient, indem Sie ein neues BlobServiceClientBuilder-Objekt mithilfe der Verbindungszeichenfolge für Ihr Speicherkonto instanziieren.

  2. Rufen Sie ein BlobContainerClient-Objekt ab, indem Sie die Methode getBlobContainerClient für den BlobServiceClient mit dem Namen des Containers aufrufen, mit dem Sie interagieren oder den Sie erstellen möchten.

Im Code werden diese Schritte wie folgt ausgedrückt.

BlobServiceClient blobServiceClient = BlobServiceClientBuilder()
    .connectionString(connectionString)
    .buildClient();
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);

Keiner dieser Initialisierungscodes führt Aufrufe über das Netzwerk durch. Das bedeutet, dass einige Ausnahmen, die aufgrund von falschen Informationen auftreten, erst später ausgelöst werden. Wenn beispielsweise eine falsch formatierte Verbindungszeichenfolge an BlobServiceClientBuilder übergeben wird, führt dies sofort zu einer Ausnahme. Wenn die Verbindungszeichenfolge jedoch auf ein Speicherkonto verweist, das nicht existiert, wird keine Ausnahme ausgelöst, bis Sie versuchen, einen Vorgang für das Speicherkonto auszuführen.

Erstellen von Containern beim Start

Rufen Sie CreateIfNotExistsAsync in BlobContainerClient auf, um einen Container zu erstellen, wenn Ihre App gestartet wird oder zum ersten Mal versucht, einen Container zu verwenden.

CreateIfNotExistsAsync löst keine Ausnahme aus, wenn der Container bereits existiert, führt aber einen Netzwerkaufruf an Azure Blob Storage durch. Rufen Sie dieses Element einmalig während der Initialisierung auf, nicht bei jedem Versuch, einen Container zu verwenden.

Um einen Container zu erstellen, wenn Ihre Anwendung startet oder wenn sie zum ersten Mal versucht, ihn zu verwenden, rufen Sie exists für einen BlobContainerClient auf, um zu prüfen, ob bereits ein Container existiert. Wenn er nicht vorhanden ist, rufen Sie create auf. Rufen Sie dieses Element einmalig während der Initialisierung auf, nicht bei jedem Versuch, einen Container zu verwenden.

Übung

Klonen und Untersuchen nicht fertiger Apps

  1. Klonen Sie zuerst die Start-App aus GitHub. Führen Sie die folgenden Befehle in der Azure Shell-CLI aus, um eine Kopie des Quellcodes zu erhalten und ihn im Editor zu öffnen:

    git clone https://github.com/MicrosoftDocs/mslearn-store-data-in-azure.git
    cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start
    code .
    
  2. Öffnen Sie im Editor die Datei Controllers/FilesController.cs. Hier gibt es nichts zu tun, aber sehen Sie sich kurz an, was die App kann.

    Dieser Controller implementiert eine API mit drei Aktionen:

    • Index: (GET /api/Files) gibt eine Liste von URLs zurück – eine für jede hochgeladene Datei. Das App-Front-End ruft diese Methode auf, um eine Liste von Hyperlinks zu den hochgeladenen Dateien zu erstellen.
    • Upload: (POST /api/Files) ruft eine hochgeladene Datei ab und speichert sie.
    • Download: (GET /api/Files/{filename}) lädt eine einzelne Datei nach Namen herunter.

    Jede Methode verwendet eine IStorage-Instanz namens storage. Es gibt eine unvollständige Implementierung von IStorage in Models/BlobStorage.cs, die ausgefüllt werden muss.

Hinzufügen des NuGet-Pakets

  • Fügen Sie einen Verweis auf das Azure Storage SDK hinzu. Führen Sie in der Azure Shell-CLI die folgenden Befehle aus:

    dotnet add package Azure.Storage.Blobs
    dotnet restore
    

    Durch Ausführen dieses Befehls wird sichergestellt, dass Sie die neueste Version der Blob Storage-Clientbibliothek verwenden.

Konfigurieren

Die erforderlichen Konfigurationswerte sind die Verbindungszeichenfolge des Speicherkontos und der Name des Containers, den die App für die Speicherung von Dateien verwenden wird. In diesem Modul führen Sie die App nur in Azure App Service aus. Folgen Sie der bewährten Methode von App Service und speichern Sie die Werte in den App Service-Einstellungen. Sie tun dies, wenn Sie die App Service-Instanz erstellen. Im Moment brauchen Sie nichts zu tun.

Die Start-App es enthält bereits alle erforderlichen Einstellungen zum Einsatz der Konfiguration. Der Konstruktorparameter IOptions<AzureStorageConfig> in BlobStorage hat zwei Eigenschaften: die Speicherkonto-Verbindungszeichenfolge und den Namen des Containers, in dem die App Blobs speichert. In der ConfigureServices-Methode von Startup.cs ist Code vorhanden, der die Werte aus der Konfiguration lädt, wenn die App startet.

Initialisieren

  1. Öffnen Sie im Editor die Datei Models/BlobStorage.cs. Fügen Sie die folgenden using-Anweisungen am Anfang der Datei hinzu, um sie für den Code vorzubereiten, den Sie hinzufügen werden.

    using Azure;
    using Azure.Storage.Blobs;
    using Azure.Storage.Blobs.Models;
    
  2. Suchen Sie nach der Initialize-Methode. Ihre App ruft diese Methode auf, wenn sie BlobStorage zum ersten Mal verwendet. Wenn Sie neugierig sind, können Sie sich ConfigureServices in der Datei Startup.cs ansehen, um zu sehen, wie der Aufruf erfolgt.

    Unter Initialize erstellen Sie den Container, falls noch keiner vorhanden ist. Ersetzen Sie die aktuelle Implementierung von Initialize durch den folgenden Code und speichern Sie Ihre Arbeit mit STRG+S.

    public Task Initialize()
    {
        BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);
        return containerClient.CreateIfNotExistsAsync();
    }
    

Klonen und Untersuchen nicht fertiger Apps

  1. Klonen Sie zuerst die Start-App aus GitHub. Führen Sie die folgenden Befehle in der Azure Shell-CLI aus, um eine Kopie des Quellcodes zu erhalten und ihn im Editor zu öffnen:

    git clone https://github.com/MicrosoftDocs/mslearn-store-data-in-azure.git
    cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start
    code .
    
  2. Öffnen Sie im Editor die Datei src/main/java/com/microsoft/azure/samples/jsf/IndexBean.java. Hier gibt es nichts zu tun, aber sehen Sie sich kurz an, was die App kann.

    Diese auf den Anforderungsumfang beschränkte Bean implementiert drei Aktionen, die von der JSF-Seite (Java Server Faces) src/main/webapp/index.xhtml verwendet werden:

    • listFileNames: Diese Aktion gibt eine Liste der Dateinamen zurück, einen für jede hochgeladene Datei. Die Seite index.xhtml ruft diese Methode auf, um eine Liste der Hyperlinks zu den hochgeladenen Dateien zu erstellen.
    • upload: Diese Aktion ruft eine hochgeladene Datei ab und speichert sie. Der Dateiinhalt und die Metadaten werden vom JSF-Framework in die Eigenschaft uploadedFile eingefügt.
    • download: Diese Aktion lädt eine einzelne Datei nach Namen herunter.

    Jede Methode verwendet hierfür eine Storage-Instanz namens storage. Es gibt eine unvollständige Implementierung von Storage in src/main/java/com/microsoft/azure/samples/service/BlobStorage.java, die ausgefüllt werden muss.

Hinzufügen des Verweises auf das Azure Storage SDK für Java

Sie sollten Azure BOM verwenden, um Azure-Clientbibliotheken zum Projekt hinzuzufügen. Sie erleichtern die Orchestrierung mehrerer Azure-Clientbibliotheken bei minimalen Abhängigkeitskonflikten.

  1. Öffnen Sie im Editor die Datei pom.xml.

  2. Fügen Sie den folgenden dependencyManagement-Abschnitt unter dem XML-Tag project hinzu, um Azure-BOMs zum Projekt hinzuzufügen.

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure</groupId>
          <artifactId>azure-sdk-bom</artifactId>
          <version>1.0.6</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    
  3. Um Azure Storage SDK für Java zum Projekt hinzuzufügen, fügen Sie den folgenden dependency-Abschnitt unter dem xml-Tag project/dependencies hinzu.

    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-blob</artifactId>
    </dependency>
    

Konfigurieren

Die erforderlichen Konfigurationswerte sind die Verbindungszeichenfolge für das Speicherkonto und der Name des Containers, den die App zum Speichern von Dateien verwendet. In diesem Modul führen Sie die App nur in Azure App Service aus. Folgen Sie der bewährten Methode von App Service und speichern Sie die Werte in den App Service-Einstellungen. Das tun Sie, wenn wir die App Service-Instanz erstellen. Im Moment brauchen Sie nichts zu tun.

Bei der Verwendung der Konfiguration werden die App Service-App-Einstellungen als Umgebungsvariablen an den Anwendungscode übergeben. Sie lesen sie im Initialisierungscode.

Initialize

  1. Öffnen Sie im Editor src/main/java/com/microsoft/azure/samples/service/BlobStorage.java. Fügen Sie am Anfang der Datei die folgenden import-Anweisungen hinzu, um sie auf den Code vorzubereiten, den Sie hinzufügen werden.

    import java.util.stream.Collectors;
    
    import com.azure.storage.blob.BlobClient;
    import com.azure.storage.blob.BlobContainerClient;
    import com.azure.storage.blob.BlobServiceClient;
    import com.azure.storage.blob.BlobServiceClientBuilder;
    import com.azure.storage.blob.models.BlobItem;
    
  2. Fügen Sie der Klasse BlobStorage eine Klasseneigenschaft für den BlobContainerClient-Verweis hinzu.

    private BlobContainerClient blobContainerClient;
    

    Tipp

    Azure-Clients sind zustandslos und threadsicher. Es wird empfohlen, ihre Instanzen ggf. zwischenzuspeichern. Beispielsweise verwendet die App, an der Sie arbeiten, einen einzelnen Container mit gleichbleibendem Namen. Daher ist es am besten, ihn für die Lebensdauer der App zwischenzuspeichern. BlobStorage ist mit @Singleton kommentiert. Deshalb wird empfohlen, den Verweis BlobContainerClient im zugehörigen Feld zu speichern.

  3. Suchen Sie die init-Methode mit der Anmerkung @PostConstruct. Ihre Anwendung ruft diese Methode auf, nachdem die BlobStorage-Instanz erstellt wurde und bevor sie zum ersten Mal verwendet wird.

    Unter init erstellen Sie den Container, falls noch keiner vorhanden ist. Ersetzen Sie die aktuelle Implementierung von init durch den folgenden Code, und speichern Sie Ihre Arbeit:

    @PostConstruct
    private void init() {
        String connectionString = System.getenv("STORAGE_CONNECTION_STRING");
        String containerName = System.getenv("STORAGE_CONTAINER_NAME");
        BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
            .connectionString(connectionString)
            .buildClient();
        blobContainerClient = blobServiceClient.getBlobContainerClient(containerName);
        if (!blobContainerClient.exists()) {
            blobContainerClient.create();
        }
    }