Alibaba Cloud Simple Log Service (SLS) は論理削除をサポートしています。この機能を使用すると、ログデータを完全に削除するのではなく、削除済みとしてマークできます。このトピックでは、論理削除を実行する方法について説明します。
Simple Log Service の論理削除機能はグレースケールリリース中であり、特定のリージョンの特定のユーザーが利用できます。この機能を有効にするには、してください。
背景情報
データ駆動型の環境では、ログと観測可能なデータは重要なビジネス資産です。しかし、これらはデータ管理、コンプライアンス、セキュリティの面で課題ももたらします。これらの問題に対処するため、Alibaba Cloud Simple Log Service (SLS) は論理削除機能を提供しています。この機能は、追跡可能な削除メカニズムを提供し、データセキュリティとコンプライアンスシステムのセーフティネットとして機能します。
仕組み (クリックして表示)
シナリオ (クリックして表示)
注意事項
ストレージコストに関する考慮事項: 論理削除されたデータは、保持期間中もストレージスペースを占有し、料金が発生します。データは、保持期間が終了するまで物理的に削除されません。
クエリ文の正確性: 削除する前にクエリを実行してください。削除を実行する前に、まったく同じクエリ時間と検索文を使用してクエリを実行します。削除されるデータをプレビューして、データが正しいことを確認してから削除を進めてください。
論理削除されたログはクエリまたは分析できません。これには、クエリ、SQL 分析、ScheduledSQL、およびアラートが含まれます。ストリーム処理操作は影響を受けません。これには、消費、データ変換、および配信が含まれます。
論理削除は元に戻せません。削除されたログは回復できません。
サポートされるリージョン
論理削除は現在、シンガポールおよび中国 (ウランチャブ) でサポートされています。プロジェクトの概要ページで、プロジェクトが配置されているリージョンのエンドポイントを表示できます。リージョン ID の詳細については、「エンドポイント」をご参照ください。
権限
Alibaba Cloud アカウントでログインすると、デフォルトですべての操作権限があり、プロジェクトで直接操作を実行できます。
Resource Access Management (RAM) ユーザーでログインする場合は、Alibaba Cloud アカウントのオーナーに必要な権限を要求する必要があります。Simple Log Service は、次のシステムポリシーを提供します。
システムポリシー: これらのポリシーは広範な権限を付与します。ユーザーはシステムポリシーの内容を変更できませんが、構成手順は簡単です。
AliyunLogFullAccess: Simple Log Service に対する完全な管理権限を付与します。
AliyunLogReadOnlyAccess: Simple Log Service に対する読み取り専用権限を付与します。
カスタムポリシー: 最小権限の原則に従ってください。信頼できる担当者または自動化されたサービスにのみ、必要最小限の権限を付与してください。
次のコードは、カスタムポリシーのサンプルを提供します。
ポリシー内の
ProjectNameとLogStoreNameを、実際のプロジェクト名と Logstore 名に置き換えてください。RAM ユーザーの権限を構成する方法の詳細については、「Simple Log Service の RAM 権限を構成する」および「承認情報」をご参照ください。
{ "Version": "1", "Statement": [ { "Action": [ "log:DeleteLogStoreLogs", "log:GetDeleteLogStoreLogsTask", "log:ListDeleteLogStoreLogsTasks", ], "Resource": [ "acs:log:*:*:project/ProjectName/logstore/LogStoreName" ] "Effect": "Allow" } ] }
コンソール操作
Simple Log Service コンソールにログインします。[プロジェクト] セクションで、目的のプロジェクトをクリックします。
タブで、目的の Logstore をクリックします。
Logstore の [クエリと分析] ページで、検索文を入力し、時間範囲を指定します。[Raw ログ] タブで、 をクリックします。

