使用 Terraform 在企業規模上設定集中式記錄 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Terraform 在企業規模上設定集中式記錄

由 Aarti Rajput (AWS)、Yashwant Patel (AWS) 和 Nishtha Yadav (AWS) 建立

Summary

集中式記錄對於組織的雲端基礎設施至關重要,因為它提供對其操作、安全性和合規性的可見性。隨著您的組織將其 AWS 環境擴展到多個帳戶,結構化日誌管理策略成為執行安全操作、滿足稽核要求和實現卓越營運的基礎。

此模式提供可擴展且安全的架構,用於集中來自多個 AWS 帳戶 和 服務的日誌,以跨複雜 AWS 部署啟用企業規模的記錄管理。該解決方案使用 Terraform 自動化,Terraform 是一種來自 HashiCorp 的基礎設施即程式碼 (IaC) 工具,可確保一致且可重複的部署,並將手動組態降至最低。透過結合 Amazon CloudWatch Logs、Amazon Data Firehose 和 Amazon Simple Storage Service (Amazon S3),您可以實作強大的日誌彙總和分析管道,提供:

  • 中整個組織的集中式日誌管理 AWS Organizations

  • 使用內建安全控制自動收集日誌

  • 可擴展的日誌處理和耐用的儲存

  • 簡化的合規報告和稽核追蹤

  • 即時營運洞察和監控

解決方案會透過 CloudWatch Logs 從 Amazon Elastic Kubernetes Service (Amazon EKS) 容器、 AWS Lambda 函數和 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體收集日誌。它會使用 CloudWatch 訂閱篩選條件,將這些日誌自動轉送至專用記錄帳戶。Firehose 會管理 Amazon S3 的高輸送量日誌串流管道,以進行長期儲存。Amazon Simple Queue Service (Amazon SQS) 設定為在物件建立時接收 Amazon S3 事件通知。這可讓 與 分析服務整合,包括:

  • Amazon OpenSearch Service 用於日誌搜尋、視覺化和即時分析

  • 適用於 SQL 型查詢的 Amazon Athena

  • 適用於大規模處理的 Amazon EMR

  • 用於自訂轉換的 Lambda

  • Amazon QuickSight for 儀表板

所有資料都是使用 AWS Key Management Service (AWS KMS) 加密,而整個基礎設施則是使用 Terraform 跨環境進行一致組態來部署。

這種集中式記錄方法可讓組織改善其安全狀態、維持合規要求,以及最佳化 AWS 基礎設施的操作效率。

先決條件和限制

先決條件

如需設定 AWS Control Tower、AFT 和應用程式帳戶的指示,請參閱 Epics 一節

必要帳戶

您在 中的組織 AWS Organizations 應該包含這些帳戶:

  • 應用程式帳戶 – 一或多個來源帳戶,其中 AWS 服務 (Amazon EKS、Lambda 和 Amazon RDS) 執行和產生日誌

  • Log Archive 帳戶 – 用於集中式日誌儲存和管理的專用帳戶

產品版本

架構

下圖說明一個 AWS 集中式日誌架構,提供可擴展的解決方案,用於收集、處理多個應用程式帳戶的日誌,並將其儲存到專用的日誌封存帳戶。此架構可有效率地處理來自 的日誌 AWS 服務,包括 Amazon RDS、Amazon EKS 和 Lambda,並透過簡化程序將它們路由到 Log Archive 帳戶中的區域 S3 儲存貯體。

AWS 集中式記錄架構,用於從多個應用程式帳戶收集日誌。

