使用 Account Factory for Terraform 管理多個帳戶的許可集 - AWS 方案指引

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

使用 Account Factory for Terraform 管理多個帳戶的許可集

Anand Krishna Varanasi 和 Siamak Heshmati,Amazon Web Services

Summary

此模式可協助您將 AWS Control Tower Account Factory Terraform (AFT)AWS IAM Identity Center 整合,以 AWS 帳戶 大規模設定多個 的許可。此方法使用自訂 AWS Lambda 函數來自動化以組織形式管理 AWS 帳戶 之 的許可集指派。這可簡化程序,因為它不需要您平台工程團隊的手動介入。此解決方案可以增強營運效率、安全性和一致性。它為 提升了安全且標準化的加入程序 AWS Control Tower,讓優先考慮其雲端基礎設施敏捷性和可靠性的企業難以取代。

先決條件和限制

先決條件

限制

  • 此解決方案只能與透過 管理的帳戶搭配使用 AWS Control Tower。此解決方案是透過使用 Account Factory for Terraform 進行部署。

  • 此模式不包含使用身分來源設定聯合身分的指示。如需如何完成此設定的詳細資訊,請參閱 IAM Identity Center 文件中的 IAM Identity Center 身分來源教學課程。

架構

AFT 概觀

AFT 會設定 Terraform 管道,協助您在其中佈建和自訂帳戶 AWS Control Tower。AFT 遵循可自動化帳戶佈建程序的 GitOps 模型 AWS Control Tower。您可以建立帳戶請求 Terraform 檔案並將其遞交至儲存庫。這會啟動帳戶佈建的 AFT 工作流程。帳戶佈建完成後,AFT 可以自動執行其他自訂步驟。如需詳細資訊,請參閱 AWS Control Tower 文件中的 AFT 架構

AFT 提供下列主要儲存庫:

  • aft-account-request – 此儲存庫包含要建立或更新的 Terraform 程式碼 AWS 帳戶。

  • aft-account-customizations – 此儲存庫包含 Terraform 程式碼,以根據每個帳戶建立或自訂資源。

  • aft-global-customizations – 此儲存庫包含 Terraform 程式碼,可大規模為所有帳戶建立或自訂資源。

  • aft-account-provisioning-customizations – 此儲存庫會管理僅套用至由 建立並使用 AFT 管理之特定帳戶的自訂。例如,您可以使用此儲存庫來自訂 IAM Identity Center 中的使用者或群組指派,或自動關閉帳戶。

解決方案概觀

此自訂解決方案包含 AWS Step Functions 狀態機器和 AWS Lambda 函數,可將許可集指派給多個帳戶的使用者和群組。透過此模式部署的狀態機器會搭配預先存在的 AFT aft_account_provisioning_customizations 狀態機器運作。建立新的 時或帳戶建立後,使用者會提交更新 IAM Identity Center AWS 帳戶 使用者和群組指派的請求。他們會將變更推送至aft-account-request儲存庫來執行此操作。建立或更新帳戶的請求會在 Amazon DynamoDB Streams 中啟動串流。這會啟動 Lambda 函數,以更新目標的 IAM Identity Center 使用者和群組 AWS 帳戶。

以下是您可以在 Lambda 函數中提供的參數範例,用於將許可集指派至目標使用者和群組:

custom_fields = { "InstanceArn" = "<Organization ID>", "PermissionSetArn" = "<Permission set ARN>", "PrincipalId" = "<Principal ID>", }

以下是此陳述式中的參數:

  • InstanceArn – 組織的 Amazon Resource Name (ARN)

  • PermissionSetArn – 許可集的 ARN

  • PrincipalId – IAM Identity Center 中要套用許可集之使用者或群組的識別符

注意

您必須先建立目標許可集、使用者和群組,才能執行此解決方案。

雖然InstanceArn值必須保持一致,但您可以修改 Lambda 函數,將多個許可集指派給多個目標身分。許可集的參數必須以 結尾PermissionSetArn,而使用者和群組的參數必須以 結尾PrincipalId。您必須定義兩個屬性。以下是如何定義多個許可集和目標使用者和群組的範例:

custom_fields = { "InstanceArn" = "<Organization ID>", "AdminAccessPermissionSetArn" = "<Admin privileges permission set ARN>", "AdminAccessPrincipalId" = "<Admin principal ID>", "ReadOnlyAccessPermissionSetArn" = "<Read-only privileges permission set ARN>", "ReadOnlyAccessPrincipalId" = "<Read-only principal ID>", }

