根據預設,Amazon CloudFront 標準日誌會擷取部分欄位的敏感資料。基於隱私考量,我想移除這部分的日誌。
簡短說明
**注意:**本文以 Client-IP (c-ip) 欄位為例。
CloudFront 日誌預設會擷取 c-ip 為欄位之一。有三種方法可以從您的日誌中移除 c-ip。
- 在日誌傳遞至 Amazon Simple Storage Service (Amazon S3) 時,觸發 AWS Lambda 函式來移除欄位。
- 讓 Amazon Elastic Compute Cloud (Amazon EC2) 程序定期執行以移除欄位。
- 使用 CloudFront 標準日誌,並在將日誌資料傳送到 Amazon S3 之前移除敏感欄位。
**注意:**若要啟用標準日誌,您必須使用專業方案或按使用量付費方案。如需更多資訊,請參閱 Amazon CloudFront pricing (Amazon CloudFront 定價)。
解決方法
觸發 Lambda 函式
移除 c-ip 欄位的方法之一是使用 Amazon S3 事件通知。當 CloudFront 將日誌檔案傳遞到 Amazon S3 儲存貯體時,設定您的儲存貯體以觸發 Lambda 函式。
建立 Lambda 函式
1. 開啟 AWS Lambda 主控台。
2. 在 Functions (函式) 下,建立具有下列組態的新 Lambda 函式:
- 使用來自 Amazon S3 事件的物件名稱。
- 從 S3 儲存貯體取得物件。
3. 移除 c-ip 欄位,或將值替換為匿名資料。
**注意:**替換這些值可保持相同的格式,以防有其他應用程式需要進一步處理日誌。
4. 儲存並將日誌重新上傳回 Amazon S3。
建立新事件
1. 在日誌目標儲存貯體中,前往 Properties (屬性)。
2. 在 Event notifications (事件通知) 下建立新事件。
3. 選取事件類型 Put,以及目的地 Lambda function (Lambda 函式)。
4. 選取在步驟 1 中建立的 Lambda 函式,然後選擇 Save (儲存)。
重要事項: 為避免 Lambda 函式發生重複調用 (無限循環),請執行下列動作:
- 讓您的 CloudFront 日誌傳遞到初始的暫存前置詞,例如 "original"。
- 僅針對該前置詞觸發 Amazon S3 事件。
- 讓 Lambda 函式將日誌傳遞到不同的前置詞,例如 "processed"。
如果您將日誌傳遞到相同的前置詞,Lambda 函式會再次觸發並建立重複調用。如需更多資訊,請參閱 Avoiding recursive invocation with Amazon S3 and AWS Lambda (避免使用 Amazon S3 和 AWS Lambda 進行重複調用)。
**注意:**為降低 Amazon S3 成本,請設定 Amazon S3 生命週期政策,以在特定期限後將原始日誌刪除。
使用 Amazon EC2 程序
使用 Amazon EventBridge 建立排程規則 (cron),以依排程的週期啟動 EC2 執行個體並處理日誌檔案,例如每天一次。程序執行完成後,停止 EC2 執行個體直到下一次循環,以節省成本。
1. 設定 EventBridge 和 Lambda 以在指定時間啟動 EC2 執行個體。如需更多資訊,請參閱如何使用 Lambda 來定期停止和啟動 Amazon EC2 執行個體?
2. 在 EC2 執行個體上,部署一段用於下載特定期間日誌的程式碼,例如一整天。移除 c-ip 欄位以處理日誌,或將該欄位的值替換為匿名資料。將處理後的日誌重新上傳回 S3 儲存貯體。
**選用:**將所有處理後的日誌合併為單一檔案,以節省 Amazon S3 Lifecycle 轉換成本。如果打算長期儲存日誌,此程序會很有幫助。
使用 Kinesis Data Firehose
使用 CloudFront 即時日誌來選取您想要儲存的欄位。隨後,讓 Amazon Kinesis Data Firehose 將日誌資料傳送到 Amazon S3。
當您設定 CloudFront 即時日誌時,系統會提供一份包含在每筆即時日誌記錄中的欄位清單。每筆日誌記錄最多包含 40 個欄位。您可以選擇接收所有可用的欄位,或僅接收您必須用來監控與分析效能的欄位。停用 c-ip 欄位以從日誌中排除該欄位。
注意:由於使用了 Amazon Kinesis Data Streams,此選項的成本可能會變得很高。建議使用其他兩個選項 (觸發 Lambda 函式或使用 Amazon EC2 程序) 以獲得更具成本效益的解決方案。