工作流程包含五個程序:

  1. 日誌流程程序

    • 日誌流程會在應用程式帳戶中開始,其中 AWS 服務 會產生各種類型的日誌,例如一般、錯誤、稽核、來自 Amazon RDS 的慢查詢日誌、來自 Amazon EKS 的控制平面日誌,以及來自 Lambda 的函數執行和錯誤日誌。

    • CloudWatch 做為初始收集點。它會在每個應用程式帳戶中的日誌群組層級收集這些日誌。

    • 在 CloudWatch 中,訂閱篩選條件會決定哪些日誌應轉送至中央帳戶。這些篩選條件可讓您精細控制日誌轉送,因此您可以指定確切的日誌模式或完整的日誌串流以進行集中化。

  2. 跨帳戶日誌傳輸

    • 日誌會移至 Log Archive 帳戶。CloudWatch 訂閱篩選條件有助於跨帳戶轉移並保留區域內容。

    • 架構會建立多個平行串流,以有效率地處理不同的日誌來源,以確保最佳效能和可擴展性。

  3. Log Archive 帳戶中的日誌處理

    • 在 Log Archive 帳戶中,Firehose 會處理傳入的日誌串流。

    • 每個區域都會維護專用的 Firehose 交付串流,可視需要轉換、轉換或擴充日誌。

    • 這些 Firehose 串流會將處理過的日誌交付至 Log Archive 帳戶中的 S3 儲存貯體,該帳戶與來源應用程式帳戶 (圖表中的區域 A) 位於相同的區域,以維護資料主權需求。

  4. 通知和其他工作流程

    • 當日誌到達其目的地 S3 儲存貯體時,架構會使用 Amazon SQS 實作通知系統。

    • 區域 SQS 佇列可啟用非同步處理,並根據儲存的日誌觸發其他工作流程、分析或提醒系統。

  5. AWS KMS 確保安全

    架構包含 AWS KMS 用於 security. AWS KMS provides 加密金鑰的 S3 儲存貯體。這可確保所有儲存的日誌保持靜態加密,同時保持區域加密以滿足資料駐留要求。

工具

AWS 服務

  • Amazon CloudWatch 是一種監控和可觀測性服務,以日誌、指標和事件的形式收集監控和操作資料。它提供在 AWS 和內部部署伺服器上執行 AWS 的資源、應用程式和服務統一檢視。

  • CloudWatch Logs 訂閱篩選條件是符合傳入日誌事件中模式的表達式,並將相符的日誌事件交付給指定的 AWS 資源,以進行進一步的處理或分析。

  • AWS Control Tower Account Factory for Terraform (AFT) 會設定 Terraform 管道,協助您在其中佈建和自訂帳戶 AWS Control Tower。AFT 提供以 Terraform 為基礎的帳戶佈建,同時允許您使用 管理帳戶 AWS Control Tower。

  • Amazon Data Firehose 會將即時串流資料交付至目的地,例如 Amazon S3、Amazon Redshift 和 Amazon OpenSearch Service。它會自動擴展以符合資料的輸送量,而且不需要持續管理。

  • Amazon Elastic Kubernetes Service (Amazon EKS) 是一種受管容器協同運作服務,可讓您使用 Kubernetes 輕鬆部署、管理和擴展容器化應用程式。它會自動管理 Kubernetes 控制平面節點的可用性和可擴展性。

  • AWS Key Management Service (AWS KMS) 會建立和控制加密資料的加密金鑰。 與其他 AWS KMS 整合 AWS 服務 ,以協助您保護使用這些服務存放的資料。

  • AWS Lambda 是一種無伺服器運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。它會自動透過執行程式碼來回應每個觸發條件來擴展您的應用程式,並且只會針對您使用的運算時間收費。

  • Amazon Relational Database Service (Amazon RDS) 是一種受管關聯式資料庫服務,可讓您輕鬆地在雲端中設定、操作和擴展關聯式資料庫。它提供經濟實惠且可擴展的容量,同時自動化耗時的管理任務。

  • Amazon Simple Queue Service (Amazon SQS) 是一種訊息佇列服務,可讓您解耦和擴展微服務、分散式系統和無伺服器應用程式。它消除了管理和操作訊息導向中介軟體的複雜性。

  • Amazon Simple Storage Service (Amazon S3) 是一種雲端型物件儲存服務,可提供可擴展性、資料可用性、安全性和效能。它可以從 Web 上的任何位置存放和擷取任意數量的資料。

