BLOB インデックス タグを使用して Azure BLOB データを管理および検索する

データセットのサイズが大きくなるほど、大量のデータから特定のオブジェクトを見つけるのが難しくなることがあります。 BLOB インデックス タグを使用すると、キー値インデックス タグ属性を使用して、データ管理機能と探索機能が提供されます。 ストレージ アカウントの 1 つのコンテナー内またはすべてのコンテナー内のオブジェクトを分類および検索できます。 データ要件が変化したら、インデックス タグを更新することによってオブジェクトを動的に分類できます。 現在のコンテナーの編成に合わせてオブジェクトを保持できます。

BLOB インデックス タグを使用すると、次のことができます。

  • キー値インデックス タグを使用して、BLOB を動的に分類する

  • ストレージ アカウント全体で特定のタグが付いた BLOB をすばやく検索する

  • インデックス タグの評価に基づいて BLOB API の条件付き動作を指定する

  • BLOB ライフサイクル管理などの機能の高度な制御に、インデックス タグを使用する

ストレージ アカウントに何百万もの BLOB があり、多数の異なるアプリケーションによってアクセスされるシナリオについて考えてみましょう。 1 つのプロジェクトからすべての関連データを検索する必要があります。 データは異なる名前付け規則を使用して複数のコンテナーに分散されている可能性があるので、スコープ内に何があるか確実にはわかりません。 ただし、アプリケーションを使用すると、すべてのデータにプロジェクトに基づくタグが付けられてアップロードされます。 何百万もの BLOB を検索して名前とプロパティを比較するのではなく、Project = Contoso を検出条件として使用できます。 BLOB インデックスにより、ストレージ アカウント全体のすべてのコンテナーがフィルター処理され、Project = Contoso から 50 個の BLOB のセットだけがすばやく検出されて返されます。

BLOB インデックスの使用方法の例については、BLOB インデックス タグを使用したデータの管理と検索に関する記事を参照してください。

BLOB インデックス タグとデータ管理

コンテナーと BLOB 名のプレフィックスは、1 次元の分類です。 BLOB インデックス タグを使用すると、BLOB データ型 (ブロック、追加、またはページ) に対して多次元の分類を行うことができます。 多次元の分類は Azure Blob Storage によってネイティブにインデックスが付けられるため、データをすばやく見つけることができます。

ストレージ アカウントに次の 5 つの BLOB があるとします。

  • container1/transaction.csv

  • container2/campaign.docx

  • photos/bannerphoto.png

  • archives/completed/2019review.pdf

  • logs/2020/01/01/logfile.txt

これらの BLOB は、"コンテナー/仮想フォルダー/BLOB 名" のプレフィックスを使用して分離されています。 これらの 5 つの BLOB に対して Project = Contoso というインデックス タグ属性を設定することで、現在のプレフィックス編成を維持しながら、それらをまとめて分類することができます。 インデックス タグを追加すると、インデックスを使用してデータをフィルター処理および検索する機能が提供されるため、データを移動する必要がなくなります。

BLOB インデックス タグの設定

BLOB インデックス タグは、ストレージ アカウント内の新規または既存のオブジェクトに適用できるキー値属性です。 アップロード プロセスの間にインデックス タグを指定するには、Put BlobPut Block List、または Copy Blob 操作と、省略可能な x-ms-tags ヘッダーを使用します。 ストレージ アカウントに BLOB が既にある場合は、Set Blob Tags を呼び出し、要求の本文でフォーマット済みの XML ドキュメントとインデックス タグを渡します。

重要

BLOB インデックス タグの設定は、ストレージ BLOB データ所有者と、BLOB のタグにアクセスするためのアクセス許可 (t SAS アクセス許可) が割り当てられた Shared Access Signature を持つ任意のユーザーが実行できます。

さらに、Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write アクセス許可を持つ RBAC ユーザーも、この操作を実行できます。

データの処理が完了した日時を記述する 1 つのタグを BLOB に適用できます。

"processedDate" = '2020-01-01'

BLOB に複数のタグを適用して、データをよりわかりやすくすることができます。

"Project" = 'Contoso' "Classified" = 'True' "Status" = 'Unprocessed' "Priority" = '01'

