Help us understand the problem. What is going on with this article?

AzureStorageのBlobを一覧で取得する

More than 5 years have passed since last update.

初めての投稿となります。
お手柔らかによろしくお願いします。

AzureStorageをクラウドストレージとして利用されている方は沢山いらっしゃると思います。
最近の話ですがOneDriveに利用制限が設けられたのも数十TB利用しているユーザが多く居るからだと言われています。

そんなにストレージを利用していると何をどれだけ上げているのか知りたくなると思います。
というわけでBlobの情報を取得する方法を書いていきたいと思います。

前提:StorageLibrary6.1.0 VisualStudio2015を使用

事前準備

NugetマネージャでStorageLibraryを取得しましょう。
「ツール」 → 「Nugetパッケージマネージャ」 → 「ソリューションのNugetパッケージの管理」から開けます。検索に「AzureStorage」と入れると一覧が取得できるの「WindowsAzure.Storage」を選択してインストールしてください。
Nuget管理.png

インストール中に下記の質問がありますが、迷わずOKしてください。
インストール先のプロジェクト及びインストールするDLLの一覧がひょっじされています。
プレビュー管理.png

ライセンスへの同意確認が表示されますので、迷わず同意してください。
Microsoft製のパッケージなので基本的に問題ないです。
プレビュー管理2.png

インストールが完了した後は「フィルター」を「インストール済み」にしてインストール済み一覧に表示されていることを確認します。インストール済みだとボタンがアンインストールに変わります。
Nuget管理2.png

これで事前準備完了です。

それではここからコードを記載していきます。
抜粋で記載するのでコピペしても動かないので予めご了承ください。

①ストレージアカウントインスタンスを作成します。

C#
//ストレージアカウントの作成
var scaa = new StorageCredentialsAccountAndKey([ストレージ名], [ストレージKEY]);
var storageAccount = new CloudStorageAccount(scaa, false);

ここの設定はお作法ですので詳細は割愛します。

②Blob操作用のクライアントインスタンスを作成します。

C#
//BlobClientの作成
CloudBlobClient blobStorage = storageAccount.CreateCloudBlobClient();

ここもお作法です。

③Blob操作用のOptionの設定を行います。

C#
//ブロブの情報を取得するための設定
var blobRequestOptions = new BlobRequestOptions();
blobRequestOptions.BlobListingDetails = BlobListingDetails.Metadata;
blobRequestOptions.UseFlatBlobListing = true;

ここで重要になるのが「UseFlatBlobListing」です。
この設定はデータの取得方法の設定になります。
設定をTrueにすることで階層を無視したFlatなBlob情報を取得できるようになります。

④Blobを取得します。

C#
long fileCount = 0;
long count = 0;

//コンテナ名を指定してコンテナ情報を取得する。
CloudBlobContainer blobContainer = blobStorage.GetContainerReference([コンテナ名]);

//継続トークン
ResultContinuation blobtoken = null;

do
{
    var blobResult = blobContainer.ListBlobsSegmented(1000, blobtoken, blobRequestOptions);

  //継続トークの取得
    blobtoken = blobResult.ContinuationToken;

  //取得したBlob情報を直接取得
  var blobList = blobResult.Results.ToList();

    foreach (var item in blobList)
    {
      //件数をカウント
        fileCount++;     
        //blob容量を取得しカウント
        count += ((Microsoft.WindowsAzure.StorageClient.CloudBlob)(item)).Properties.Length;
    }

} while (blobtoken != null);

コンテナ名を指定してコンテナ情報を取得します。
コンテナ内のBlobを参照するために「ListBlobsSegmented」を使用します。
第一引数は一度のリクエストで取得する件数です。一度のリクエストで取得できる件数はMAX5000件なため5000以上の値を設定しても5000件のレスポンスになります。ここでは1000件を指定しているので一度のリクエストで1000件ずつ参照します。
第2引数は継続トークンの指定、第3引数はリクエストオプションになります。

ここで重要になるのはdo~while文です。
Blobから「ListBlobsSegmented」で参照する度に継続トークンを確認し、後判断でnullになるまで繰り返します。

上記の方法でBlobの一覧を取得することが出来ます。

余談
500万Blobを調査するのに3時間40分かかりました。
1回のリクエストで取得できるBlob数は最大5000までなのでBlob数が多ければ多いほど時間がかかるのは仕方ありません。
バッチにしてバックグラウンドで実行しておけばいつかは終わるでしょう。

長々と記載しましたがお付き合い頂きありがとうございます。
ご意見・ご感想があればコメントをよろしくお願いします。

kingkinoko
プログラムを弄りたいPMです。
http://blog.kokoni.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away