Azure Blob Storage の変更フィードのサポート

変更フィードの目的は、ストレージ アカウント内の BLOB と BLOB メタデータに対して行われるすべての変更のトランザクション ログを提供することです。 変更フィードでは、これらの変更の順序指定済み保証済み永続不変読み取り専用ログが提供されます。 クライアント アプリケーションでは、ストリーミングまたはバッチ モードで、いつでもこれらのログを読み取ることができます。 変更ごとに厳密に 1 つのトランザクション ログ エントリが生成されるため、同じ変更に対して複数のログ エントリを管理する必要はありません。 変更フィードを使用すると、低コストで、BLOB ストレージ アカウントで発生する変更イベントを処理する効率的でスケーラブルなソリューションを構築できます。

変更フィードでレコードを処理する方法については、「Azure Blob Storage の変更フィードを処理する」を参照してください。

変更フィードのしくみ

変更フィードレコードは、標準の BLOB 価格コストで、ストレージ アカウントの特別なコンテナーに BLOB として保存されます。 これらのファイルの保有期間は、要件に基づいて制御できます (現在のリリースの条件を参照)。 変更イベントは、Apache Avro 形式仕様のレコードとして変更フィードに追加されます。これは、インライン スキーマを使用して豊富なデータ構造を提供するコンパクトで高速なバイナリ形式です。 この形式は Hadoop エコシステム、Stream Analytics、Azure Data Factory で幅広く使用されています。

これらのログは、非同期的、段階的、または完全に処理できます。 任意の数のクライアント アプリケーションで、個別に変更フィードを並列で、および独自のペースで読み取ることができます。 Apache DrillApache Spark などの分析アプリケーションでは、Avro ファイルとして直接ログを使用できます。これにより、低コストで、また高帯域幅で処理することができ、カスタム アプリケーションを作成する必要はありません。

次の図は、変更フィードにどのようにレコードが追加されるかを示しています。

Diagram showing how the change feed works to provide an ordered log of changes to blobs

変更フィードのサポートは、変更されたオブジェクトに基づいてデータを処理するシナリオに適しています。 たとえば、アプリケーションでは次のことが可能です。

  • セカンダリ インデックスを更新し、キャッシュ、検索エンジンまたはその他のコンテンツ管理シナリオと同期する。
  • ストリーミング方式またはバッチ モードで、オブジェクトに対して行われた変更に基づいて、ビジネス分析の洞察とメトリックを引き出す。
  • エンタープライズ データ管理のためのセキュリティ、コンプライアンスまたはインテリジェンスを確保するために、一定期間にわたるオブジェクトへの変更を格納、監査および分析する。
  • 災害管理またはコンプライアンスのためにアカウント内のオブジェクトの状態をバックアップ、ミラー化またはレプリケートするソリューションを構築する。
  • 作成されたオブジェクトまたは変更されたオブジェクトに基づいて、変更イベントまたはスケジュールの実行に対応する、接続されたアプリケーション パイプラインを構築する。

変更フィードは、オブジェクト レプリケーションブロック BLOB のポイントインタイム リストアを行うための前提条件となる機能です。

Note

変更フィードは、BLOB に発生する変更の持続的でかつ順序付けられたログ モデルを提供します。 変更は、変更から数分以内に変更フィード ログに書き込まれ、使用可能になります。 アプリケーションでこれよりはるかに高速にイベントに対応する必要がある場合は、代わりに Blob Storage イベントを使用することを検討してください。 Blob Storage イベントは、Azure Functions またはアプリケーションが BLOB に発生する変更にすばやく反応できるようにする、リアルタイムの 1 回限りのイベントを提供します。

変更フィードを有効または無効にする

変更のキャプチャや記録を開始するには、ストレージ アカウントで変更フィードを有効にする必要があります。 変更のキャプチャを停止するには、変更フィードを無効にします。 ポータルまたは PowerShell で Azure Resource Manager テンプレートを使用して、変更を有効または無効にすることができます。

