使用引導管道實作 Account Factory for Terraform (AFT) - AWS 方案指引

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

使用引導管道實作 Account Factory for Terraform (AFT)

由 Vinicius Elias (AWS) 和 Edgar Costa Filho (AWS) 建立

程式碼儲存庫: aft-bootstrap-pipeline

環境:生產

技術:管理與治理;基礎設施

工作負載:開放原始碼

AWS 服務:AWS CodeBuild;AWS CodeCommit;AWS CodePipeline;AWSControl Tower; AWS Organizations

Summary

此模式提供從 管理帳戶部署 AWS Control Tower Account Factory for Terraform (AFT) 的簡單且安全方法 AWS Organizations。解決方案的核心是 AWS CloudFormation 範本,透過建立 Terraform 管道來自動化AFT組態,其結構結構可輕鬆適應初始部署或後續更新。

安全性和資料完整性是 的首要任務 AWS,因此 Terraform 狀態檔案是追蹤受管基礎設施和組態狀態的關鍵元件,可安全地存放在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中。此儲存貯體設定了數種安全措施,包括伺服器端加密和封鎖公開存取的政策,以協助確保您的 Terraform 狀態不受未經授權的存取和資料外洩。

管理帳戶會協調和監督整個環境,因此它是 中的重要資源 AWS Control Tower。此模式遵循 AWS 最佳實務,並確保部署程序不僅有效率,而且還符合安全和治理標準,以提供全方位、安全且有效率的方式AFT,以便在您的 AWS 環境中部署。

如需 的詳細資訊AFT,請參閱 AWS Control Tower 文件

先決條件和限制

先決條件

  • 基本 AWS 多帳戶環境,至少具有下列帳戶:管理帳戶、Log Archive 帳戶、稽核帳戶,以及一個額外的 帳戶以進行AFT管理。

  • 已建立 AWS Control Tower 的環境。管理帳戶應正確設定,因為 CloudFormation 範本會部署在其中。

  • AWS 管理帳戶中的必要許可。您需要足夠的許可來建立和管理資源,例如 S3 儲存貯體、 AWS Lambda 函數、 AWS Identity and Access Management (IAM) 角色和 AWS CodePipeline 專案。

  • 熟悉 Terraform。了解 Terraform 的核心概念和工作流程很重要,因為部署涉及產生和管理 Terraform 組態。

限制

  • 請注意您帳戶中AWS 的資源配額。部署可能會建立多個資源,而遇到服務配額可能會阻礙部署程序。

  • 範本專為特定版本的 Terraform 和 而設計 AWS 服務。升級或變更版本可能需要修改範本。

產品版本

  • Terraform 1.5.7 版或更新版本

  • AFT 1.11.1 版或更新版本

架構

目標技術堆疊

  • AWS CloudFormation

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • Amazon EventBridge

  • IAM

  • AWS Lambda

  • Amazon S3

目標架構

下圖說明此模式討論的實作。

使用引導管道AFT實作的工作流程

工作流程包含三個主要任務:建立資源、產生內容和執行管道。

建立 資源

CloudFormation 隨此模式提供的範本會建立和設定所有必要資源,具體取決於您在部署範本時選取的參數。範本至少會建立下列資源:

  • 儲存 AFT Terraform 引導程式碼的 CodeCommit 儲存庫

  • 儲存與AFT實作相關聯的 Terraform 狀態檔案的 S3 儲存貯體

  • CodePipeline 管道

  • 兩個 CodeBuild 專案來實作 Terraform 計劃,並在管道的不同階段套用命令

  • IAM CodeBuild 和 CodePipeline 服務的角色

  • 儲存管道執行期成品的第二個 S3 儲存貯體

  • 擷取main分支上 CodeCommit 儲存庫變更的 EventBridge 規則

  • EventBridge 規則的另一個IAM角色

此外,如果您將 CloudFormation 範本中的 Generate AFT Files 參數設定為 true,範本會建立這些其他資源來產生內容:

  • 儲存產生內容並用作 CodeCommit 儲存庫來源的 S3 儲存貯體

  • Lambda 函數可處理指定的參數並產生適當的內容

  • 執行 Lambda IAM函數的函數

  • 部署範本時執行 Lambda 函數的 CloudFormation 自訂資源

產生內容

若要產生AFT引導檔案及其內容,解決方案會使用 Lambda 函數和 S3 儲存貯體。函數會在儲存貯體中建立資料夾,然後在資料夾內建立兩個檔案: main.tfbackend.tf。函數也會處理提供的 CloudFormation 參數,並使用預先定義的程式碼填入這些檔案,取代個別的參數值。