既存のインデックス タグ属性を変更するには、既存のタグ属性を取得し、そのタグ属性を変更してから、Set Blob Tags 操作を使用して置き換えます。 BLOB からすべてのインデックス タグを削除するには、タグ属性を指定せずに Set Blob Tags 操作を呼び出します。 BLOB インデックス タグは BLOB データ コンテンツのサブリソースであるため、Set Blob Tags により基になるコンテンツは変更されず、BLOB の last-modified-time または eTag も変更されません。 現在のすべてのベース BLOB に対するインデックス タグを作成または変更できます。 以前のバージョンでもインデックス タグは保持されますが、BLOB インデックス エンジンには渡されません。そのため、インデックス タグのクエリを実行して以前のバージョンを取得することはできません。 スナップショットまたは論理的に削除された BLOB のタグは変更できません。

BLOB インデックス タグには次の制限が適用されます。

  • 各 BLOB には、最大 10 個の BLOB インデックス タグを設定できます

  • タグ キーは、1 文字から 128 文字の長さにする必要があります。

  • タグ値は、0 文字から 256 文字の長さにする必要があります。

  • タグ キーとタグ値では、大文字と小文字が区別されます。

  • タグのキーと値によってサポートされるのは、文字列データ型のみです。 数値、日付、時刻、または特殊文字はすべて文字列として保存されます。

  • バージョン管理が有効になっている場合、インデックス タグは特定のバージョンの BLOB に適用されます。 現在のバージョンにインデックス タグを設定し、新しいバージョンを作成した場合、そのタグは新しいバージョンには関連付けられません。 このタグは、以前のバージョンにのみ関連付けられます。

  • タグ キーとタグ値は、次の名前付け規則に従う必要があります。

    • 英数字:

      • a から z (小文字)

      • A から Z (大文字)

      • 0 から 9 (数字)

    • 有効な特殊文字: スペース、プラス、マイナス、ピリオド、コロン、等号、アンダースコア、スラッシュ ( +-.:=_/)

ヒント

ストレージ タスクを使用すると、定義した一連の条件に基づいて、複数のストレージ アカウント全体でオブジェクトにタグを大規模に設定できます。 ストレージ タスクは Azure Storage Actions で利用できるリソースです。これは、複数のストレージ アカウントにまたがる数百万ものオブジェクトに対して一般的なデータ操作を実行するために使用できるサーバーレス フレームワークです。 詳細については、「Azure Storage Actions とは」を参照してください。

BLOB インデックス タグの取得と一覧表示

BLOB インデックス タグは BLOB データと共にサブリソースとして格納され、基になる BLOB データ コンテンツとは別に取得できます。 1 つの BLOB に対する BLOB インデックス タグは、Get Blob Tags 操作で取得できます。 include:tags パラメーターを指定した List Blobs 操作でも、コンテナー内のすべての BLOB が、BLOB インデックス タグと共に返されます。

重要

BLOB インデックス タグの取得と列挙は、ストレージ BLOB データ所有者と、BLOB のタグにアクセスするためのアクセス許可 (t SAS アクセス許可) が割り当てられた Shared Access Signature を持つ任意のユーザーが実行できます。

さらに、Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/read アクセス許可を持つ RBAC ユーザーも、この操作を実行できます。

少なくとも 1 つの BLOB インデックス タグが設定されている BLOB に対し、List BlobsGet BlobGet Blob Properties の各操作で、BLOB のインデックス タグの数を示す x-ms-tag-count が返されます。

BLOB インデックス タグを使用したデータの検索

インデックス エンジンにより、キー値属性が多次元インデックスに公開されます。 インデックス タグを設定すると、それらは BLOB に存在するようになり、すぐに取得できます。

BLOB インデックスが更新されるまでには、時間がかかる場合があります。 これは、タグの追加と既存のタグの編集の両方に当てはまります。 必要な時間は、ワークロードによって異なります。 たとえば、BLOB タグの設定操作が 1 秒間に 15000 ~ 20000 トランザクションの速度で完了するのに 30 分かかる場合、それらすべての BLOB をインデックス作成するのに最大 10 分かかることがあります。 これより低い速度では、インデックス作成の遅延が 1 秒以下になる可能性があります。 トラフィックの分散は、インデックス作成の遅延にも影響します。 たとえば、クライアント アプリケーションが同じコンテナーの下で BLOB にタグを順番に設定すると、一緒に配置されていない BLOB にタグを適用する場合よりも遅延が大きくなる可能性があります。

BLOB インデックスが更新されると、Blob Storage によって提供されるネイティブ クエリと検出の機能を使用できるようになります。

Find Blobs by Tags 操作を使用すると、指定したクエリ式に一致するインデックス タグを持つ BLOB のセットをフィルター処理して取得できます。 Find Blobs by Tags を使用すると、ストレージ アカウント内のすべてのコンテナーをフィルター処理することも、フィルター処理のスコープを 1 つのコンテナーだけに限定することもできます。 すべてのインデックス タグのキーと値は文字列であるため、関係演算子により辞書式の並べ替えが使用されます。