[ログの論理削除] ダイアログボックスで、情報を注意深く読み、[確認] をクリックします。削除が完了すると、ログは表示されなくなります。
削除が完了したら、[Raw ログ] タブで、 をクリックします。[論理削除タスク] リストで、削除タスクの履歴を表示できます。
SDK 操作
Python
pip show aliyun-log-python-sdkを実行して、aliyun-log-python-sdkのバージョンを確認します。aliyun-log-python-sdkのバージョンは 0.9.28 以降である必要があります。バージョンが古い場合は、pip install -U aliyun-log-python-sdkを実行して SDK をアップグレードします。論理削除タスクを送信します。
次の表に、
DeleteLogsRequestのパラメーターを示します。パラメーター
例
# 必要なライブラリをインポート import time from aliyun.log import LogClient, DeleteLogsRequest, DeleteLogsResponse def execute_soft_delete(client: LogClient, project: str, logstore: str, from_time: int, to_time: int, query: str) -> str: """ 非同期の論理削除タスクを実行します。 :param client: 初期化された SLS クライアントインスタンス。 :param project: SLS プロジェクト名。 :param logstore: Logstore 名。 :param from_time: 削除範囲の開始タイムスタンプ (秒単位)。 :param to_time: 削除範囲の終了タイムスタンプ (秒単位)。 :param query: 削除対象のログをフィルタリングするために使用されるインデックスのみの検索文 (SQL、スキャン、およびフレーズクエリはサポートされていません)。 :return: 後でタスクのステータスをクエリするために使用される非同期削除タスクのタスク ID。 """ print(f"プロジェクト '{project}' の Logstore '{logstore}' で論理削除を実行する準備をしています...") print(f"時間範囲: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(from_time))} -> {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(to_time))}") print(f"削除条件 (クエリ): {query}") # 1. 削除リクエストオブジェクトを構築します request = DeleteLogsRequest(project, logstore, from_time, to_time, query=query) # 2. 非同期削除リクエストを開始します try: res: DeleteLogsResponse = client.delete_logs(request) # 3. リクエスト情報と返されたタスク ID を出力します print("\n--- リクエスト受領書 ---") res.log_print() task_id = res.get_taskid() print(f"✅ 論理削除タスクが正常に送信されました! リクエスト ID: {res.get_request_id()}, タスク ID: {task_id}") return task_id except Exception as e: print(f"❌ 論理削除タスクの送信に失敗しました: {e}") return "" # --- 呼び出し方法 --- # client = LogClient(...) # クライアントの初期化プロセスはここでは省略します # project_name = "my-prod-app" # logstore_name = "nginx-access-log" # # シナリオ: 特定の IP アドレスから過去 24 時間のステータスコード 500 のアクセスログを削除します # start_time = int(time.time()) - 86400 # end_time = int(time.time()) # delete_query = "__source__: 123.123.XXX.XXX and status: 500" # task_id = execute_soft_delete(client, project_name, logstore_name, start_time, end_time, delete_query) # if task_id: # print(f"\nタスク ID '{task_id}' を使用してタスクの実行ステータスをクエリしてください。")project
String(必須)プロジェクトの名前。Simple Log Service のプロジェクトは、異なるユーザーのリソースを分離し、特定のリソースへのアクセスを制御するために使用されます。詳細については、「プロジェクトの管理」をご参照ください。
logstore
String(必須)Logstore の名前。Simple Log Service の Logstore は、ログの収集、保存、クエリに使用されます。詳細については、「Logstore の管理」をご参照ください。
fromTime
int(必須)クエリする時間範囲の開始時刻。UNIX タイムスタンプとして時間を指定します。
toTime
int(必須)クエリする時間範囲の終了時刻。UNIX タイムスタンプとして時間を指定します。
query
String(必須)検索文または分析文。詳細については、「クエリと分析の概要」をご参照ください。
クエリを
"*"または"level: ERROR"に設定する場合は注意してください。これにより、大量のデータが予期せず削除される可能性があります。タスクステータスをポーリングします。
このコードブロックは、タスクが完了するかタイムアウトするまで、タスクの進行状況を継続的にチェックします。これは、削除操作が正常に実行されたことを確認するための重要なステップです。
delete_logsは非同期 API です。呼び出しが成功したことは、タスクが受け入れられたことのみを示します。返されたtask_idを使用して、タスクの最終ステータスをポーリングする必要があります。from aliyun.log import GetDeleteLogsStatusRequest, GetDeleteLogsStatusResponse def wait_for_task_completion(client: LogClient, project: str, logstore: str, task_id: str, timeout_seconds: int = 300): """ポーリングによって論理削除タスクが完了するのを待ちます。""" start_time = time.time() while time.time() - start_time < timeout_seconds: request = GetDeleteLogsStatusRequest(project, logstore, task_id) try: res: GetDeleteLogsStatusResponse = client.get_delete_logs_status(request) progress = res.get_process() print(f"タスク '{task_id}' のステータスをクエリしています... 進行状況: {progress:.2f}%") if progress >= 100.0: print("✅ タスクが完了しました!") return True time.sleep(2) # ポーリングが頻繁になりすぎないようにします except Exception as e: print(f"❌ タスクステータスのクエリに失敗しました: {e}") return False print(f"⌛️ タスクがタイムアウトしました ({timeout_seconds} 秒を超えました)。後で再試行するか、タスクのステータスを確認してください。") return False # --- 呼び出し方法 --- # task_id = execute_soft_delete(...) # if task_id: # wait_for_task_completion(client, project_name, logstore_name, task_id)削除タスクの監査と管理 (履歴タスクの表示)。
この機能は、すべての削除操作の完全な履歴を提供するため、セキュリティ監査と運用管理にとって重要です。
from aliyun.log import ListDeleteLogsTasksRequest def list_all_delete_tasks(client: LogClient, project: str, logstore: str): """指定された Logstore のすべての論理削除タスクの履歴を一覧表示します。""" print(f"\nプロジェクト '{project}' の Logstore '{logstore}' の論理削除タスクの履歴を一覧表示しています...") request = ListDeleteLogsTasksRequest(project=project, logstore=logstore) try: res = client.list_delete_logs_tasks(request) print("✅ タスクリストが正常に取得されました!") res.log_print() # log_print() は、すべてのタスクの詳細を読みやすい形式で出力します except Exception as e: print(f"❌ タスクリストの取得に失敗しました: {e}")
> [ログの論理削除]