変更フィードを有効にする際に注意する点をいくつか以下に示します。

  • 各ストレージ アカウントには、Blob service の変更フィードが 1 つだけあります。 変更フィードレコードは $blobchangefeed コンテナーに格納されます。

  • 変更の作成、更新、および削除は、Blob service のレベルでのみキャプチャされます。

  • 変更フィードでは、アカウントで発生したすべての使用可能なイベントのすべての変更をキャプチャします。 クライアント アプリケーションでは、必要に応じて、イベントの種類をフィルターで除外できます (現在のリリースの条件を参照)。

  • 変更フィードを有効にできるのは、Standard 汎用 v2、Premium ブロック BLOB、Blob Storage の各アカウントのみです。 階層型名前空間が有効にされたアカウントは、現在サポートされていません。 汎用 v1 ストレージ アカウントはサポートされていませんが、ダウンタイムなしで汎用 v2 にアップグレードできます。詳細については、汎用 v2 ストレージ アカウントへのアップグレードに関するページを参照してください。

Azure portal を使用して、ストレージ アカウントで変更フィードを有効にします。

  1. Azure portal で、ストレージ アカウントを選択します。

  2. [データ管理] の下の [データ保護] オプションに移動します。

  3. [追跡] で、 [BLOB の変更フィードを有効にする] を選択します。

  4. [保存] ボタンを選択して、データ保護設定を確認します。

    Screenshot showing how to enable change feed in Azure portal

変更フィードを使用する

変更フィードによって、いくつかのメタデータとログ ファイルが生成されます。 これらのファイルは、ストレージ アカウントの $blobchangefeed コンテナーにあります。 $blobchangefeed コンテナーは、Azure portal または Azure Storage Explorer を使用して表示できます。

クライアント アプリケーションでは、変更フィード プロセッサ SDK に付属している BLOB 変更フィード プロセッサ ライブラリを使って、変更フィードを使用できます。 変更フィードでレコードを処理する方法については、Azure Blob Storage での変更フィード ログの処理に関する記事を参照してください。

フィードセグメントの変更

変更フィードは 1 時間単位セグメントに整理される変更のログですが、数分ごとに追加および更新されます。 これらのセグメントが作成されるのは、その時間内に発生する BLOB 変更イベントがあるときだけです。 これにより、クライアント アプリケーションは、ログ全体を検索することなく、特定の期間内に行われた変更を使用できるようになります。 詳細については、「仕様」を参照してください。

変更フィードの利用可能な時間単位のセグメントは、そのセグメントの変更フィード ファイルへのパスを指定するマニフェスト ファイルに記述されています。 $blobchangefeed/idx/segments/ 仮想ディレクトリのリストには、これらのセグメントが時間順に表示されます。 セグメントのパスは、セグメントで表される時間単位の時間範囲の開始を示します このリストを使用して、関心のあるログのセグメントをフィルターで除外することができます。

Name                                                                    Blob Type    Blob Tier      Length  Content Type    
----------------------------------------------------------------------  -----------  -----------  --------  ----------------
$blobchangefeed/idx/segments/1601/01/01/0000/meta.json                  BlockBlob                      584  application/json
$blobchangefeed/idx/segments/2019/02/22/1810/meta.json                  BlockBlob                      584  application/json
$blobchangefeed/idx/segments/2019/02/22/1910/meta.json                  BlockBlob                      584  application/json
$blobchangefeed/idx/segments/2019/02/23/0110/meta.json                  BlockBlob                      584  application/json

Note

変更フィードを有効にすると、$blobchangefeed/idx/segments/1601/01/01/0000/meta.json が自動的に作成されます。 このファイルは無視してかまいません。 これは常に、空の初期化ファイルです。

セグメント マニフェスト ファイル (meta.json) では、chunkFilePaths プロパティにそのセグメントの変更フィード ファイルのパスが表示されます。 以下は、セグメント マニフェスト ファイルの例です。

{
    "version": 0,
    "begin": "2019-02-22T18:10:00.000Z",
    "intervalSecs": 3600,
    "status": "Finalized",
    "config": {
        "version": 0,
        "configVersionEtag": "0x8d698f0fba563db",
        "numShards": 2,
        "recordsFormat": "avro",
        "formatSchemaVersion": 1,
        "shardDistFnVersion": 1
    },
    "chunkFilePaths": [
        "$blobchangefeed/log/00/2019/02/22/1810/",
        "$blobchangefeed/log/01/2019/02/22/1810/"
    ],
    "storageDiagnostics": {
        "version": 0,
        "lastModifiedTime": "2019-02-22T18:11:01.187Z",
        "data": {
            "aid": "55e507bf-8006-0000-00d9-ca346706b70c"
        }
    }
}