若要檢視用來產生檔案的範本程式碼,請參閱解決方案的GitHub 儲存庫 。基本上,檔案的產生方式如下。

main.tf

module "aft" { source = "github.com/aws-ia/terraform-aws-control_tower_account_factory?ref=<aft_version>" # Required variables ct_management_account_id = "<ct_management_account_id>" log_archive_account_id = "<log_archive_account_id>" audit_account_id = "<audit_account_id>" aft_management_account_id = "<aft_management_account_id>" ct_home_region = "<ct_home_region>" # Optional variables tf_backend_secondary_region = "<tf_backend_secondary_region>" aft_metrics_reporting = "<false|true>" # AFT Feature flags aft_feature_cloudtrail_data_events = "<false|true>" aft_feature_enterprise_support = "<false|true>" aft_feature_delete_default_vpcs_enabled = "<false|true>" # Terraform variables terraform_version = "<terraform_version>" terraform_distribution = "<terraform_distribution>" }

backend.tf

terraform { backend "s3" { region = "<aft-main-region>" bucket = "<s3-bucket-name>" key = "aft-setup.tfstate" } }

在儲存 CodeCommit 庫建立期間,如果您將 Generate AFT Files 參數設定為 true,範本會使用 S3 儲存貯體搭配產生的內容作為main分支的來源,以自動填入儲存庫。

執行管道

建立資源並設定引導檔案後,管道就會執行。第一階段 (來源 ) 從儲存庫的主分支擷取原始程式碼,第二階段 (建置 ) 會執行 Terraform 計劃命令,並產生要檢閱的結果。在第三個階段 (核准 ) 中,管道會等待手動動作核准或拒絕最後一個階段 (部署 )。在最後一個階段,管道會使用先前 Terraform apply命令的結果作為輸入,來執行 Terraform plan命令。最後,使用跨帳戶角色和管理帳戶中的許可來建立AFT管理帳戶中AFT的資源。

工具

AWS 服務

  • AWS CloudFormation 可協助您設定AWS資源、快速且一致地佈建資源,並在其整個生命週期內跨AWS帳戶和區域進行管理。

  • AWS CodeBuild 是一項完全受管建置服務,可協助您編譯原始程式碼、執行單位測試,並產生準備好部署的成品。 

  • AWS CodeCommit 是一種版本控制服務,可協助您私下存放和管理 Git 儲存庫,而不需要管理您自己的來源控制系統。

  • AWS CodePipeline 可協助您快速建模和設定軟體版本的不同階段,並自動執行持續發行軟體變更所需的步驟。

  • AWS Lambda 是一種運算服務,可針對事件執行程式碼並自動管理運算資源,提供快速的方式,以建立現代化、無伺服器的應用程式進行生產。

  • AWS SDK for Python (Boto3) 是軟體開發套件,可協助您將 Python 應用程式、程式庫或指令碼與 AWS服務整合。

其他工具

  • Terraform 是一種基礎設施作為程式碼 IaC) 工具,可讓您安全有效地建置、變更和版本基礎設施。這包括低階元件,例如運算執行個體、儲存體和聯網;以及高階元件,例如DNS項目和 SaaS 功能。

  • Python 是一種易於學習且功能強大的程式設計語言。它具有高效的高階資料結構,並為物件導向程式設計提供簡單但有效的方法。

程式碼儲存庫

此模式的程式碼可在 GitHub AFT引導管道儲存庫 中使用。

如需官方AFT儲存庫,請參閱 中的 AWS Control Tower Account Factory for Terraform GitHub。

最佳實務

當您AFT使用提供的 CloudFormation 範本進行部署時,建議您遵循最佳實務,以協助確保安全、高效且成功的實作。實作和操作 的重要準則和建議AFT包括以下內容。

  • 徹底檢閱參數 :仔細檢閱並了解 CloudFormation 範本中的每個參數。準確的參數組態對於 的正確設定和運作至關重要AFT。

  • 定期範本更新 :使用最新 AWS 功能和 Terraform 版本來保持範本的更新。定期更新可協助您利用新功能並維護安全性。

  • 版本控制 :盡可能釘選AFT模組版本,並使用個別AFT部署進行測試。

  • 範圍 :AFT僅用於部署基礎設施護欄和自訂。請勿使用它來部署您的應用程式。

  • 內嵌和驗證:AFT管道需要內嵌和驗證的 Terraform 組態。在將組態推送至AFT儲存庫之前,先執行 lint、驗證和測試。

  • Terraform 模組 :建置可重複使用的 Terraform 程式碼做為模組,並一律指定 Terraform 和 AWS 提供者版本以符合組織的需求。