其他工具

  • Terraform 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具,可協助您建立和管理雲端和內部部署資源。

Code

此模式的程式碼可在 GitHub 集中式日誌儲存庫中使用。

最佳實務

史詩

任務描述所需的技能

使用 AFT 設定 AWS Control Tower 環境。

  1. 請依照AWS Control Tower 文件中的指示 AWS Control Tower 進行部署。

  2. 遵循 AWS Control Tower 文件中的指示部署 AFT。

AWS 管理員

為組織啟用資源共用。

  1. Configure AWS Command Line Interface (AWS CLI) 具有管理帳戶登入資料,可提供管理許可。 AWS Control Tower

  2. 在任何 中執行下列 AWS CLI 命令 AWS 區域:

    aws ram enable-sharing-with-aws-organization

    這可讓您在 中 AWS Organizations 跨所有支援 AWS Resource Access Manager () 的區域進行組織內的資源共用AWS RAM。

AWS 管理員

驗證或佈建應用程式帳戶。

若要為您的使用案例佈建新的應用程式帳戶,請透過 AFT 建立它們。如需詳細資訊,請參閱 AWS Control Tower 文件中的使用 AFT 佈建新帳戶

AWS 管理員
任務描述所需的技能

Application_account資料夾內容複製到aft-account-customizations儲存庫。

  1. aft-account-customizations儲存庫的根路徑Application_account中建立名為 的資料夾。當您設定 AFT 時,會自動建立此儲存庫 (請參閱上一個範例)。

  2. 導覽至 centralised-logging-at-enterprise-scale-using-terraform 儲存庫的根目錄,複製aft/account目錄的內容,然後將其貼到您在aft-account-customizations儲存庫的步驟 1 中建立的Application_account目錄中。

  3. centralised-logging-at-enterprise-scale-using-terraform儲存庫的根目錄中,將Application_account目錄的內容複製到aft-account-customizations儲存庫中的 Application_account/terraform 目錄。

  4. aft-account-customizations/Application_account/terraform.tfvars 檔案中,確認所有參數都會在對應的 Terraform 組態檔案中做為引數傳遞。

DevOps 工程師

檢閱和編輯用於設定應用程式帳戶的輸入參數。

在此步驟中,您會設定組態檔案以在應用程式帳戶中建立資源,包括 CloudWatch 日誌群組、CloudWatch 訂閱篩選條件、IAM 角色和政策,以及 Amazon RDS、Amazon EKS 和 Lambda 函數的組態詳細資訊。

在儲存aft-account-customizations庫的 Application_account 資料夾中,根據您的組織需求,設定 terraform.tfvars 檔案中的輸入參數:

  • environment:將部署資源的環境名稱 (例如 proddevstaging)。

  • account_name:要建立資源的 AWS 帳戶 名稱。

  • log_archive_account_id:將封存日誌的 AWS 帳戶 ID。

  • admin_role_name:將用於管理資源的管理角色名稱。

  • tags:代表要套用至所有資源之常見標籤的鍵/值對映射。

  • rds_config:包含 Amazon RDS 執行個體組態詳細資訊的物件。

  • allowed_cidr_blocks:允許存取資源的 CIDR 區塊清單。

  • destination_name: 用來建立 CloudWatch 目的地 Amazon Resource Name (ARN) 的變數,其中將串流日誌。

  • rds_parameters: 包含 Amazon RDS 參數群組設定的物件。

  • vpc_config:包含 VPC 組態詳細資訊的物件。

  • eks_config:包含 Amazon EKS 叢集組態詳細資訊的物件。

  • lambda_config:包含 Lambda 函數組態詳細資訊的物件。

  • restrictive_cidr_range:安全群組規則的限制 CIDR 範圍清單。

  • target_account_id:將部署資源的目標 Log Archive 帳戶 AWS 帳戶 ID。

DevOps 工程師
任務描述所需的技能

