在本機驗證地形表單 (AFT) 程式碼的 Account Factory - AWS 方案指引

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

在本機驗證地形表單 (AFT) 程式碼的 Account Factory

由亞歷山大流行(AWS)和米哈爾·戈爾尼亞克(AWS)創建

環境:生產

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

工作負載:開源

AWS 服務:AWS Control Tower

Summary

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

在程式碼開發期間,在 AFT 管線之外,在本機測試 Terraform 基礎結構做為程式碼 (IaC) 會很有幫助。此模式顯示了如何執行以下操作:

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

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

此程序也可以用來執行不屬於一般 AFT 管線一部分的 Terraform 命令。例如,您可以使用此方法執行命令terraform validate,例如terraform planterraform destroy、和terraform import

先決條件和限制

先決條件

限制

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

  • 在此程序期間本機產生的輸出不會儲存在 AFT 管線執行階段記錄中。

架構

目標技術堆疊

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

  • 地形

  • Git

  • AWS CLI 第 2 版

自動化和規模

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

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

工具

AWS 服務

其他服務

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

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

Code

以下是一個可用於本地運行由 AFT 管理的 Terraform 代碼的示例 bash 腳本。若要使用指令碼,請遵循此模式「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 管理員

使範例程式碼可執行。

執行下列其中一個動作,開啟終端機視窗並在 AWS AFT 管理帳戶中進行驗證:

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

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

注意:您的組織可能也有自訂工具,可為 AWS 環境提供身份驗證登入資料。

AWS 管理員

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

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

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

    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 管道在本地運行需要在此史詩中創建的後端 .tf 和後提供程序 .tf 配置文件。這些檔案會在雲端式 AFT 管線中自動建立,但必須手動建立,管線才能在本機執行。在本機執行 AFT 管道需要一組檔案,代表在單一 AWS 帳戶內執行管道。

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

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

  3. 選擇 ##########-定制管道。(########### 是您用來在本機執行 Terraform 程式碼的 AWS 帳戶識別碼)。

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

  5. 選擇最新的執行階段以顯示其詳細資料。

  6. 在「應用-AFT-全局-自定義」部分中,找到「應用-地形」階段。

  7. 選取「應用程式-地形」階段的「詳細資訊」區段。

  8. 尋找「應用程式-地形」階段的執行階段記錄。

  9. 在運行時日誌中,查找以下行開頭和結尾的部分:「\ n\ n aft-Providers.tf...」\ n\ n 後端 .tf」 

  10. 複製這兩個標籤之間的輸出,並將其另存為本地 Terraform 文件夾(終端會話的當前工作目錄)aft-providers.tf中命名的本地文件。

    示例 auto 生成的提供程序 .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 backup.tf」 

  12. 複製這兩個標籤之間的輸出,並將其另存為本地 Terraform 文件夾(終端會話的當前工作目錄)tf中命名的本地文件。

自動生成的後端 .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-account-customizations存儲aft-global-customizations庫和存儲庫中。請確定您從相同的執行階段清單產生這兩個檔案。

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

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

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

    cd aft-global-customizations/terraform

    注意:文件backend.tfaft-providers.tf位於此目錄中。該目錄還包含來自存儲庫的地形文件aft-global-customizations

  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 管理員
任務描述所需技能

將後端 .tf 和後端提供者 .tf 檔案的參考資料新增到 .gitignore 檔案中。

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

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

注意:將文件移動到文.gitignore件可確保它們不會被提交並推回遠程 AFT 存儲庫。

AWS 管理員

將您的代碼更改提交並推送到遠程 AFT 存儲庫。

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

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

    git commit -a git push

重要事項:您遵循此程序所引入的程式碼變更,直到此時間僅套用至一個 AWS 帳戶為止。

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

對 AFT 管理的所有帳戶推出更改。

若要對 AFT 管理的多個 AWS 帳戶進行變更,請按照 AWS Control Tower 文件中重新叫用自訂項目中的指示進行操作。

AWS 管理員