史詩

任務描述所需的技能

準備 AWS Control Tower 環境。

AWS Control Tower 在您的 AWS 環境中設定和配置,以確保 的集中管理和治理 AWS 帳戶。如需詳細資訊,請參閱 AWS Control Tower 文件中的入門 AWS Control Tower

雲端管理員

啟動AFT管理帳戶。

使用 AWS Control Tower Account Factory 啟動新的 AWS 帳戶 作為您的AFT管理帳戶。如需詳細資訊,請參閱 AWS Control Tower 文件中的使用 AWS Service Catalog Account Factory 佈建帳戶

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

啟動 CloudFormation 範本。

在此史詩中,您可以部署此解決方案隨附的 CloudFormation 範本,以在 AWS 管理帳戶中設定AFT引導管道。管道會在您在上一個史詩中設定的AFT管理帳戶中部署AFT解決方案。

步驟 1:開啟 AWS CloudFormation 主控台

步驟 2:建立新的堆疊

  1. 選擇建立新的堆疊。

  2. 選取 選項以上傳範本檔案,並上傳隨此模式提供的CloudFormation 範本

步驟 3:設定堆疊參數

  • Repository Name:指定儲存AFT引導模組的儲存庫名稱。

  • Branch Name:指定來源儲存庫分支。

  • CodeBuild Docker Image:選擇要用作 CodeBuild Docker 基礎映像的檔案。

步驟 4:決定檔案產生

  • Generate AFT Files 參數會控制是否要產生預設AFT部署檔案。將此參數設定為:

    • true 在指定的儲存庫中自動建立和存放AFT部署檔案。

    • false 如果您想要手動處理檔案建立,或已備妥檔案。

    如果您選擇 false,請前往步驟 8;否則,請先遵循步驟 5–7。

步驟 5:填入 AWS Control Tower 和 AFT 帳戶詳細資訊

  • 輸入 AWS Control Tower 和AFT帳戶特定資訊:

    • Log Archive Account ID: 中 Log Archive 帳戶 ID 的 ID AWS Control Tower。

    • Audit Account ID: 中稽核帳戶的 ID AWS Control Tower。

    • AFT Management Account ID:您在第一個史詩中建立的AFT管理帳戶的 ID。

    • AFT Main RegionAFT Secondary Region: AWS 區域 AFT部署的主要和次要。

步驟 6:設定AFT選項

  • 設定指標報告:

    • AFT Enable Metrics Reporting:啟用或停用AFT指標報告。如需詳細資訊,請參閱 AWS Control Tower 文件中的操作指標

  • 設定AFT功能選項:

    • Enable AFT CloudTrail Data Events:啟用所有AFT受管帳戶中 CloudTrail 的資料事件。如需詳細資訊,請參閱 AWS Control Tower 文件中的AWS CloudTrail 資料事件

    • Enable AFT Enterprise Support:在所有AFT受管帳戶中啟用企業支援。如需詳細資訊,請參閱 AWS Control Tower 文件中的AWS 企業支援計劃

    • Enable AFT Delete Default VPC:僅刪除VPCsAFT管理帳戶中的所有 。如需詳細資訊,請參閱 AWS Control Tower 文件中的刪除 AWS 預設值VPC

步驟 7:指定版本

  • AFT Terraform Version:選擇要在AFT管道中使用的 Terraform 版本。

  • AFT Version:定義部署的AFT版本。保留預設設定 (latest) 以使用最新版本AFT。

步驟 8:檢閱並建立堆疊

  • 檢閱所有參數和設定。如果一切都已排序,請繼續建立堆疊。

步驟 9:監控堆疊建立

  • AWS CloudFormation 佈建並設定您定義的資源。在 CloudFormation 主控台上監控堆疊建立程序。此程序可能需要幾分鐘的時間。

步驟 10:驗證部署

  • 當堆疊狀態顯示 CREATE_COMPLETE 時,請確認所有資源都已正確建立。

  • 輸出區段中,記下 TerraformBackendBucketName值。

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

填入AFT引導儲存庫。

(選用) 部署 CloudFormation 範本後,您可以在新建立的AFT引導儲存庫中填入或驗證內容,並測試管道是否已成功執行。

