演習 - クライアント ライブラリを構成して初期化する

完了

Azure Blob Storage を使用するアプリの一般的なワークフローは次のとおりです。

  1. 構成を取得する: 起動時に、ストレージ アカウントの構成 (通常はストレージ アカウントの接続文字列) を読み込みます。

  2. クライアントを初期化する: Azure Storage クライアント ライブラリを初期化するために、接続文字列を使用します。 この初期化により、BLOB ストレージ API を操作する場合にアプリで使用されるオブジェクトが作成されます。

  3. 使用する: コンテナーおよび BLOB を操作するには、クライアント ライブラリを使用して API 呼び出しを行います。

接続文字列の構成

アプリを実行する前に、使用するストレージ アカウント用の接続文字列を取得します。 これは、Azure portal、Azure CLI、Azure PowerShell などの Azure 管理インターフェイスを使用して取得できます。 このモジュールの最後近くにあるコードを実行するように Web アプリを設定する場合は、Azure CLI を使用して、前に作成したストレージ アカウントの接続文字列を取得します。

ストレージ アカウント接続文字列には、アカウント キーが含まれます。 アカウント キーは、シークレットと考えてください。 これを安全に保管します。 ここでは、接続文字列を App Service アプリ設定内に格納します。 App Service アプリ設定は、アプリのシークレットを安全に格納できる場所です。 この設計ではローカル開発はサポートされていません。また、単独では堅牢なエンド ツー エンドのソリューションではありません。

警告

コード内または保護されていない構成ファイル内には、ストレージ アカウント キーを配置しないでください。 ストレージ アカウント キーにより、ご利用のストレージ アカウントへのフル アクセスを有効にすることができます。 キーが漏えいすると、回復不能な損害が発生し、高額の請求を招く恐れがあります。 ストレージのガイダンスおよび漏えいしたキーを回収する方法については、このモジュールの最後に示す「参考資料」セクションを参照してください。

BLOB ストレージ オブジェクト モデルを初期化する

Azure Storage SDK for .NET において、Blob Storage を使用するための標準的なパターンは、次のとおりです。

  1. 新しい BlobServiceClient オブジェクトのインスタンスを作成し、ストレージ アカウントへの接続文字列を指定します。

  2. BlobContainerClient を取得するには、BlobServiceClientGetBlobContainerClient を呼び出し、対話または作成するコンテナーの名前を指定します。

コードでは、これらの手順は次のようになります。

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

この初期化コードで、ネットワーク経由の呼び出しが行われることはありません。 この事実は、間違った情報が原因で発生した一部の例外は後になるまでスローされないことを意味します。 たとえば、正しく書式設定されていない接続文字列を BlobServiceClient クラスのコンストラクターに渡した場合、すぐに例外がスローされます。 ただし、接続文字列が存在しないストレージ アカウントを指している場合、そのストレージ アカウントに対する操作しようとするまで例外はスローされません。

Azure Storage SDK for Java において、Blob Storage を使用するための標準的なパターンは、次の手順で構成されます。

  1. ストレージ アカウントへの接続文字列を使用して新しい BlobServiceClientBuilder オブジェクトをインスタンス化することにより、BlobServiceClient を構築します。

  2. 対話または作成するコンテナーの名前を指定して BlobServiceClientgetBlobContainerClient を呼び出すことにより、BlobContainerClient を取得します。

コードでは、これらの手順は次のようになります。

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

この初期化コードで、ネットワーク経由の呼び出しが行われることはありません。 この事実は、間違った情報が原因で発生した一部の例外は後になるまでスローされないことを意味します。 たとえば、正しく書式設定されていない接続文字列を BlobServiceClientBuilder に渡した場合、すぐに例外がスローされます。 ただし、接続文字列が存在しないストレージ アカウントを指している場合、そのストレージ アカウントに対する操作しようとするまで例外はスローされません。

起動時にコンテナーを作成する

アプリの起動時またはアプリで初めてコンテナーを使用するときにコンテナーを作成するには、BlobContainerClientCreateIfNotExistsAsync を呼び出します。

CreateIfNotExistsAsync では、コンテナーが既に存在している場合、例外はスローされませんが、Azure Blob Storage へのネットワーク呼び出しは行われます。 呼び出しは、コンテナーを使用するたびではなく、初期化中に 1 回行います。

アプリの開始時またはアプリでコンテナーを最初に使用するときにコンテナーを作成するには、BlobContainerClientexists を呼び出して、コンテナーが既に存在するかどうかを確認します。 存在しない場合は、create を呼び出します。 呼び出しは、コンテナーを使用するたびではなく、初期化中に 1 回行います。

演習

未完了のアプリを複製して詳細を確認する

  1. まず、GitHub からスターター アプリを複製します。 ソース コードのコピーを取得し、それをエディターで開くには、Azure Shell CLI で次のコマンドを実行します。

    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. エディターで、ファイル Controllers/FilesController.cs を開きます。 ここで行う作業はありませんが、アプリで実行されることを簡単に見てみましょう。

    このコントローラーでは、次の 3 つのアクションによって API が実装されます。

    • インデックス: (GET /api/Files) は、URL (アップロードされたファイルごとに 1 つずつ) の一覧を返します。 アップロードされたファイルへのハイパーリンクのリストを作成するこのメソッドがアプリ フロント エンドによって呼び出されます。
    • アップロード: (POST /api/Files) は、アップロードされたファイルを受信し、保存します。
    • ダウンロード: (GET /api/Files/{filename}) は、個々のファイルを名前でダウンロードします。

    該当する処理を実行するために、各メソッドでは storage と呼ばれる IStorage インスタンスが使用されます。 Models/BlobStorage.cs には、IStorage の不完全な実装があり、これに入力する必要があります。