重要

BLOB インデックス タグを使用したデータの検索は、ストレージ BLOB データ所有者と、タグを使用して BLOB を検索するためのアクセス許可 (f SAS アクセス許可) が割り当てられた Shared Access Signature を持つ任意のユーザーが実行できます。

さらに、Microsoft.Storage/storageAccounts/blobServices/containers/blobs/filter/action アクセス許可を持つ RBAC ユーザーも、この操作を実行できます。

BLOB インデックスのフィルター処理には、次の条件が適用されます。

  • タグ キーは二重引用符 (") で囲む必要があります

  • タグ値とコンテナー名は、単一引用符 (') で囲む必要があります

  • @ 文字は、特定のコンテナー名でのフィルター処理にのみ使用できます (例: @container = 'ContainerName')

  • フィルターは、文字列に対する辞書式の並べ替えで適用されます

  • 同じキーに対する同じ側の範囲操作は無効です (例: "Rank" > '10' AND "Rank" >= '15')

  • REST を使用してフィルター式を作成する場合は、文字を URI でエンコードする必要があります

  • タグ クエリは、単一のタグを使用して等号一致するように最適化されています (例: StoreID = "100")。 >, >=, <, <= を含む単一のタグを使用した範囲クエリも効率的です。 AND を複数のタグとともに使用するクエリは、それほど効率的ではありません。 たとえば、Cost > "01" AND Cost <= "100" は効率的です。 Cost > "01 AND StoreID = "2" は効率的ではありません。

次の表では、Find Blobs by Tags に対して有効なすべての演算子を示します。

演算子 Description
= 等しい "Status" = 'In Progress'
> より大きい "Date" > '2018-06-18'
>= 以上 "Priority" >= '5'
< より小さい "Age" < '32'
<= 以下 "Priority" <= '5'
AND 論理 AND "Rank" >= '010' AND "Rank" < '100'
@container 特定のコンテナーに範囲指定します @container = 'videofiles' AND "status" = 'done'

Note

タグの設定とクエリを行うときは、辞書の順序を理解しておいてください。

  • 数字は、文字の前に並べられます。 数字は、1 桁目の数字に基づいて並べられます。
  • 大文字は、小文字の前に並べられます。
  • 記号は標準ではありません。 一部の記号は、数値の前に並べられます。 その他の記号は、文字の前または後に並べられます。

BLOB インデックス タグを使用した条件付き BLOB 操作

REST バージョン 2019-10-10 以降では、ほとんどの BLOB サービス API で、指定された BLOB インデックス条件が満たされた場合にのみ操作が成功するように、条件ヘッダー x-ms-if-tags がサポートされるようになりました。 条件が満たされない場合は、error 412: The condition specified using HTTP conditional header(s) is not met が表示されます。

x-ms-if-tags ヘッダーは、他の既存の HTTP 条件ヘッダーと組み合わせることができます (If-Match、If-None-Match など)。 要求に複数の条件ヘッダーが指定されている場合、操作が成功するには、それらのすべてが true に評価される必要があります。 すべての条件ヘッダーは実質的に、論理 AND で結合されます。

次の表では、条件付き操作に対して有効な演算子を示します。

演算子 Description
= 等しい "Status" = 'In Progress'
<> 等しくない "Status" <> 'Done'
> より大きい "Date" > '2018-06-18'
>= 以上 "Priority" >= '5'
< より小さい "Age" < '32'
<= 以下 "Priority" <= '5'
AND 論理 AND "Rank" >= '010' AND "Rank" < '100'
OR 論理 OR "Status" = 'Done' OR "Priority" >= '05'

Note

Find Blobs by Tags 操作には存在しませんが、BLOB 操作に対する条件付きヘッダー x-ms-if-tags で使用できる演算子として、"等しくない" と "論理 OR" の 2 つが追加されています。

BLOB インデックス タグを使用したプラットフォーム統合

BLOB インデックス タグを使用すると、BLOB データの分類、管理、検索に役立つだけでなく、ライフサイクル管理などの他の Blob Storage 機能との統合も提供されます。

ライフサイクル管理

blobIndexMatch をライフサイクル管理のルール フィルターとして使用すると、BLOB に適用されるインデックス タグに基づいて、データをよりクールな層に移動したり、データを削除したりできます。 ルールをより細かく設定でき、指定したタグ条件に一致する場合にのみ BLOB を移動または削除することができます。

BLOB インデックス一致をライフサイクル ルールのスタンドアロン フィルター セットとして設定して、タグ付きデータにアクションを適用することができます。 または、プレフィックスと BLOB インデックスの両方を組み合わせて、より具体的なデータ セットに一致させることができます。 ライフサイクル ルールで複数のフィルターを指定すると、論理 AND 演算が適用されます。 "すべての" フィルター条件に一致する場合にのみ、アクションが適用されます。

次のライフサイクル管理ルールの例は、videofiles という名前のコンテナー内のブロック BLOB に適用されます。 データが "Status" == 'Processed' AND "Source" == 'RAW' の BLOB インデックス タグ条件と一致する場合にのみ、ルールにより BLOB はストレージをアーカイブするために階層化されます。

Azure portal でのライフサイクル管理における BLOB インデックス一致ルールの例

アクセス許可と承認

次のいずれかの方法を使用して、BLOB インデックス タグへのアクセスを承認できます。

BLOB インデックス タグは、BLOB データに対するサブリソースです。 BLOB の読み取りまたは書き込みを行うアクセス許可または SAS トークンを持つユーザーは、BLOB インデックス タグにアクセスできない可能性があります。

ロールベースのアクセス制御

Microsoft Entra ID を使用する呼び出し元には、BLOB インデックス タグを操作するための次のアクセス許可が付与される場合があります。

BLOB インデックス タグの操作 Azure RBAC アクション
BLOB タグの設定 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write
BLOB タグの取得 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/read
タグによる BLOB の検索 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/filter/action

インデックス タグの操作には、基になる BLOB データとは別に、追加のアクセス許可が必要です。 ストレージ BLOB データ所有者ロールには、3 つの BLOB インデックス タグ操作すべてに対するアクセス許可が付与されます。

SAS のアクセス許可

Shared Access Signature (SAS) を使用する呼び出し元には、BLOB インデックス タグを操作するためのスコープ付きアクセス許可が付与される場合があります。

BLOB のサービス SAS

BLOB インデックス タグへのアクセスを許可するために、BLOB のサービス SAS に次のアクセス許可が付与される場合があります。 BLOB の読み取り (r) と書き込み (w) のアクセス許可だけでは、インデックス タグの読み取りや書き込みを行うことはできません。

アクセス許可 URI の略記 許可される操作
インデックス タグ t BLOB のインデックス タグを取得および設定する

コンテナーのサービス SAS

BLOB タグのフィルター処理を許可するために、コンテナーのサービス SAS に次のアクセス許可が付与される場合があります。 BLOB リスト (i) のアクセス許可では、インデックス タグによる BLOB のフィルター処理を行うことはできません。

アクセス許可 URI の略記 許可される操作
インデックス タグ f インデックス タグを使用して BLOB を検索する

アカウント SAS

BLOB インデックス タグへのアクセスと BLOB タグのフィルター処理を許可するために、アカウント SAS に次のアクセス許可が付与される場合があります。

アクセス許可 URI の略記 許可される操作
インデックス タグ t BLOB のインデックス タグを取得および設定する
インデックス タグ f インデックス タグを使用して BLOB を検索する

BLOB の読み取り (r) と書き込み (w) のアクセス許可だけでは、インデックス タグの読み取りや書き込みを行うことはできません。リスト (i) のアクセス許可では、インデックス タグによる BLOB のフィルター処理を行うことはできません。

メタデータと BLOB インデックス タグのいずれかの選択

BLOB インデックス タグとメタデータはどちらも、ユーザー定義の任意のキー値プロパティを BLOB リソースと共に格納することができます。 どちらも、BLOB の内容を返したり変更したりせずに、直接取得して設定することができます。 メタデータとインデックス タグの両方を使用できます。

ネイティブの Blob Storage サービスによって自動的にインデックス付けされてクエリ可能になるのは、インデックス タグだけです。 メタデータについては、ネイティブなインデックス付けまたは検索はできません。 Azure Search などの別のサービスを使用する必要があります。 BLOB インデックス タグには、基になる BLOB データとは別の読み取り、フィルター処理、書き込みのための追加のアクセス許可があります。 メタデータは、BLOB と同じアクセス許可が使用され、Get Blob および Get Blob Properties 操作によって HTTP ヘッダーとして返されます。 BLOB インデックス タグは、Microsoft マネージド キーを使用して、保存時に暗号化されます。 メタデータは、BLOB データに対して指定されているものと同じ暗号化キーを使用して、保存時に暗号化されます。

以下の表は、メタデータと BLOB インデックス タグの違いをまとめたものです。

Metadata BLOB インデックス タグ
制限 数に制限はなく、合計 8 KB で、大文字と小文字の区別はありません BLOB あたり最大 10 個のタグ、タグあたり 768 バイトで、大文字と小文字が区別されます
更新プログラム アーカイブ層では許可されません。Set Blob Metadata により、既存のすべてのメタデータが置き換えられます。Set Blob Metadata により、BLOB の last-modified-time が変更されます すべてのアクセス層で許可されます。Set Blob Tags により、既存のすべてのタグが置き換えられます。Set Blob Tags により、BLOB の last-modified-time は変更されません
Storage BLOB データと共に格納されます BLOB データのサブリソース
インデックス作成とクエリの実行 Azure Search などの別のサービスを使用する必要があります インデックス付けとクエリ実行機能は、Blob Storage に組み込まれています
暗号化 BLOB データに使用されるのと同じ暗号化キーを使用して保存時に暗号化 Microsoft が管理する暗号化キーを使用して保存時に暗号化
料金 メタデータのサイズは BLOB のストレージ コストに含まれます インデックス タグあたりの固定コスト
ヘッダー応答 メタデータは、Get Blob および Get Blob Properties のヘッダーとして返されます タグ カウントは Get Blob または Get Blob Properties によって返され、タグは Get Blob TagsList Blobs によってのみ返されます
アクセス許可 BLOB データに対する読み取りまたは書き込みのアクセス許可がメタデータに拡張されます インデックス タグの読み取り、フィルター処理、または書き込みには、追加のアクセス許可が必要です
名前を付ける メタデータの名前は C# 識別子の名前付け規則に従う必要があります より広い範囲の英数字が BLOB インデックス タグによってサポートされています

価格

ストレージ アカウント内のインデックス タグの月単位の平均数に対して課金されます。 インデックス作成エンジンには料金はかかりません。 BLOB タグの設定、BLOB タグの取得、および BLOB タグの検索の要求は、現在のそれぞれのトランザクション レートで課金されます。 タグによる BLOB の検索トランザクションを実行するときに試用されるリスト トランザクションの数は、要求に含まれる句の数と同じであることに注意してください。 たとえば、クエリ (StoreID = 100) は 1 つのリスト トランザクションです。 クエリ (StoreID = 100 AND SKU = 10010) は 2 つのリスト トランザクションです。 詳しくは、「ブロック BLOB の価格」を参照してください。

機能サポート

Data Lake Storage Gen2、Network File System (NFS) 3.0 プロトコル、または SSH ファイル転送プロトコル (SFTP) を有効にすると、この機能のサポートが影響を受ける場合があります。 これらの機能のいずれかを有効にしている場合は、「Azure Storage アカウントでの Blob Storage 機能のサポート」 を参照して、この機能のサポートを評価してください。

条件と既知の問題

このセクションでは、既知の問題と条件について説明します。

  • 汎用 v2 アカウントと Premium ブロック BLOB アカウントのみがサポートされます。 Premium ページ BLOB、レガシ BLOB、および階層型名前空間が有効になっているアカウントはサポートされません。 汎用 v1 アカウントはサポートされません。

  • インデックス タグがあるページ BLOB をアップロードしても、タグは保持されません。 ページ BLOB をアップロードした後で、タグを設定してください。

  • BLOB ストレージのバージョン管理が有効になっている場合でも、現在のバージョンでインデックス タグを使用できます。 インデックス タグは以前のバージョンでも保持されますが、これらのタグは BLOB インデックス エンジンには渡されません。そのため、前のバージョンを取得するために使用することはできません。 以前のバージョンを現在のバージョンに昇格させると、その以前のバージョンのタグが現在のバージョンのタグになります。 これらのタグは現在のバージョンに関連付けられているため、BLOB インデックス エンジンに渡され、クエリが実行できるようになります。

  • インデックス タグにインデックスが付けられているかどうかを判断する API はありません。

  • ライフサイクル管理によってサポートされているのは、BLOB インデックス一致による等値チェックのみです。

  • Copy Blob を使用しても、BLOB インデックス タグはコピー元 BLOB から新しいコピー先 BLOB にコピーされません。 コピー操作中にコピー先 BLOB に適用するタグを指定できます。

よく寄せられる質問 (FAQ)

「BLOB インデックス タグに関する FAQ」を参照してください

次のステップ

BLOB インデックスを使用する方法の例については、BLOB インデックスを使用してデータを管理して検索する方法に関する記事を参照してください。

ライフサイクルの管理について確認し、BLOB インデックスの一致を含むルールを設定します。