Azure Blob Storageをコンソールアプリケーションで使う

はじめに

前回は、Azuriteを使ってAzureStorageをエミュレートするでは、AzuriteというローカルでBlob Storageをエミュレートできるソフトを使用した。
今回は、実際にAzure上のBlob Storageにアップロードをしてみる。

環境

Windows 11 Professional
Visual Studio 2022 Community

準備

  • Microsoftアカウント

Azureのアカウントの作成

Azureのアカウントは持っていないので作成をする。
https://azure.microsoft.com/ja-jp/free/search/

  1. サイトの「無料で始める」を選択する。
  2. Microsoftアカウントにログインをする。
  3. Azure 無料アカウントの作成ページで必要な情報を入力する。
    azure-create-account-01

大体全部必要。

  1. カード情報を入力する

  2. お客様の情報を確認する画面に移動する。

  3. 「Azureの利用を始める準備は整いました」の画面になれば完了
    azure-create-account-02

  4. 「Azure portalに移動する」で管理画面に移動する。

2段階認証を有効にする

Microsoftアカウントで2段階認証が有効になっていない場合は2段階認証を有効にしておく。

azure-create-account-03

Azure Blob Storageの作成

  1. Azureサービスから、ストレージアカウントを選択する。
azure-create-blob-storage-01
  1. ストレージアカウントはないので、「ストレージアカウントの作成」を選択する。
    ※左上にある「+作成」でもOK
azure-create-blob-storage-02
  1. 適当に入力して「確認と作成」を選択する。 ※「基本」タブ以外はすべてデフォルトの設定のままにしている。 azure-create-blob-storage-03

「確認と作成」のフェーズでエラー
ストレージアカウント名は一意でないとダメなようだ。
azure-create-blob-storage-04

※ストレージアカウント名は適当な文字列に修正した。

  1. 確認画面にて作成するリソースに問題がなければ「作成」を選択する。

  2. ストレージアカウントにアクセスすると、先ほど作成したストレージアカウントが作成されていることが確認できる。

azure-create-blob-storage-05

コンテナは $logsというものができていた。

azure-create-blob-storage-06

コンテナの作成

を見ると、

Blob Storage のリソース Blob Storage には、3 種類のリソースがあります。 ・ストレージ アカウント ・ストレージ アカウント内のコンテナー ・コンテナー内の BLOB

とある。

そのため、コンテナの中に、BLOBを入れるようなのでコンテナを作成する必要がある。

※ただし、コンソールアプリケーション側で、「目的となるコンテナがない場合は作成する」ということをやっているので不要ではある。

  1. 先ほど作成したストレージアカウントにて、データストレージ > コンテナーにアクセスし、「+コンテナー」を選択する。
azure-create-container-01
  1. sample-containerと名前を入れて「作成」を選択する。
azure-create-container-02
  1. 作成が完了したら、コンテナーの一覧に表示される。

Visual Studio Installerで Azure開発のコンポーネントをインストールする

azure-dev-install-01

コンソールアプリケーションの作成

前回と同じため、以下のリポジトリのプログラムを利用する。
https://github.com/katsuobushiFPGA/AzureStorageSample

ただし、実際のAzureにアクセスを行うため接続情報を修正する必要がある。

ローカルからAzure Blob Storageへのアクセス

を参考に構築する。

今回は、推奨されている パスワードレス(推奨)の方法で実践をしてみる。

どうするかについてだが、記事に

たとえば、ローカルで開発するときに、アプリから Visual Studio のサインイン資格情報を使って認証することができます。

とあるので、Visual Studioのサインイン資格情報が利用できるようだ。

Microsoft Entra ユーザー アカウントにロールを割り当てる

記事に記載の通り実施してみる。

  1. Azure portal で、メインの検索バーまたは左側のナビゲーションを使ってストレージ アカウントを見つけます。

  2. ストレージ アカウントの概要ページで、左側のメニューから [アクセス制御 (IAM)] を選びます。

azure-assign-role-01
  1. 上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。
azure-assign-role-02
  1. 検索ボックスを使って、結果を目的のロールに絞り込みます。 この例では、ストレージ BLOB データ共同作成者を検索し、一致する結果を選び、[次へ] を選びます。
azure-assign-role-03
  1. [アクセスの割り当て先] で、[ユーザー、グループ、またはサービス プリンシパル] を選び、[+ メンバーの選択] を選びます。
azure-assign-role-04
  1. ダイアログで、自分の Microsoft Entra ユーザー名 (通常は user@domain メール アドレス) を検索し、ダイアログの下部にある [選択] を選びます。

  2. [レビューと割り当て] を選んで最終ページに移動し、もう一度 [レビューと割り当て] を行ってプロセスを完了します。

  3. アクセス制御(IAM)で ストレージ BLOB データ共同作成者 が表示されており、割り当てたアカウントが表示されていることを確認する。

