データの消去

Note

この記事は、デバイスまたはサービスから個人データを削除する手順について説明しており、GDPR の下で義務を果たすために使用できます。 GDPR に関する一般情報については、Microsoft Trust Center の GDPR に関するセクションおよび Service Trust Portal の GDPR に関するセクションをご覧ください。

データ プラットフォームとして、Azure Data Explorer では Kusto .purge および関連するコマンドを使用して、個々のレコードを削除する機能がサポートされています。 また、具体化されたビューテーブル全体を消去したり、レコードを消去したりできます。

警告

.purge コマンドを使用したデータの削除は、個人データの保護を意図したものであり、他のシナリオでは使用しないでください。 それは、頻繁な削除要求や大量のデータの削除をサポートするように設計されていないため、サービスのパフォーマンスに多大な影響を与える可能性があります。

消去のガイドライン

Azure Data Explorer に個人データを保存する前に、データ スキーマを慎重に設計し、関連するポリシーを調べます。

  1. 最適なシナリオでは、このデータの保持期間は十分に短く、データは自動的に削除されます。
  2. 保持期間が使用できない場合は、少数の Azure Data Explorer テーブルで、プライバシー規則の対象となるすべてのデータを分離します。 最適なのは、1 つのテーブルを使用し、他のすべてのテーブルからリンクすることです。 この分離により、機密データを保持する少数のテーブルでデータ消去プロセスを実行し、他のすべてのテーブルを回避できます。
  3. 呼び出し元は、.purge コマンドの実行を 1 日あたりテーブルあたり 1~2 のコマンドにバッチ処理する必要があります。 一意のユーザー ID 述語を使用して、複数のコマンドを発行しないようにしてください。 代わりに、述語に消去が必要なすべてのユーザー ID が含まれる単一のコマンドを送信します。

削除プロセス

Azure Data Explorer からデータを選択的に消去するプロセスは、次の手順で実行されます。

  1. フェーズ 1: Azure Data Explorer のテーブル名と、削除するレコードを示すレコードごとの述語を入力します。 Kusto はテーブルをスキャンして、データ消去に参加するデータ エクステントを特定します。 識別されるエクステントは、述語が true を返す 1 つ以上のレコードを持つエクステントです。

  2. フェーズ 2: (論理的な削除) テーブル内の各データ エクステント (手順 (1) で識別) を再インジェクト バージョンに置き換えます。 再生成されたバージョンには、述語が true を返すレコードを含めないでください。 新しいデータがテーブルに取り込まれない場合、このフェーズの終わりまでに、クエリは述語が true を返すデータを返さなくなります。 消去の論理的な削除フェーズの期間は、次のパラメーターによって異なります。

    • 消去する必要があるレコードの数
    • クラスター内のデータ エクステント全体のレコード分布
    • クラスター内のノードの数
    • 消去操作用の予備の容量
    • その他のいくつかの要因

    フェーズ 2 の期間は、数秒から数時間の間となる場合があります。

  3. フェーズ 3: (物理的な削除) 「有害」であるデータを含む可能性があるすべてのストレージ成果物を処理し、ストレージから削除します。 このフェーズは、前のフェーズの完了から最短で 5 日後に実行されますが、最初のコマンドから 30 日以内に実行されます。 これらのタイムラインは、データ プライバシーの要件に従って設定されます。

.purge コマンドを発行すると、このプロセスがトリガーされ、完了まで数日かかります。 述語が適用されるレコードの密度が十分に大きい場合、プロセスはテーブル内のすべてのデータを効果的に再インジェクトします。 この再インジェクトは、パフォーマンスと COGS (売却済商品の原価) に多大な影響を与えます。