如果您將 Generate AFT Files 參數設定為 true,請跳至下一個故事 (驗證管道)。

步驟 1:填入儲存庫

  1. 開啟AWS CodeCommit 主控台,然後選取新建立的儲存庫。如果您保留預設名稱,儲存庫將稱為 aft-setup

  2. 使用 SSH、 或 HTTPS(GRC) 將儲存庫複製到本機機器HTTPS,然後在編輯器中開啟儲存庫。

  3. 建立名為 的資料夾terraform,以及其中的兩個空白檔案: backend.tfmain.tf

  4. 開啟 backend.tf 檔案並新增此程式碼片段:

    terraform { backend "s3" { region = "<aft-main-region>" bucket = "<s3-bucket-name>" key = "aft-setup" } }

    在 檔案中:

    • <aft-main-region> 以主要AFT區域取代 。這應與 AWS Control Tower 主要區域相符。

    • <s3-bucket-name> 以 Terraform 後端儲存貯體的名稱取代 。您可以在先前部署的 CloudFormation 範本產生的TerraformBackendBucketName輸出中找到此項目。

  5. 開啟 main.tf 檔案,並使用AFT儲存庫中可用的其中一個範例來部署 AFT。例如,您可以使用偏好的版本控制系統 (VCS) 供應商 (CodeCommit GitHub、 或 Bitbucket) 或自訂 AFT VPC。如需更多AFT輸入選項,請參閱 AFT 儲存庫中的 README 檔案

步驟 2:認可並推送變更

  • 建立並填入資料夾和檔案之後,請確認變更,然後將程式碼上傳到儲存庫。管道會自動啟動,透過來源和建置階段執行,然後在部署階段之前等待核准動作。

雲端管理員

驗證AFT引導管道。

步驟 1:檢視管道

  • 開啟CodePipeline 主控台,並檢查aft-bootstrap-pipeline管道是否已成功啟動。它應該正在執行 Terraform 計劃或等待手動核准動作。

步驟 2:核准 Terraform 計劃結果

  • 您可以透過查看建置階段的執行日誌來檢閱 Terraform 計劃的結果,然後在核准階段核准或拒絕執行。如果您核准,管道會開始在提供的AFT管理帳戶中部署AFT資源。

步驟 3:等待部署

  • 等待管道成功執行。這大約需要 30 分鐘。您可能遇到的任何失敗通常是由API配額造成。在這些情況下,您可以重新執行管道以繼續部署。

步驟 4:檢查建立的資源

  • 存取AFT管理帳戶並確認資源已建立。

雲端管理員

故障診斷

問題解決方案

CloudFormation 範本中包含的自訂 Lambda 函數在部署期間失敗。

檢查 Lambda 函數的 Amazon CloudWatch 日誌以識別錯誤。日誌提供詳細資訊,有助於找出特定問題。確認 Lambda 函數具有必要的許可,以及環境變數已正確設定。

您遇到資源建立或管理失敗,原因在於許可不足。

檢閱連接至 Lambda 函數IAM的角色和政策 CodeBuild,以及與部署相關的其他服務。確認他們具有必要的許可。如果有許可問題,請調整IAM政策以授予必要的存取權。

您正在使用過時的 CloudFormation 範本版本搭配較新的 AWS 服務 或 Terraform 版本。

定期更新 CloudFormation 範本,使其與最新 AWS 和 Terraform 版本相容。檢查版本備註或文件是否有任何版本特定的變更或要求。

您可以在部署期間達到 AWS 服務 配額。

部署管道之前,請檢查資源 AWS 服務 配額,例如 S3 儲存貯體、IAM角色和 Lambda 函數。請求會視需要增加。如需詳細資訊,請參閱 AWS 網站上的AWS 服務 配額

由於 CloudFormation 範本中的輸入參數不正確,您遇到錯誤。

仔細檢查所有輸入參數是否有錯字或不正確的值。確認資源識別符,例如帳戶IDs和區域名稱,是否準確。

相關資源

若要成功實作此模式,請檢閱下列資源。這些資源提供其他資訊和指引,這些資訊和指引對於AFT使用 設定和管理來說非常重要 AWS CloudFormation。

AWS 文件:

IAM 政策和最佳實務:

上的 Terraform AWS:

AWS 服務 配額:

  • AWS 服務 配額提供有關如何檢視 AWS 服務 配額以及如何請求增加的資訊。