下圖顯示解決方案如何 AWS 帳戶 大規模更新目標中使用者和群組許可集step-by-step工作流程。當使用者啟動帳戶建立請求時,AFT 會啟動 aft-account-provisioning-framework Step Functions 狀態機器。此狀態機器會啟動 extract-alternate-sso Lambda 函數。Lambda 函數會將許可集指派給目標中的使用者和群組 AWS 帳戶。這些使用者或群組可以來自 IAM Identity Center 中的任何已設定身分來源。身分來源的範例包括 Okta、Active Directory 或 Ping Identity。

建立或更新帳戶時更新許可集的工作流程。

圖表顯示建立新帳戶時的下列工作流程:

  1. 使用者將custom_fields變更推送至aft-account-request儲存庫。

  2. AWS CodePipeline 會啟動將使用者定義中繼資料記錄到 Amazon DynamoDB aft-request-audit 資料表 AWS CodeBuild 的任務。此資料表具有屬性來記錄使用者定義的中繼資料。ddb_event_name 屬性會定義 AFT 操作的類型:

    • 如果值為 INSERT,則解決方案會在建立新的 時,將許可集指派給目標身分 AWS 帳戶 。

    • 如果值為 UPDATE,則解決方案會在 AWS 帳戶 建立 之後,將許可集指派給目標身分。

  3. Amazon DynamoDB Streams 會啟動 aft_alternate_sso_extract Lambda 函數。

  4. aft_alternate_sso_extract Lambda 函數在 AWS Control Tower 管理帳戶中擔任 AWS Identity and Access Management (IAM) 角色。

  5. Lambda 函數透過對 IAM Identity Center 進行 an 適用於 Python (Boto3) 的 AWS SDK create_account_assignment API 呼叫,將許可集指派給目標使用者和群組。它會從 Amazon DynamoDB aft-request-audit 資料表擷取許可集和身分指派。

  6. 當 Step Functions 工作流程完成時,會將許可集指派給目標身分。

自動化和擴展

AFT 使用 CodePipeline AWS CodeBuild、DynamoDB 和高度可擴展的 Lambda AWS 服務 等大規模運作。如需其他自動化,您可以將此解決方案與票證或問題管理系統整合,例如 Jira。如需詳細資訊,請參閱此模式的其他資訊一節。

工具

AWS 服務

  • Account Factory for Terraform (AFT) 是此解決方案中的主要工具。aft-account-provisioning-customizations 儲存庫包含用於建立自訂的 Terraform 程式碼 AWS 帳戶,例如自訂 IAM Identity Center 使用者或群組指派。

  • Amazon DynamoDB 是一項全受管 NoSQL 資料庫服務,可提供快速、可預期且可擴展的效能。

  • AWS Lambda 是一項運算服務,可協助您執行程式碼,無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需按使用的運算時間付費。

  • AWS Step Functions 是一種無伺服器協同運作服務,可協助您結合 AWS Lambda 函數和其他 AWS 服務 來建置業務關鍵型應用程式。

其他工具

  • Python 是一種一般用途的電腦程式設計語言。

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

程式碼儲存庫

AFT 的程式碼儲存庫可在 GitHub AWS Control Tower Account Factory for Terraform 儲存庫中取得。此模式的程式碼可在 AWS 帳戶 Govern SSO 指派中使用 Account Factory for Terraform (AFT) 儲存庫。

最佳實務

史詩

任務描述所需的技能

建立 IAM 角色。

在 AWS Control Tower 管理帳戶中,使用 Terraform 建立 IAM 角色。此角色具有跨帳戶存取和信任政策,允許來自身分提供者的聯合存取。它還具有透過 授予其他帳戶存取權的許可 AWS Control Tower。Lambda 函數將擔任此角色。請執行下列操作:

  1. 從 GitHub 程式碼儲存庫下載 AFTCrossAccountRole.tf 檔案。

  2. 視需要為您的 AWS 環境修改 AFTCrossAccountRole.tf 檔案。

  3. 在 Terraform 中,輸入下列命令來建立此 IAM 角色:

    terraform init terraform plan terraform apply
  4. 驗證角色已成功部署,並具有預期的跨帳戶存取。

AWS DevOps,雲端架構師

為您的環境自訂解決方案。

  1. 輸入下列命令,將AWS 帳戶 適用於使用 Account Factory for Terraform (AFT) 儲存庫的治理 SSO 指派複製到本機工作站。

    git clone https://github.com/aws-samples/aft-custom-sso-assignment.git
  2. aft-account-provisioning-customizations/terraform資料夾中,開啟 variables.tf 檔案。

  3. 視需要為您的環境修改變數。

  4. 儲存並關閉 variables.tf 檔案。

  5. 在您的aft-account-request儲存庫中開啟 account-request.tf 檔案。

  6. 修改custom_fields參數以定義許可集和目標使用者和群組。如需詳細資訊,請參閱此模式的架構區段。

  7. 儲存並關閉 account-request.tf 檔案。