消去の制限と考慮事項

  • 消去プロセスは最終処理であり、元に戻すことはできません。 このプロセスを "元に戻す" ことや、消去されたデータを回復することはできません。 テーブルのドロップを元に戻すなどのコマンドでは、消去されたデータを回復できません。 最新の消去コマンドの前には、データを以前のバージョンにロールバックできません。

  • 消去を実行する前に、クエリを実行し、結果が予想される結果と一致しているか確認して、述語を検証します。 また、消去されるレコードの予想数を返す 2 段階のプロセスを使用することもできます。

  • .purge コマンドは、次のデータ管理エンドポイント https://ingest-[YourClusterName].[region].kusto.windows.net に対して実行されます。 このコマンドを実行するには、関連するデータベースに対するデータベース管理者権限が必要です。

  • 消去プロセスによるパフォーマンスへの影響のため、および消去ガイドラインに従っていることを保証するために、呼び出し元には、最小限のテーブルに関連データが含まれるようにデータ スキーマを変更し、テーブルごとにバッチ コマンドを実行して、消去プロセスによる COGS への多大な影響を軽減することが期待されています。

  • .purge コマンドの predicate パラメーターを使用して、消去するレコードを指定します。 Predicate のサイズは 1 MB に制限されています。 predicate を構築する場合:

    • 'in' 演算子を使用します (例: where [ColumnName] in ('Id1', 'Id2', .. , 'Id1000'))。
    • 'in' 演算子の制限に注意してください (リストには最大 1,000,000 値まで含めることができます)。
    • クエリ サイズが大きい場合は、 externaldata演算子 (例: where UserId in (externaldata(UserId:string) ["https://...blob.core.windows.net/path/to/file?..."])) を使用します。 ファイルには、消去する ID の一覧が格納されます。
    • すべての externaldata BLOB を展開した後のクエリの合計サイズ (すべての BLOB の合計サイズ) は、64 MB を超えることはできません。

消去のパフォーマンス

クラスターで実行できる消去要求は、常時 1 つのみです。 その他のすべての要求は、Scheduled 状態のキューに入ります。 消去要求キューのサイズを監視し、データに適用される要件に合わせて適切な制限内に保持します。

消去の実行時間を短縮するには:

消去プロセスをトリガーする

Note

パージの実行は、データ管理エンドポイント https://ingest-[YourClusterName].[Region].kusto.windows.net で、消去テーブル TableName レコード コマンドを実行することによって呼び出されます。

テーブル TableName レコード コマンドを消去する

異なる使用シナリオに対応するため、消去コマンドは 2 つの方法で呼び出すことができます。

  • プログラムによる呼び出し:アプリケーションによって呼び出されることを目的とした単一の手順。 このコマンドを呼び出すと、消去実行シーケンスが直接トリガーされます。

    構文

    // Connect to the Data Management service
    #connect "https://ingest-[YourClusterName].[region].kusto.windows.net"
    
    // To purge table records
    .purge table [TableName] records in database [DatabaseName] with (noregrets='true') <| [Predicate]
    
    // To purge materialized view records
    .purge materialized-view [MaterializedViewName] records in database [DatabaseName] with (noregrets='true') <| [Predicate]
    
  • ユーザーによる呼び出し:独立した手順として明確な確認を必要とする 2 段階のプロセス。 コマンドを最初に呼び出すと、検証トークンが返されます。実際の消去を実行するには、このトークンを指定する必要があります。 このシーケンスでは、不適切なデータが誤って削除されるリスクが軽減されます。

Note

2 ステップの呼び出しの最初の手順では、消去するレコードを識別するために、データセット全体に対してクエリを実行する必要があります。 このクエリは、特に大量のコールド キャッシュ データを使用して、大きなテーブルでタイム アウトまたは失敗する場合があります。 エラーが発生した場合は、述語を自分で検証し、正しさの確認後に noregrets オプションで単一ステップの消去を使用します。

構文

Note

Azure Data Explorer Web UI を使用してクラスターに接続するには、「クラスターの追加」を参照してください。

   // Connect to the Data Management service - this command only works in Kusto.Explorer
   #connect "https://ingest-[YourClusterName].[region].kusto.windows.net"

   // Step #1 - retrieve a verification token (no records will be purged until step #2 is executed)
   .purge table [TableName] records in database [DatabaseName] <| [Predicate]

   // Step #2 - input the verification token to execute purge
   .purge table [TableName] records in database [DatabaseName] with (verificationtoken=h'<verification token from step #1>') <| [Predicate]

具体化されたビューを消去するには、table キーワードを materialized-view に置き換え、MaterializedViewNameTableName を置き換えます。

パラメーター 説明
DatabaseName データベースの名前
TableName / MaterializedViewName 消去するテーブル/具体化されたビューの名前。
Predicate 消去するレコードを識別します。 「述語の制限事項を消去する」を参照してください。
noregrets 設定すると、シングルステップのアクティブ化がトリガーされます。
verificationtoken 2 段階のアクティブ化シナリオ (noregrets が設定されていない) では、このトークンを使用して 2 番目のステップを実行し、アクションをコミットできます。 verificationtoken が指定されていない場合は、コマンドの最初のステップがトリガーされます。 消去に関する情報は、手順 2 を実行するためにコマンドに返されるトークンで返されます。