Log_archive_account資料夾內容複製到 aft-account-customizations 儲存庫。

  1. aft-account-customizations儲存庫的根路徑Log_archive_account中建立名為 的資料夾。當您設定 AFT 時,會自動建立此儲存庫。

  2. 導覽至centralised-logging-at-enterprise-scale-using-terraform儲存庫的根目錄,複製aft/account目錄的內容,然後將它們貼到您在aft-account-customizations儲存庫中上一個步驟建立的Log_archive_account目錄中。

  3. centralised-logging-at-enterprise-scale-using-terraform儲存庫的根目錄中,將Log_archive_account目錄的內容複製到aft-account-customizations儲存庫中的 Log_archive_account/terraform 目錄。

  4. aft-account-customizations/Log_archive_account/terraform.tfvars 檔案中,確認所有參數都會做為對應 Terraform 組態檔案中的引數傳遞。

DevOps 工程師

檢閱和編輯用於設定 Log Archive 帳戶的輸入參數。

在此步驟中,您會設定組態檔案以在 Log Archive 帳戶中建立資源,包括 Firehose 交付串流、S3 儲存貯體、SQS 佇列,以及 IAM 角色和政策。

aft-account-customizations儲存庫的 Log_archive_account資料夾中,根據您的組織需求設定 terraform.tfvars 檔案中的輸入參數:

  • environment:將部署資源的環境名稱 (例如 proddevstaging)。

  • destination_name:用來建立 CloudWatch 目的地 ARN 的變數,其中將串流日誌。

  • source_account_ids:允許在日誌目的地放置訂閱篩選條件的 AWS 帳戶 IDs 清單。您可以輸入任意數量的帳戶 IDs,以啟用集中式記錄。

DevOps 工程師
任務描述所需的技能

選項 1 - 從 AFT 部署 Terraform 組態檔案。

在 AFT 中,當您將具有組態變更的程式碼推送至 GitHub aft-account-customizations儲存庫後,即會觸發 AFT 管道。AFT 會自動偵測變更並啟動帳戶自訂程序。

對 Terraform (terraform.tfvars) 檔案進行變更後,請遞交變更並推送至儲存aft-account-customizations庫:

$ git add * $ git commit -m "update message" $ git push origin main
注意

如果您使用的是不同的分支 (例如 dev),請將 取代main為您的分支名稱。

DevOps 工程師

選項 2 - 手動部署 Terraform 組態檔案。

如果您未使用 AFT 或想要手動部署解決方案,您可以從 Application_accountLog_archive_account 資料夾使用以下 Terraform 命令:

  1. 複製 GitHub 儲存庫並設定 terraform.tfvars 檔案中的輸入參數。

  2. 執行以下命令:

    $ terraform init
  3. 預覽變更:

    $ terraform plan

    此命令會評估 Terraform 組態,以判斷資源的所需狀態,並將其與基礎設施的目前狀態進行比較。

  4. 套用變更:

    $ terraform apply
  5. 檢閱計劃的變更,並在提示中輸入 yes 以繼續應用程式。

DevOps 工程師
任務描述所需的技能

驗證訂閱篩選條件。

若要驗證訂閱篩選條件是否正確地將日誌從應用程式帳戶日誌群組轉送至日誌封存帳戶:

  1. 在應用程式帳戶中,開啟 CloudWatch 主控台

  2. 在左側導覽窗格中,選擇 Log groups (日誌群組)。

  3. 選取每個日誌群組 (/aws/rds/aws/eks/aws/lambda),然後選擇訂閱篩選條件索引標籤。

    根據您在 Terraform 組態檔案中指定的名稱,您應該會看到指向目的地 ARN 的作用中訂閱篩選條件。

  4. 選擇任何訂閱篩選條件來驗證其組態和狀態。

DevOps 工程師

驗證 Firehose 串流。

若要驗證日誌封存帳戶處理應用程式日誌中的 Firehose 串流是否成功:

  1. 在 Log Archive 帳戶中,開啟 Firehose 主控台

  2. 在左側導覽窗格中,選擇 Firehose 串流

  3. 選擇任何 Firehose 串流並驗證下列項目:

    • 目的地會顯示正確的 S3 儲存貯體。

    • 監控索引標籤會顯示成功的交付指標。

    • 最近的交付時間戳記是最新的。

