在本機驗證 Account Factory for Terraform (AFT) 程式碼 - AWS 方案指引

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

在本機驗證 Account Factory for Terraform (AFT) 程式碼

由 Alexandru Pop (AWS) 和 Michal Gorniak (AWS) 建立

環境:生產

技術:基礎設施 DevOps;現代化; DevelopmentAndTesting

工作負載:開放原始碼

AWS 服務:AWSControl Tower

Summary

此模式顯示如何本機測試由 AWS Control Tower Account Factory for HashiCorp Terraform () 管理的 Terraform 程式碼AFT。Terraform 是一種開放原始碼基礎設施作為程式碼 (IaC工具,可協助您使用程式碼來佈建和管理雲端基礎設施和資源。AFT 設定 Terraform 管道,協助您在 AWS Control Tower 中佈建和自訂多個AWS帳戶。

在程式碼開發期間,在AFT管道外部,以程式碼 (IaC) 在本機測試您的 Terraform 基礎設施會很有幫助。此模式顯示如何執行下列操作:

  • 擷取儲存在您AFT管理帳戶中AWS CodeCommit 儲存庫中的 Terraform 程式碼本機副本。

  • 使用擷取的程式碼在本機模擬AFT管道。

此程序也可用於執行不屬於正常AFT管道的 Terraform 命令。例如,您可以使用此方法執行命令,例如 terraform validateterraform destroyterraform planterraform import

先決條件和限制

先決條件

限制

  • 此模式不包含 AWS Control Tower、 AFT或任何特定 Terraform 模組所需的部署步驟。

  • 在此程序中在本機產生的輸出不會儲存在AFT管道執行期日誌中。

架構

目標技術堆疊

  • AFT 在 AWS Control Tower 部署內部署的基礎設施

  • Terraform

  • Git

  • AWS CLI 第 2 版

自動化和擴展

此模式顯示如何針對單一 AFT受管AWS帳戶中的AFT全域帳戶自訂,在本機叫用 Terraform 程式碼。在驗證 Terraform 程式碼之後,您可以將其套用至多帳戶環境中的其餘帳戶。如需詳細資訊,請參閱 AWS Control Tower 文件中的重新叫用自訂

您也可以使用類似的程序,在本機終端機中執行AFT帳戶自訂。若要從AFT帳戶自訂中本機叫用 Terraform 程式碼,請在您的AFT管理帳戶中複製aft-account-customizations 儲存庫,而不是從 CodeCommit 儲存aft-global-account-customizations庫。

工具

AWS 服務

其他服務

  • HashiCorp Terraform 是一種開放原始碼基礎設施作為程式碼 IaC) 工具,可協助您使用程式碼來佈建和管理雲端基礎設施和資源。

  • Git 是開放原始碼的分散式版本控制系統。

Code

以下是範例 bash 指令碼,可用於本機執行由 管理的 Terraform 程式碼AFT。若要使用指令碼,請遵循此模式的 Epics 區段中的指示。

#! /bin/bash # Version: 1.1 2022-06-24 Unsetting AWS_PROFILE since, when set, it interferes with script operation #          1.0 2022-02-02 Initial Version # # Purpose: For use with AFT: This script runs the local copy of TF code as if it were running within AFT pipeline. #        * Facilitates testing of what the AFT pipline will do #           * Provides the ability to run terraform with custom arguments (like 'plan' or 'move') which are currently not supported within the pipeline. # # © 2021 Amazon Web Services, Inc. or its affiliates. All Rights Reserved. # This AWS Content is provided subject to the terms of the AWS Customer Agreement # available at http://aws.amazon.com/agreement or other written agreement between # Customer and either Amazon Web Services, Inc. or Amazon Web Services EMEA SARL or both. # # Note: Arguments to this script are passed directly to 'terraform' without parsing nor validation by this script. # # Prerequisites: #    1. local copy of ct GIT repositories #    2. local backend.tf and aft-providers.tf filled with data for the target account on which terraform is to be run #       Hint: The contents of above files can be obtain from the logs of a previous execution of the AFT pipeline for the target account. #    3. 'terraform' binary is available in local PATH #    4. Recommended: .gitignore file containing 'backend.tf', 'aft_providers.tf' so the local copy of these files are not pushed back to git readonly credentials=$(aws sts assume-role \     --role-arn arn:aws:iam::$(aws sts get-caller-identity --query "Account" --output text ):role/AWSAFTAdmin \     --role-session-name AWSAFT-Session \     --query Credentials ) unset AWS_PROFILE export AWS_ACCESS_KEY_ID=$(echo $credentials | jq -r '.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $credentials | jq -r '.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $credentials | jq -r '.SessionToken') terraform "$@"