Note

$blobchangefeed コンテナーは、アカウントで変更フィード機能を有効にした後にのみ表示されます。 変更フィードを有効にした後、このコンテナー内の BLOB を一覧表示できるようになるまでに数分待つ必要があります。

変更イベント レコード

変更フィード ファイルには、一連の変更イベント レコードが含まれています。 各変更イベント レコードは、個々の BLOB に対する 1 つの変更に対応しています。 レコードは、Apache Avro 形式の仕様を使用して、シリアル化され、ファイルに書き込まれます。 これらのレコードは、Avro ファイル形式の仕様を使用して読み取ることができます。 その形式のファイルを処理するために使用できるライブラリがいくつかあります。

変更フィード ファイルは、追加 BLOB として $blobchangefeed/log/ 仮想ディレクトリに格納されます。 各パスの下にある最初の変更フィード ファイルでは、ファイル名に 00000 が含まれます (00000.avro など)。 そのパスに追加された後続の各ログ ファイルの名前は、1 ずつ増加します (例: 00001.avro)。

イベントレコードスキーマ

各プロパティの説明については、「Azure Event Grid の Blob Storage 用のイベント スキーマ」を参照してください。 BlobPropertiesUpdated イベントと BlobSnapshotCreated イベントは現在、変更フィードに限定されており、Blob Storage イベントではまだサポートされていません。

Note

セグメントの変更フィード ファイルは、セグメントの作成後すぐには表示されません。 遅延の長さは、変更後数分以内である、変更フィードの公開待機時間の通常の間隔内です。

SCHEMA_VERSION 1

スキーマバージョン 1 のチェンジフィードレコードには、以下のイベントタイプが取り込まれる可能性があります:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated

次の例は、イベントスキーマバージョン1を使用する JSON 形式の変更イベントレコードを示しています:

{
    "schemaVersion": 1,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T12:59:41.4003102Z",
    "id": "322343e3-8020-0000-00fe-233467066726",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "f0270546-168e-4398-8fa8-107a1ac214d2",
        "requestId": "322343e3-8020-0000-00fe-233467000000",
        "etag": "0x8D9F2155CBF7928",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "storageDiagnostics": {
            "bid": "9d725a00-8006-0000-00fe-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

SCHEMA_VERSION 3

スキーマバージョン3では、以下の種類のイベントを変更フィードレコードに取り込むことができます:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated

次の例は、イベントスキーマバージョン3を使用する JSON 形式の変更イベントレコードを示しています:

{
    "schemaVersion": 3,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T13:05:19.6798242Z",
    "id": "eefe8fc8-8020-0000-00fe-23346706daaa",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "00c0b6b7-bb67-4748-a3dc-86464863d267",
        "requestId": "eefe8fc8-8020-0000-00fe-233467000000",
        "etag": "0x8D9F216266170DC",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2022-02-17T13:08:42.4825913Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2022-02-17T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot": "2022-02-17T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "storageDiagnostics": {
            "bid": "9d726370-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

SCHEMA_VERSION 4

スキーマバージョン4では、以下のイベントタイプが変更フィードレコードに取り込まれる可能性があります:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated
  • BlobTierChanged
  • BlobAsyncOperation入門
  • RestorePointMarkerCreated

次の例は、イベントスキーマバージョン 4を使用する JSON 形式の変更イベントレコードを示しています:

{
    "schemaVersion": 4,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T13:08:42.4835902Z",
    "id": "ca76bce1-8020-0000-00ff-23346706e769",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "58fbfee9-6cf5-4096-9666-c42980beee65",
        "requestId": "ca76bce1-8020-0000-00ff-233467000000",
        "etag": "0x8D9F2169F42D701",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "blobVersion": "2022-02-17T16:11:52.5901564Z",
        "containerVersion": "0000000000000001",
        "blobTier": "Archive",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2022-02-17T13:08:42.4825913Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2022-02-17T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot": "2022-02-17T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "asyncOperationInfo": {
            "DestinationTier": "Hot",
            "WasAsyncOperation": "true",
            "CopyId": "copyId"
        },
        "storageDiagnostics": {
            "bid": "9d72687f-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

スキーマ バージョン 5

スキーマ バージョン 5 では、以下のイベントタイプが変更フィード レコードに取り込まれる可能性があります:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated
  • BlobTierChanged
  • BlobAsyncOperation入門

次の例は、スキーマ バージョン 5 を使用する JSON 形式の変更イベント レコードを示しています:

{
    "schemaVersion": 5,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T13:12:11.5746587Z",
    "id": "62616073-8020-0000-00ff-233467060cc0",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "b3f9b39a-ae5a-45ac-afad-95ac9e9f2791",
        "requestId": "62616073-8020-0000-00ff-233467000000",
        "etag": "0x8D9F2171BE32588",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "blobVersion": "2022-02-17T16:11:52.5901564Z",
        "containerVersion": "0000000000000001",
        "blobTier": "Archive",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2022-02-17T13:12:11.5726507Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2022-02-17T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot" : "2022-02-17T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "asyncOperationInfo": {
            "DestinationTier": "Hot",
            "WasAsyncOperation": "true",
            "CopyId": "copyId"
        },
        "blobTagsUpdated": {
            "previous": {
                "Tag1": "Value1_3",
                "Tag2": "Value2_3"
            },
            "current": {
                "Tag1": "Value1_4",
                "Tag2": "Value2_4"
            }
        },
        "restorePointMarker": {
            "rpi": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpp": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpl": "test-restore-label",
            "rpt": "2022-02-17T13:56:09.3559772Z"
        },
        "storageDiagnostics": {
            "bid": "9d726db1-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

スキーマ バージョン 6

スキーマ バージョン 6 の変更フィード レコードでは、次のイベントの種類をキャプチャできます:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated
  • BlobTierChanged
  • BlobAsyncOperation入門

スキーマ バージョン 6 では、コールド 層のサポートが追加されています。

次の例は、イベント スキーマ バージョン 6 を使用する JSON 形式の変更イベント レコードを示しています:

{
    "schemaVersion": 6,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2023-10-11T13:12:11.5746587Z",
    "id": "62616073-8020-0000-00ff-233467060cc0",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "b3f9b39a-ae5a-45ac-afad-95ac9e9f2791",
        "requestId": "62616073-8020-0000-00ff-233467000000",
        "etag": "0x8D9F2171BE32588",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "blobVersion": "2023-10-11T16:11:52.5901564Z",
        "containerVersion": "0000000000000001",
        "blobTier": "Archive",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2023-10-11T13:12:11.5726507Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2023-10-11T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot" : "2023-10-11T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "asyncOperationInfo": {
            "DestinationTier": "Hot",
            "WasAsyncOperation": "true",
            "CopyId": "copyId"
        },
        "blobTagsUpdated": {
            "previous": {
                "Tag1": "Value1_3",
                "Tag2": "Value2_3"
            },
            "current": {
                "Tag1": "Value1_4",
                "Tag2": "Value2_4"
            }
        },
        "restorePointMarker": {
            "rpi": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpp": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpl": "test-restore-label",
            "rpt": "2023-10-11T13:56:09.3559772Z"
        },
        "storageDiagnostics": {
            "bid": "9d726db1-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

仕様

  • 変更イベント レコードは変更フィードにのみ追加されます。 これらのレコードは、追加されると不変になり、レコード位置が安定します。 クライアント アプリケーションでは、変更フィードの読み取り位置で独自のチェックポイントを維持できます。

  • 変更イベント レコードは、変更後数分以内に順に追加されます。 クライアント アプリケーションでは、ストリーム アクセスのために、またはその他の時点に一括で追加されるときにレコードを使用するように選択できます。

  • 変更イベント レコードは、BLOB ごとの変更順で並べ替えられます。 BLOB 全体の変更の順序は、Azure Blob Storage では定義されていません。 前のセグメントのすべての変更は、後続のセグメントのすべての変更の前になります。

  • 変更イベント レコードは、Apache Avro 1.8.2 形式仕様を使用して、ログ ファイルにシリアル化されます。

  • eventType の値が Control である変更イベント レコードは内部システム レコードであり、アカウント内のオブジェクトに対する変更は反映されません。 それらのレコードは無視してかまいません。

  • storageDiagnostics プロパティ バッグの値は内部でのみ使用され、アプリケーションで使用するように設計されていません。 アプリケーションに、そのデータに対する契約上の依存関係があってはなりません。 それらのプロパティは無視してかまいません。

  • セグメントで表される時間は、15 分の範囲の概数です。 したがって、指定された時間内にすべてのレコードを確実に使用するには、連続した前と次の 1 時間のセグメントを使います。

  • 公開スループットを管理するためにログ ストリームは内部でパーティション分割されているため、各セグメントに含まれる chunkFilePaths の数は異なる場合があります。 各 chunkFilePath のログ ファイルは相互に排他的な BLOB が含まれることが保証され、反復処理中の BLOB ごとの変更の順序付けに違反することなく、並列で使用して処理することができます。

  • セグメントは Publishing の状態で始まります。 セグメントへのレコードの追加が完了すると、Finalized になります。 日付が $blobchangefeed/meta/Segments.json ファイル内の LastConsumable プロパティの日付の後であるすべてのセグメントのログ ファイルは、アプリケーションでは使用しないでください。 $blobchangefeed/meta/Segments.json ファイルの LastConsumable プロパティの例を以下に示します。

{
    "version": 0,
    "lastConsumable": "2019-02-23T01:10:00.000Z",
    "storageDiagnostics": {
        "version": 0,
        "lastModifiedTime": "2019-02-23T02:24:00.556Z",
        "data": {
            "aid": "55e551e3-8006-0000-00da-ca346706bfe4",
            "lfz": "2019-02-22T19:10:00.000Z"
        }
    }
}

条件と既知の問題

このセクションでは、変更フィードの現在のリリースにおける既知の問題と条件について説明します。

  • ストレージ アカウントのファイアウォール規則を有効にすると、$blobchangefeed コンテナー内の BLOB を削除するライフサイクル管理要求がブロックされる可能性があります。 信頼できる Microsoft サービスに例外を指定することで、このような要求のブロックを解除できます。 詳細については、ファイアウォールと仮想ネットワークの構成に関する記事の、例外についてのセクションを参照してください。
  • segments.json ファイルの LastConsumable プロパティでは、変更フィードで終了する最初のセグメントがリストされません。 この問題は、最初のセグメントが終了した後でのみ発生します。 最初の 1 時間後の後続のすべてのセグメントは、LastConsumable プロパティで正確にキャプチャされます。
  • 現在、ListContainers API を呼び出したときに $blobchangefeed コンテナーを表示することはできません。 コンテンツを表示するには、$blobchangefeed コンテナーで直接 ListBlobs API を呼び出します。
  • 変更フィードが有効になっている geo 冗長ストレージ アカウントのストレージ アカウント フェールオーバーでは、変更フィード ログと BLOB データまたはメタデータの間で不整合が発生する場合があります。 このような不整合について詳しくは、「変更フィードと BLOB データの不整合」をご覧ください。
  • $blobchangefeed および $blobchangefeedsys コンテナーで、404 (Not Found) および 412 (Precondition Failed) エラーが表示される場合があります。 これらのエラーは無視してかまいません。
  • BLOB のバージョンまたはスナップショットが削除された場合、BlobDeleted イベントは生成されません。 BlobDeleted イベントは、ベース (ルート) BLOB が削除された場合にのみ追加されます。
  • イベント レコードは、Blob Service エンドポイント (blob.core.windows.net) への要求に起因する BLOB への変更に対してのみ追加されます。 Data Lake Storage エンドポイント (dfs.core.windows.net) への要求に起因する変更はログに記録されず、変更フィード レコードには表示されません。

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

「変更フィードのサポートに関する FAQ」 を参照してください。

機能サポート

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