演習 - クライアント ライブラリを構成して初期化する
Azure Blob Storage を使用するアプリの一般的なワークフローは次のとおりです。
構成を取得する: 起動時に、ストレージ アカウントの構成 (通常はストレージ アカウントの接続文字列) を読み込みます。
クライアントを初期化する: Azure Storage クライアント ライブラリを初期化するために、接続文字列を使用します。 この初期化により、BLOB ストレージ API を操作する場合にアプリで使用されるオブジェクトが作成されます。
使用する: コンテナーおよび BLOB を操作するには、クライアント ライブラリを使用して API 呼び出しを行います。
接続文字列の構成
アプリを実行する前に、使用するストレージ アカウント用の接続文字列を取得します。 これは、Azure portal、Azure CLI、Azure PowerShell などの Azure 管理インターフェイスを使用して取得できます。 このモジュールの最後近くにあるコードを実行するように Web アプリを設定する場合は、Azure CLI を使用して、前に作成したストレージ アカウントの接続文字列を取得します。
ストレージ アカウント接続文字列には、アカウント キーが含まれます。 アカウント キーをシークレットと見なし、常に安全に保存します。 ここでは、接続文字列を App Service アプリ設定内に格納します。 App Service アプリ設定は、アプリのシークレットを安全に格納できる場所です。 この設計ではローカル開発はサポートされていません。また、単独では堅牢なエンド ツー エンドのソリューションではありません。
重要
このコード例では、接続文字列を使用してストレージ アカウントへのアクセスを承認します。 この設定は例です。 接続文字列とアカウント アクセス キーは、アプリケーション コードにおいて慎重に使用する必要があります。 アカウント アクセス キーを紛失した場合、または誤ってセキュリティで保護されていない場所に置いた場合には、サービスが脆弱になる可能性があります。 アクセス キーを持つすべてのユーザーは、ストレージ アカウントに対する要求を承認でき、実質的にすべてのデータにアクセスできます。
最適なセキュリティのため、Microsoft では、可能な限り、Microsoft Entra ID とマネージド ID を使って、BLOB、キュー、テーブルのデータに対する要求を認可することをお勧めします。 詳細については、「Microsoft Entra ID を使用して BLOB へのアクセスを承認する」をご覧ください。
BLOB ストレージ オブジェクト モデルを初期化する
Azure Storage SDK for .NET において、Blob Storage を使用するための標準的なパターンは、次のとおりです。
新しい
BlobServiceClient
オブジェクトのインスタンスを作成し、ストレージ アカウントへの接続文字列を指定します。BlobContainerClient
を取得するには、BlobServiceClient
でGetBlobContainerClient
を呼び出し、対話または作成するコンテナーの名前を指定します。
コードでは、これらの手順は次のようになります。
BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);
この初期化コードで、ネットワーク経由の呼び出しが行われることはありません。 この事実は、間違った情報が原因で発生した一部の例外は後になるまでスローされないことを意味します。 たとえば、正しく書式設定されていない接続文字列を BlobServiceClient
クラスのコンストラクターに渡した場合、すぐに例外がスローされます。 ただし、接続文字列が存在しないストレージ アカウントを指している場合、そのストレージ アカウントに対する操作しようとするまで例外はスローされません。
Azure Storage SDK for Java において、Blob Storage を使用するための標準的なパターンは、次の手順で構成されます。
ストレージ アカウントへの接続文字列を使用して新しい
BlobServiceClientBuilder
オブジェクトをインスタンス化することにより、BlobServiceClient
を構築します。対話または作成するコンテナーの名前を指定して
BlobServiceClient
でgetBlobContainerClient
を呼び出すことにより、BlobContainerClient
を取得します。
コードでは、これらの手順は次のようになります。
BlobServiceClient blobServiceClient = BlobServiceClientBuilder()
.connectionString(connectionString)
.buildClient();
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);
この初期化コードで、ネットワーク経由の呼び出しが行われることはありません。 この事実は、間違った情報が原因で発生した一部の例外は後になるまでスローされないことを意味します。 たとえば、正しく書式設定されていない接続文字列を BlobServiceClientBuilder
に渡した場合、すぐに例外がスローされます。 ただし、接続文字列が存在しないストレージ アカウントを指している場合、そのストレージ アカウントに対する操作しようとするまで例外はスローされません。
起動時にコンテナーを作成する
アプリの起動時またはアプリで初めてコンテナーを使用するときにコンテナーを作成するには、BlobContainerClient
で CreateIfNotExistsAsync
を呼び出します。
CreateIfNotExistsAsync
では、コンテナーが既に存在している場合、例外はスローされませんが、Azure Blob Storage へのネットワーク呼び出しは行われます。 呼び出しは、コンテナーを使用するたびではなく、初期化中に 1 回行います。
アプリの開始時またはアプリでコンテナーを最初に使用するときにコンテナーを作成するには、BlobContainerClient
で exists
を呼び出して、コンテナーが既に存在するかどうかを確認します。 存在しない場合は、create
を呼び出します。 呼び出しは、コンテナーを使用するたびではなく、初期化中に 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 .
エディターで、ファイル 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.cs
の ConfigureServices
メソッド内には、アプリの起動時に構成から値を読み込むコードがあります。
初期化する
エディターで、Models/BlobStorage.cs を開きます。 ファイルの先頭に次の
using
ステートメントを追加して、追加するコード用に準備します。using Azure; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models;
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(); }
未完了のアプリを複製して詳細を確認する
まず、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 .
エディターで、ファイル 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 クライアント ライブラリを使用して簡単かつ洗練された方法で調整できます。
エディターで、ファイル pom.xml を開きます。
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>
Azure Storage SDK for Java を追加するには、次の
dependency
をproject/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
エディターで、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;
BlobStorage
参照を保持するBlobContainerClient
クラスにクラス プロパティを追加します。private BlobContainerClient blobContainerClient;
ヒント
Azure クライアントはステートレスで、スレッドセーフです。 該当する場合は、インスタンスをキャッシュすることをお勧めします。 たとえば、作業しているアプリでは、定数名を持つ単一のコンテナーを使用しているため、アプリ有効期間のスコープでキャッシュすることをお勧めします。
BlobStorage
には@Singleton
の注釈が付けられているため、そのフィールドにBlobContainerClient
参照を格納することをお勧めします。@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(); } }