史詩

任務描述所需的技能

將範例程式碼儲存為本機檔案。

  1. 複製此模式程式碼 區段中的範例 bash 指令碼,並將其貼到程式碼編輯器中。

  2. 將檔案命名為 ct_terraform.sh。然後,在本機將檔案儲存在專用資料夾中,例如 ~/scripts~/bin

AWS 管理員

讓範例程式碼可執行。

開啟終端機視窗,並執行下列其中一個動作以驗證您的AWSAFT管理帳戶:

  • 使用已設定具有存取AFT管理帳戶所需許可的現有AWSCLI設定檔。若要使用 設定檔,您可以執行下列命令:

export AWS_PROFILE=<aft account profile name>
  • 如果您的組織使用 SSO 來存取 AWS,請在組織的SSO頁面上輸入AFT管理帳戶的憑證。

注意:您的組織可能也有自訂工具,可為您的AWS環境提供身分驗證憑證。

AWS 管理員

驗證對正確AWS區域中AFT管理帳戶的存取。

重要事項:請確定您使用與AFT管理帳戶驗證的相同終端機工作階段。

  1. 執行下列命令AWS,導覽至AFT部署的區域:

    export AWS_REGION=<aft_region>
  2. 執行下列動作,確認您位於正確的 帳戶:

    • 執行以下命令:

    aws code-commit list-repositories
    • 然後,驗證輸出中列出的儲存庫是否符合AFT管理帳戶中的儲存庫名稱。

AWS 管理員

建立新的本機目錄以存放AFT儲存庫程式碼。

在相同的終端機工作階段中,執行下列命令:

mkdir my_aft cd my_aft
AWS 管理員

複製遠端AFT儲存庫程式碼。

  1. 在本機終端機中,執行下列命令:

    git clone codecommit::$AWS_REGION://aft-global-customizations

    注意:為了簡化,此程序僅使用AFT主程式碼分支。若要使用程式碼分支,您也可以在此處輸入程式碼分支命令。不過,當AFT自動化從主分支套用程式碼時,來自非主分支的任何套用變更都會復原。

  2. 然後,執行下列命令以導覽至複製的目錄:

    cd aft-global-customizations/terraform
AWS 管理員
任務描述所需的技能

開啟先前執行的AFT管道,並將 Terraform 組態檔案複製到本機資料夾。

注意:AFT管道需要在此史詩中建立的 backend.tfaft-providers.tf 組態檔案,才能在本機執行。這些檔案會在雲端AFT管道中自動建立,但必須手動建立,才能在本機執行管道。在本機執行AFT管道需要一組檔案,代表在單一AWS帳戶中執行管道。

  1. 使用您的 AWS Control Tower 管理帳戶憑證,登入 AWS 管理主控台。然後開啟AWS CodePipeline 主控台 。請確定您位於部署 的相同AWS區域AFT。

  2. 在左側導覽窗格中,選擇 Pipelines (管道)。

  3. 選擇 ###########-customizations-pipeline 。(############ 是您用於在本機執行 Terraform 程式碼AWS的帳戶 ID)。

  4. 請確定最近標記的執行顯示成功值。如果值不同,則必須在AFT管道中重新叫用自訂項目。如需詳細資訊,請參閱 AWS Control Tower 文件中的重新叫用自訂

  5. 選擇最新的執行時間,以顯示其詳細資訊。

  6. Apply-AFT-Global-Customizations 區段中,尋找 Apply-Terraform 階段。

  7. 選取 Apply-Terraform 階段的詳細資訊區段。

  8. 尋找 Apply-Terraform 階段的執行期日誌。

  9. 在執行期日誌中,尋找以下列行開頭和結尾的區段:“\n\n aft-providers.tf ... “\n \n backend.tf”  

  10. 在這兩個標籤之間複製輸出,並將其儲存為本機 Terraform 資料夾 (終端機工作階段目前的工作目錄) aft-providers.tf中命名的本機檔案。

    自動產生的 providers.tf 陳述式範例

    ## Autogenerated providers.tf ## ## Updated on: 2022-05-31 16:27:45 ## provider "aws" { region = "us-east-2" assume_role { role_arn = "arn:aws:iam::############:role/AWSAFTExecution" } default_tags { tags = { managed_by = "AFT" } } }
  11. 在執行期日誌中,尋找以下列行開頭和結尾的區段:「\n\n tf ...「\n \n backup.tf」  

  12. 在這兩個標籤之間複製輸出,並將其儲存為本機 Terraform 資料夾 (終端機工作階段目前的工作目錄) tf中名為 的本機檔案。