述語の制限事項を消去する

  • 述語はシンプルな選択である必要があります (例: [ColumnName] == 'X'where / [ColumnName] in ('X', 'Y', 'Z') と [OtherColumn] == 'A')。
  • 複数のフィルターは、個別の where 句ではなく、「and」と組み合わせる必要があります(たとえば、where [ColumnName] == 'X' | where [OtherColumn] == 'Y' ではなく where [ColumnName] == 'X' and OtherColumn] == 'Y')。
  • 述語は、消去されるテーブル (TableName) 以外のテーブルを参照できません。 述語には、選択ステートメント (where) のみを含めることができます。 テーブルから特定の列をプロジェクトすることはできません (「table |述語」を実行するときの出力スキーマはテーブル スキーマと一致する必要があります)。
  • システム関数 (ingestion_time()extent_id() など) はサポートされていません。

例: 2 段階の消去

2 段階のアクティブ化シナリオで消去を開始するには、次のコマンドの手順 1 を実行します。

   // Connect to the Data Management service
   #connect "https://ingest-[YourClusterName].[region].kusto.windows.net"

   .purge table MyTable records in database MyDatabase <| where CustomerId in ('X', 'Y')

   .purge materialized-view MyView records in database MyDatabase <| where CustomerId in ('X', 'Y')

出力

NumRecordsToPurge EstimatedPurgeExecutionTime VerificationToken
1,596 00:00:02 e43c7184ed22f4f23c7a9d7b124d196be2e570096987e5baadf65057fa65736b

次に、手順 2 を実行する前に NumRecordsToPurge を検証します。

2 段階のアクティブ化シナリオで消去を完了するには、手順 1 から返された検証トークンを使用して、手順 2 を実行します。

.purge table MyTable records in database MyDatabase
 with(verificationtoken=h'e43c7....')
<| where CustomerId in ('X', 'Y')

.purge materialized-view MyView records in database MyDatabase
 with(verificationtoken=h'e43c7....')
<| where CustomerId in ('X', 'Y')

出力

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
c9651d74-3b80-4183-90bb-bbe9e42eadc4 MyDatabase MyTable 2019-01-20 11:41:05.4391686 00:00:00.1406211 2019-01-20 11:41:05.4391686 スケジュール済み 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...

例: 単一ステップの消去

シングルステップのアクティブ化シナリオで消去をトリガーするには、次のコマンドを実行します。

// Connect to the Data Management service
 #connect "https://ingest-[YourClusterName].[region].kusto.windows.net"

.purge table MyTable records in database MyDatabase with (noregrets='true') <| where CustomerId in ('X', 'Y')

.purge materialized-view MyView records in database MyDatabase with (noregrets='true') <| where CustomerId in ('X', 'Y')

出力

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
c9651d74-3b80-4183-90bb-bbe9e42eadc4 MyDatabase MyTable 2019-01-20 11:41:05.4391686 00:00:00.1406211 2019-01-20 11:41:05.4391686 スケジュール済み 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...

消去操作の取り消しコマンド

必要に応じて、保留中の消去要求を取り消すことできます。

Note

この操作は、エラー復旧シナリオを対象にしています。 成功は保証されていないため、通常の運用フローに含めないでください。 これは、まだキュー内にあり、まだ実行のためにディスパッチされていない要求にのみ適用できます。

構文

 // Cancel of a single purge operation
 .cancel purge <OperationId>

  // Cancel of all pending purge requests in a database
 .cancel all purges in database <DatabaseName>

 // Cancel of all pending purge requests, for all databases
 .cancel all purges

例: 消去操作を 1 回取り消す

 .cancel purge aa894210-1c60-4657-9d21-adb2887993e1

出力

このコマンドの出力は、'show purges OperationId' コマンドの出力と同じであり、キャンセルされた消去操作の更新された状態を示します。 試行が成功すると、操作の状態が Canceled に更新されます。 それ以外の場合、操作の状態は変更されません。

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
c9651d74-3b80-4183-90bb-bbe9e42eadc4 MyDatabase MyTable 2019-01-20 11:41:05.4391686 00:00:00.1406211 2019-01-20 11:41:05.4391686 Canceled 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...

例: データベース内のすべての保留中の消去操作をキャンセルする

 .cancel all purges in database MyDatabase