azure-assign-role-05

プログラムの修正

  1. Visual Studioを起動し、サインインをする。

  2. DefaultAzureCredential を使用するために、Azure.Identityパッケージをアプリケーションに追加する。

  3. AzureStorageContext.csを修正する

必ず、BlobServiceClient の URI のストレージ アカウント名を更新してください。
ストレージ アカウント名は、Azure portal の概要ページで確認できます。

と記載がある。

<storage-account-name> は各自のストレージアカウントに置き換えること。

AzureStorageContext.cs
using Azure.Identity;
using Azure.Storage.Blobs;
using Microsoft.Extensions.Configuration;

namespace AzureStorageSample.Context
{
    public class AzureStorageContext
    {
        public BlobServiceClient BlobServiceClient { get; }

        public AzureStorageContext(IConfiguration configuration)
        {
            string connectionString = configuration.GetConnectionString("AzureStorageConnection");
            BlobServiceClient = new BlobServiceClient(
                    new Uri("https://<storage-account-name>.blob.core.windows.net"),
                    new DefaultAzureCredential()
            );
        }

        public BlobContainerClient GetBlobContainerClient(string containerName)
        {
            return BlobServiceClient.GetBlobContainerClient(containerName);
        }
    }
}

せっかく、appsettings.jsonで接続文字列を読み込むようにしていたが、今回は動作確認のためにプログラムにベタ書きしている。
次回以降、この辺については勉強して環境ごとに読み込むファイルを変えるように修正する。

実行確認

プログラムの修正は終わったので、やっとこれで動作確認ができる。

「デバッグ」→「デバッグの開始」で起動する。

エラー

実行時に、以下のエラーが出た。

Azure.Identity.CredentialUnavailableException: 'DefaultAzureCredential failed to retrieve a token from the included credentials. 
See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/defaultazurecredential/troubleshoot

https://learn.microsoft.com/ja-jp/azure/developer/java/sdk/troubleshooting-authentication-azure-hosted#troubleshoot-defaultazurecredential

Azure CLIをインストールする

Visual Studio 2022 にサインインするのみだとうまくできなかった。
色々調べたけど、解決しなかったので Azure CLIaz loginをする方法でやってみることとする。

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli

上記ページのWindowsへのインストールでインストールが完了後、ターミナルを開き、下記のコマンドを実行する。

az login
> az login

Select the account you want to log in with. For more information on login with Azure CLI, see https://go.microsoft.com/fwlink/?linkid=2271136

Retrieving tenants and subscriptions for the selection...

[Tenant and subscription selection]

No     Subscription name     Subscription ID                       Tenant
-----  --------------------  ------------------------------------  ------------------
[1] *  Azure subscription 1  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  既定のディレクトリ

The default is marked with an *; the default tenant is '既定のディレクトリ' and subscription is 'Azure subscription 1' (XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX).

Select a subscription and tenant (Type a number or Enter for no changes): 1

Tenant: 既定のディレクトリ
Subscription: Azure subscription 1 (XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)

[Announcements]
With the new Azure CLI login experience, you can select the subscription you want to use more easily. Learn more about it and its configuration at https://go.microsoft.com/fwlink/?linkid=2271236

If you encounter any problem, please open an issue at https://aka.ms/azclibug

[Warning] The login output has been updated. Please be aware that it no longer displays the full list of available subscriptions by default.

既定のディレクトリをテナントとして選択してログインした。

再度実行

コンテナ 'sample-container' を作成しました。
'sample.txt' をアップロードしました。
azure-blob-storage-upload-01

成功した。

Azure Portalでも確認してみる。

azure-blob-storage-upload-02

ちゃんとアップロードできてました。

参考

おわりに

今回は、Azureストレージアカウントに実際にファイルをアップロードするということを実践した。
Azureの接続について、Visual Studioにサインインすればできると書いてあったが、できなかったのでこれは何か自分が見落としていそうな可能性が高い。
これは今後解決したいので調べておくことにする。
まあ、Azure Storage Explorerでサインインしたときに、MicroSoftAccount(ホームテナント)既定のディレクトリという2つのテナント?があって、VisualStudioでサインインしたときにはホームテナントが優先して使われた可能性が高そうな気がする。

あとは、環境変数で接続先を変える方法も知っておきたいので、次回以降にそのあたりを調べて備忘録としてまとめておこうと思う。

また、Azure開発については下記を参考にするのがよさそうだった。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。