DevOps 工程師

驗證集中式 S3 儲存貯體。

若要驗證集中式 S3 儲存貯體是否正確接收和組織日誌:

  1. 在 Log Archive 帳戶中,開啟 Amazon S3 主控台

  2. 選取每個中央記錄儲存貯體。

  3. 瀏覽資料夾結構:AWSLogs/AccountID/Region/Service

    您應該會看到依時間戳記 (YYYY/MM/DD/HH) 整理的日誌檔案。

  4. 選擇任何最近的日誌檔案,並驗證其格式和資料完整性。

DevOps 工程師

驗證 SQS 佇列。

若要驗證 SQS 佇列是否收到新日誌檔案的通知:

  1. 在 Log Archive 帳戶中,開啟 Amazon SQS 主控台

  2. 在左側導覽窗格中,選擇 Queues (佇列)

  3. 選取每個設定的佇列,然後選擇傳送和接收訊息

    您應該會看到包含新日誌檔案 S3 事件通知的訊息。

  4. 選擇任何訊息,以確認其中包含正確的 S3 物件資訊。

DevOps 工程師
任務描述所需的技能

選項 1 - 從 AFT 停用 Terraform 組態檔案。

當您移除 Terraform 組態檔案並推送變更時,AFT 會自動啟動資源移除程序。

  1. 導覽至aft-account-customizations儲存庫。

  2. 前往 terraform 目錄。

  3. 刪除下列檔案:

    • modules 目錄

    • iam.tf

    • versions.tf

    • variables.tf

    • outputs.tf

    • terraform.tfvars

  4. 清除main.tf檔案的內容。

  5. 將您的變更推送至儲存庫:

    # Stage all changes $ git add * # Commit cleanup changes $ git commit -m "Remove AFT customizations" # Push to repository $ git push origin main
    注意

    如果您使用的是不同的分支 (例如 dev),請將 取代main為您的分支名稱。

DevOps 工程師

選項 2 – 手動清除 Terraform 資源。

如果您未使用 AFT 或想要手動清除資源,請使用 Application_accountLog_archive_account 資料夾的下列 Terraform 命令:

  1. 初始化 Terraform 組態:

    $ terraform init

    此命令會初始化 Terraform,並確保存取目前狀態。

  2. 預覽清除變更:

    $ terraform destroy

    此命令會評估要銷毀哪些資源,並將所需的狀態與基礎設施的目前狀態進行比較。

  3. 執行清除。出現提示時,請輸入 yes 以確認並執行銷毀計畫。

DevOps 工程師

故障診斷

問題解決方案

CloudWatch Logs 目的地未建立或處於非作用中狀態。

驗證下列項目:

  1. 在 Log Archive 帳戶中,確認目的地政策包含:

    • 正確的來源帳戶主體。

    • 正確的動作 (logs:PutSubscriptionFilter)。

    • 有效的目的地 ARN。

  2. 確認 Firehose 串流存在且處於作用中狀態。

  3. 確認連接至目的地的 IAM 角色具有 Firehose 的許可。

訂閱篩選條件失敗或停滯在待定狀態。

請檢查以下內容:

  1. 在應用程式帳戶中,確認 IAM 角色具有:

    • 呼叫 的許可PutSubscriptionFilter

    • 與 CloudWatch Logs 的信任關係。

  2. 確認目的地 ARN 正確。

  3. 檢查 CloudWatch Logs 是否有特定錯誤訊息。

Firehose 交付串流不會顯示傳入記錄。

請確認下列內容:

  1. 確認 Firehose IAM 角色具有:

    • 寫入 Amazon S3 的許可。

    • 如果啟用加密,則存取 AWS KMS 金鑰。

  2. 檢閱 CloudWatch 指標:

    • IncomingRecords

    • DeliveryToS3.Records

  3. 驗證緩衝區設定和交付組態。

相關資源