出力

このコマンドの出力は、show purges コマンドの出力と同じで、データベース内のすべての操作とその更新された状態が表示されます。 正常に取り消された操作の状態は Canceled に更新されます。 それ以外の場合、操作の状態は変更されません。

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
5a34169e-8730-49f5-9694-7fde3a7a0139 MyDatabase MyTable 2021-03-03 05:07:29.7050198 00:00:00.2971331 2021-03-03 05:07:30.0021529 Canceled 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...
2fa7c04c-6364-4ce1-a5e5-1ab921f518f5 MyDatabase MyTable 2021-03-03 05:05:03.5035478 00:00:00.1406211 2021-03-03 05:05:03.6441689 InProgress 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...

消去操作の状態を追跡する

Note

消去操作は、データ管理エンドポイント https://ingest-[YourClusterName].[region].kusto.windows.net に対して実行される show purges コマンドで追跡できます。

Status = 'Completed' とは、消去操作の最初のフェーズが正常に完了し、レコードが論理的に削除され、クエリを実行できなくなった状態を示します。 ユーザーは、2 番目のフェーズ (物理的な削除) の完了を追跡して確認する必要があります。 このフェーズは、Azure Data Explorer により内部でモニターされます。

消去コマンドを表示する

Show purges コマンドは、要求された期間内に操作 ID を指定することで、消去操作の状態を表示します。

.show purges <OperationId>
.show purges [in database <DatabaseName>]
.show purges from '<StartDate>' [in database <DatabaseName>]
.show purges from '<StartDate>' to '<EndDate>' [in database <DatabaseName>]
Properties 説明 必須/省略可能
OperationId フェーズ 1 番目、または 2 番目の実行後に出力されるデータ管理操作 ID。 Mandatory
StartDate フィルター処理の制限時間を短くします。 省略した場合、既定値は現在の時刻の24時間前になります。 オプション
EndDate フィルター処理の上限時間を短くします。 省略した場合は、現在の時刻になります。 オプション
DatabaseName 結果をフィルター処理するデータベース名。 Optional

Note

状態は、クライアントがデータベース 管理アクセス許可を持つデータベースでのみ提供されます。

使用例

.show purges
.show purges c9651d74-3b80-4183-90bb-bbe9e42eadc4
.show purges from '2018-01-30 12:00'
.show purges from '2018-01-30 12:00' to '2018-02-25 12:00'
.show purges from '2018-01-30 12:00' to '2018-02-25 12:00' in database MyDatabase

出力

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
c9651d74-3b80-4183-90bb-bbe9e42eadc4 MyDatabase MyTable 2019-01-20 11:41:05.4391686 00:00:33.6782130 2019-01-20 11:42:34.6169153 a0825d4d-6b0f-47f3-a499-54ac5681ab78 完了 消去が正常に完了しました (削除保留中のストレージ成果物) 2019-01-20 11:41:34.6486506 00:00:04.4687310 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...
  • OperationId - 消去の実行時に返される DM 操作 ID。
  • DatabaseName** - データベース名 (大文字と小文字の区別)
  • TableName - テーブル名 (大文字と小文字の区別)
  • ScheduledTime - DM サービスに対して消去コマンドを実行した時刻。
  • Duration - 実行 DM キューの待機時間を含む、消去操作の合計時間。
  • EngineOperationId - エンジンで実行されている実際の消去操作 ID。
  •     State - 消去の状態、次のいずれかの値を指定できます。
    • Scheduled -消去操作の実行がスケジュールされています。 ジョブがスケジュールされたままの場合は、消去操作のバックログが存在する場合があります。 このバックログを消去するには、「消去のパフォーマンス 」を参照してください。 一時的なエラーが発生したときに消去操作が失敗した場合は、DM によって再試行され、スケジュールが再設定されます (したがって、スケジュールから処理済みからスケジュール済みに戻る操作の切り替えが発生する場合があります)。
    • InProgress - エンジンで消去操作が進行中です。
    •    Completed - 正常に完了しました。
    • BadInput -無効な入力の消去に失敗し、再試行されません。 このエラーは、述語の構文エラー、消去コマンドの無効な述語、制限を超えたクエリ (たとえば、externaldata 演算子内の 1 MB 以上のエンティティ、合計拡張クエリサイズが 64 MB を超えるなど)、および externaldata blob に対して 404 または 403 エラーが原因で問題が発生する場合があります。
    • Failed - 消去が失敗し、再試行されません。 このエラーは、他の消去操作のバックログ、または再試行の制限を超えるエラーが発生したため、操作がキューで長時間待機している (14 日を超えている) 場合に発生する場合があります。 後者の場合、内部監視アラートが生成され、Azure Data Explorer チームによって調査されます。
  • StateDetails - 状態の説明。
  • EngineStartTime - コマンドがエンジンに発行された時刻。 この時間と ScheduledTime の間に大きな差がある場合は、通常、消去操作の大きなバックログがあり、クラスターがそのペースに追いついていません。
  • EngineDuration - エンジンで実際に消去が実行された時間。 消去が数回再試行された場合、すべての実行期間の合計になります。
  • Retries - 一時的なエラーが原因で、DM サービスによって操作が再試行された回数。
  • ClientRequestId - DM 消去要求のクライアントアクティビティ ID。
  • Principal - 消去コマンドの発行者の ID。