NuGet パッケージを追加する

  • Azure Storage SDK への参照を追加します。 Azure Shell CLI で次のコマンドを実行します。

    dotnet add package Azure.Storage.Blobs
    dotnet restore
    

    このコマンドを実行すると、最新バージョンの Blob Storage クライアント ライブラリを確実に使用できます。

構成

必要な構成値は、ストレージ アカウントの接続文字列と、アプリでファイルを格納するために使用されるコンテナーの名前です。 このモジュールでは、Azure App Service でのみアプリを実行します。 App Service のベスト プラクティスに従い、App Service アプリ設定の値を格納します。 これは、App Service インスタンスの作成時に行います。 現時点では、何も行う必要はありません。

構成の "使用" については、スターター アプリに、必要なプラミングが含まれています。 BlobStorage 内の IOptions<AzureStorageConfig> コンストラクター パラメーターには 2 つのプロパティ (ストレージ アカウントの接続文字列と、アプリでファイルを格納するために使用されるコンテナーの名前) があります。 Startup.csConfigureServices メソッド内には、アプリの起動時に構成から値を読み込むコードがあります。

初期化する

  1. エディターで、Models/BlobStorage.cs を開きます。 ファイルの先頭に次の using ステートメントを追加して、追加するコード用に準備します。

    using Azure;
    using Azure.Storage.Blobs;
    using Azure.Storage.Blobs.Models;
    
  2. Initialize メソッドを見つけます。 アプリで初めて BlobStorage を使用するときに、このメソッドを呼び出します。 関心がある場合は、Startup.cs 内にある ConfigureServices を調べると、呼び出しがどのように行われるかを確認できます。

    Initialize は、コンテナーがまだ存在していない場合にコンテナーを作成する場所です。 Initialize の現在の実装を次のコードに置き換え、CTRL+S キーを使用して作業内容を保存します。

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

未完了のアプリを複製して詳細を確認する

  1. まず、GitHub からスターター アプリを複製します。 ソース コードのコピーを取得し、それをエディターで開くには、Azure Shell CLI で次のコマンドを実行します。

    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. エディターで、ファイル src/main/java/com/microsoft/azure/samples/jsf/IndexBean.java を開きます。 ここで行う作業はありませんが、アプリで実行されることを簡単に見てみましょう。

    この要求スコープ指定された Bean は、src/main/webapp/index.xhtml Java Server Faces (JSF) ページで使用される 3 つのアクションを実装します。

    • listFileNames: ファイル名 (アップロードされたファイルごとに 1 つ) のリストが返されます。 index.xhtml ページでは、このメソッドを呼び出して、アップロードされたファイルへのハイパーリンクの一覧が作成されます。
    • upload: アップロードされたファイルが受信され、保存されます。 ファイルの内容とメタデータは、JSF フレームワークによって uploadedFile プロパティに挿入されます。
    • download: 個々のファイルが名前でダウンロードされます。

    各メソッドでは、該当する処理を実行するために、storage と呼ばれる Storage インスタンスが使用されます。 src/main/java/com/microsoft/azure/samples/service/BlobStorage.java には、Storage の不完全な実装があり、これに入力する必要があります。

Azure Storage SDK for Java 参照を追加する

Azure クライアント ライブラリをプロジェクトに追加するには、Azure BOM を使用することをお勧めします。 そうすれば、依存関係の競合を確実に最小限に抑えながら、複数の Azure クライアント ライブラリを使用して簡単かつ洗練された方法で調整できます。

  1. エディターで、ファイル pom.xml を開きます。

  2. Azure BOM をプロジェクトに追加するには、project xml タブの下に次の dependencyManagement セクションを追加します。

    <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. Azure Storage SDK for Java を追加するには、次の dependencyproject/dependencies xml セクションに追加します。

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

構成

必要な構成値は、ストレージ アカウントの接続文字列と、アプリでファイルを格納するために使用されるコンテナーの名前です。 このモジュールでは、Azure App Service でのみアプリを実行します。 App Service のベスト プラクティスに従い、App Service アプリ設定の値を格納します。 これは、App Service インスタンスの作成時に行います。 現時点では、何も行う必要はありません。

構成を "使用する" ときには、App Service アプリの設定は環境変数としてアプリ コードに渡されます。 それらを初期化コードで読み取ります。

Initialize

  1. エディターで、src/main/java/com/microsoft/azure/samples/service/BlobStorage.java を開きます。 ファイルの先頭に次の import ステートメントを追加して、追加するコード用に準備します。

    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. BlobStorage 参照を保持する BlobContainerClient クラスにクラス プロパティを追加します。

    private BlobContainerClient blobContainerClient;
    

    ヒント

    Azure クライアントはステートレスで、スレッドセーフです。 該当する場合は、インスタンスをキャッシュすることをお勧めします。 たとえば、作業しているアプリでは、定数名を持つ単一のコンテナーを使用しているため、アプリ有効期間のスコープでキャッシュすることをお勧めします。 BlobStorage には @Singleton の注釈が付けられているため、そのフィールドに BlobContainerClient 参照を格納することをお勧めします。

  3. @PostConstruct の注釈が付いている init メソッドを見つけます。 アプリで、BlobStorage インスタンスの作成後、それを最初に使用する前に、このメソッドを呼び出します。

    init は、コンテナーがまだ存在していない場合にコンテナーを作成する場所です。 init の現在の実装を次のコードで置き換えて、作業内容を保存します。

    @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();
        }
    }