自動產生的 backend.tf 陳述式範例

## Autogenerated backend.tf ## ## Updated on: 2022-05-31 16:27:45 ## terraform { required_version = ">= 0.15.0" backend "s3" { region = "us-east-2" bucket = "aft-backend-############-primary-region" key = "############-aft-global-customizations/terraform.tfstate" dynamodb_table = "aft-backend-############" encrypt = "true" kms_key_id = "cbdc21d6-e04d-4c37-854f-51e199cfcb7c" kms_key_id = "########-####-####-####-############" role_arn = "arn:aws:iam::#############:role/AWSAFTExecution" } }

注意: backend.tfaft-providers.tf 檔案會綁定至特定AWS帳戶、AFT部署和資料夾。這些檔案也不同,取決於它們是否位於相同AFT部署中的aft-global-customizations儲存庫和aft-account-customizations儲存庫中。請務必從相同的執行時間清單中產生這兩個檔案。

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

實作您要驗證的 Terraform 組態變更。

  1. 透過執行下列命令導覽至複製的aft-global-customizations儲存庫:

    cd aft-global-customizations/terraform

    注意:檔案 backend.tfaft-providers.tf位於此目錄中。目錄也包含來自aft-global-customizations 儲存庫的 Terraform 檔案。

  2. 將您要在本機測試的 Terraform 程式碼變更合併到組態檔案中。

AWS 管理員

執行 ct_terraform.sh 指令碼並檢閱輸出。

  1. 導覽至包含 sh 指令碼的本機資料夾。

  2. 若要驗證修改後的 Terraform 程式碼,請執行下列命令來執行ct_terraform.sh指令碼:

    ~/scripts/ct_terraform.sh apply

    注意:您可以在此步驟期間執行任何 Terraform 命令。若要查看 Terraform 命令的完整清單,請執行下列命令:

    terraform --help
  3. 檢閱命令輸出。然後,在遞交變更並將其推回AFT儲存庫之前,在本機對程式碼變更進行偵錯。

重要:

  • 任何在本機進行但未推回遠端儲存庫的變更都是暫時性的,而且可能隨時由執行中的AFT管道自動化復原。

  • AFT 自動化可以隨時執行,因為其他使用者和AFT自動化觸發程序可以叫用它。

  • AFT 一律會套用儲存庫主分支的程式碼,復原任何未認可的變更。

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

將 backend.tf 和 aft-providers.tf 檔案的參考新增至 .gitignore 檔案。

執行下列命令,將建立的 backend.tf aft-providers.tf 檔案新增至 .gitignore 檔案:

echo backend.tf >> .gitignore echo aft-providers.tf >>.gitignore

注意:將檔案移至.gitignore 檔案可確保不會將其遞交並推回遠端AFT儲存庫。

AWS 管理員

認可並推送程式碼變更至遠端AFT儲存庫。

  1. 若要將任何新的 Terraform 組態檔案新增至儲存庫,請執行下列命令:

    git add <filename>
  2. 若要遞交變更並將其推送至 中的遠端AFT儲存庫AWS CodeCommit,請執行下列命令:

    git commit -a git push

重要事項:您遵循此程序引入的程式碼變更,直到此點僅適用於一個 AWS 帳戶為止。

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

將變更推出 管理的所有帳戶AFT。

若要對 管理的多個AWS帳戶展開變更AFT,請遵循 AWS Control Tower 文件中的重新叫用自訂中的指示。

AWS 管理員