AWS DevOps,雲端架構師

部署解決方案。

  1. 在複製的儲存庫中,複製terraform資料夾的內容,然後將其貼入aft-account-provisioning-customizations儲存庫中的terraform資料夾。

  2. 在 AFT 管理帳戶中,啟動ct-aft-account-provisioning-customizations管道。這會部署自訂解決方案。如需說明,請參閱在 CodePipeline 中啟動管道

  3. 驗證資源是否已成功部署在 AFT 管理帳戶中。

AWS DevOps,雲端架構師

設定程式碼儲存庫連線。

在您要存放組態檔案的程式碼儲存庫與 之間設定連線 AWS 帳戶。如需說明,請參閱 AWS CodePipeline 文件中的使用 CodeConnections 將第三方來源提供者新增至管道

AWS DevOps,雲端架構師
任務描述所需的技能

啟動 AFT 管道以部署新帳戶。

請遵循使用 AFT 佈建新帳戶中的指示,以啟動 AWS 帳戶 在您的 AWS Control Tower 環境中建立新 的管道。等待帳戶建立程序完成。

AWS DevOps,雲端架構師

驗證變更。

  1. 開啟 AWS IAM Identity Center 主控台

  2. 在帳戶清單中,選擇新建立的帳戶。

  3. 驗證是否已指派許可集,以將存取權授予目標使用者和群組。

AWS DevOps,雲端架構師

故障診斷

問題解決方案

許可集指派無法運作。

確定群組 ARN、組織 ID 和 Lambda 參數正確。如需範例,請參閱此模式的解決方案概觀一節。

更新儲存庫中的程式碼不會啟動管道。

此問題與 AWS 帳戶 和 儲存庫之間的連線有關。在 中 AWS Management Console,驗證連線是否作用中。如需詳細資訊,請參閱 AWS CodePipeline 文件中的 GitHub 連線

其他資訊

與票證管理工具整合

您可以選擇將此解決方案與票證或問題管理工具整合,例如 Jira 或 ServiceNow。下圖顯示此選項的範例工作流程。您可以使用工具的連接器,將票證管理工具與 AFT 解決方案儲存庫整合。如需 Jira 連接器,請參閱將 Jira 與 GitHub 整合。如需 ServiceNow 連接器,請參閱與 GitHub 整合。您甚至可以建置自訂解決方案,要求使用者在提取請求核准過程中提供票證 ID。如果 AWS 帳戶 使用 AFT 建立新 的請求獲得核准,該事件可能會啟動工作流程,將自訂欄位新增至 aft-account-request GitHub 儲存庫。您可以設計任何符合您使用案例需求的自訂工作流程。

使用 GitHub 動作和票證管理工具的工作流程。

該圖顯示以下工作流程:

  1. 使用者在票證管理工具中請求自訂許可集指派,例如 Jira。

  2. 核准案例後,工作流程會開始更新許可集指派。(選用) 您可以使用外掛程式來自訂此步驟的自動化。

  3. 運算子會將 Terraform 程式碼與更新的許可集參數傳送至開發或功能分支中的aft-account-request儲存庫。

  4. GitHub 動作 AWS CodeBuild 會使用 OpenID Connect (OIDC) 呼叫啟動。CodeBuild 使用 tfseccheckov 等工具,以程式碼 (IaC) 安全性掃描的形式執行基礎設施。它會警告運算子任何安全違規。

  5. 如果找不到違規,GitHub Actions 會建立自動提取請求,並將程式碼檢閱指派給程式碼擁有者。它也會為提取請求建立標籤。

  6. 如果程式碼擁有者核准程式碼檢閱,則會啟動另一個 GitHub 動作工作流程。它會檢查提取請求標準,包括:

    • 如果提取請求標題符合要求。

    • 如果提取請求內文包含核准的案例編號。

    • 如果提取請求已正確標記。

  7. 如果提取請求符合標準,GitHub 動作會啟動 AFT 產品工作流程。其使用 會在 中啟動ct-aft-account-request管道 AWS CodePipeline。此管道會在 Step Functions 中啟動aft-account-provisioning-framework自訂狀態機器。此狀態機器的運作方式如先前此模式的解決方案概觀一節所述。