依照預設,Amazon CloudFront 標準日誌會擷取其中部分欄位的敏感資料。出於隱私考量,我想刪除日誌的這部分資料。
簡短說明
**注意:**本文將使用「用戶端-IP (c-ip)」欄位作為範例。
依預設,CloudFront 日誌會擷取 c-ip 當成其中一個欄位。有三種方法可以從日誌中刪除 c-ip。
- 觸發 AWS Lambda 函數,以便在傳送至 Amazon Simple Storage Service (Amazon S3) 的日誌上將欄位移除。
- 設置以特定間隔時間執行的 Amazon Elastic Compute Cloud (Amazon EC2) 程序以移除欄位。
- 使用 CloudFront 即時日誌,並在將日誌資料傳送到 Amazon S3 之前先移除敏感欄位。
解決方案
觸發 Lambda 函數
移除 c-ip 欄位的第一種方法是使用 Amazon S3 通知事件。當 CloudFront 將日誌檔傳送至 Amazon S3 儲存貯體時,請將儲存貯體設定為觸發 Lambda 函數。
建立 Lambda 函數
1. 開啟 AWS Lambda 主控台。
2. 在函數下,按照下列組態建立新的 Lambda 函數:
- 使用來自 Amazon S3 事件的物件名稱。
- 從 S3 儲存貯體取得該物件。
3. 移除 c-ip 欄,或是以匿名資料取代該值。
**附註:**如果日誌會由其他應用程式進一步處理,請取代這些值以保持相同的格式。
4. 儲存日誌並將其上傳回 Amazon S3。
建立新事件
1. 在日誌檔目標儲存貯體中,移至屬性。
2. 在事件通知下,建立新事件。
3. 選取 Put 事件類型,以及目的地 Lambda 函數。
4. 選取在步驟 1 中建立的 Lambda 函數,然後選擇儲存。
重要:若要避免 Lambda 函數產生遞迴叫用 (無限迴圈),請執行下列動作:
- 將您的 CloudFront 日誌傳遞到初始模擬前置詞。例如,「original (原始)」。
- 使 Amazon S3 事件只在該前置詞上觸發。
- 讓 Lambda 函數將日誌傳遞到不同的前置詞中。例如,「processed (已處理)」。
如果您將日誌傳送到相同的前置詞,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 生命週期轉換成本。如果您想要將日誌長期儲存,此程序會很有幫助。
使用 Kinesis Data Firehose
使用 CloudFront 即時日誌來選取您要儲存的欄位。然後,讓 Amazon Kinesis Data Firehose 將日誌資料傳送到 Amazon S3。
當您設定 CloudFront 即時記錄時,可以使用每個即時日誌記錄包含的欄位清單。每個日誌記錄最多包含 40 個欄位。您可以選擇接收所有可用欄位,或是僅接收必須監視和分析效能的欄位。停用欄位 c-ip 以將該欄位從日誌檔中排除。
**注意:**由於會用到 Amazon Kinesis Data Streams,此選項可能會較為昂貴。您可考慮其他兩個選項 (觸發 Lambda 函數或使用 Amazon EC2 流程),以採用實惠的解決方案。