テーブル全体を削除する

テーブルの消去には、テーブルのドロップと、消去プロセスで説明されている物理的な削除プロセスが実行されるように、テーブルを消去済みとしてマークすることが含まれます。 消去せずにテーブルをドロップしても、そのテーブルのすべてのストレージ成果物は削除されません。 これらの成果物は、テーブルに最初に設定された物理的なハード保持期間ポリシーに従って削除されます。 purge table allrecordsコマンドは短時間で効率的であり、シナリオに該当する場合、レコードの消去プロセスに適しています。

Note

コマンドは、データ管理エンドポイント https://ingest-[YourClusterName].[region].kusto.windows.net で、消去テーブル TableName レコード コマンドを実行することによって呼び出されます。

テーブル TableName allrecords コマンドを消去する

"Purge table records " コマンドと同様に、このコマンドはプログラムによって (シングルステップ)、または手動 (2 段階) モードで呼び出すことができます。

  1. プログラムによる起動 (シングルステップ):

    構文

    // Connect to the Data Management service
    #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net"
    
    .purge table [TableName] in database [DatabaseName] allrecords with (noregrets='true')
    
  2. ユーザーによる呼び出し (2 段階):

    構文

    
    // Connect to the Data Management service
    #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net"
    
    // Step #1 - retrieve a verification token (the table will not be purged until step #2 is executed)
    
    .purge table [TableName] in database [DatabaseName] allrecords
    
    // Step #2 - input the verification token to execute purge
    .purge table [TableName] in database [DatabaseName] allrecords with (verificationtoken=h'<verification token from step #1>')
    
    パラメーター 説明
    DatabaseName データベースの名前です。
    TableName テーブルの名前。
    noregrets 設定すると、シングルステップのアクティブ化がトリガーされます。
    verificationtoken 2 段階のアクティブ化シナリオ (noregrets が設定されていない) では、このトークンを使用して 2 番目のステップを実行し、アクションをコミットできます。 verificationtoken が指定されていない場合は、コマンドの最初のステップがトリガーされます。 このステップでは、コマンドに戻るためのトークンが返され、ステップ #2 が実行されます。

例: 2 段階の消去

  1. 2 段階のアクティブ化シナリオで消去を開始するには、次のコマンドの手順 1 を実行します。

    // Connect to the Data Management service
     #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net"
    
    .purge table MyTable in database MyDatabase allrecords
    

    出力

    VerificationToken
    e43c7184ed22f4f23c7a9d7b124d196be2e570096987e5baadf65057fa65736b
  2. 2 段階のアクティブ化シナリオで消去を完了するには、手順 1 から返された検証トークンを使用して、手順 2 を実行します。

    .purge table MyTable in database MyDatabase allrecords
    with (verificationtoken=h'eyJT.....')
    

    出力は '.show tables' コマンドの出力と同じです (削除されたテーブルが返されません)。

    出力

    TableName DatabaseName フォルダー DocString
    OtherTable MyDatabase --- ---

例: 単一ステップの消去

シングルステップのアクティブ化シナリオで消去をトリガーするには、次のコマンドを実行します。

// Connect to the Data Management service
#connect "https://ingest-[YourClusterName].[Region].kusto.windows.net"

.purge table MyTable in database MyDatabase allrecords with (noregrets='true')

出力は '.show tables' コマンドの出力と同じです (削除されたテーブルが返されません)。

出力

TableName DatabaseName フォルダー DocString
OtherTable MyDatabase --- ---