使用引导管道实现 Account Factory for Terraform (AFT) - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用引导管道实现 Account Factory for Terraform (AFT)

由 Vinicius Elias (AWS) 和 Edgar Costa Filho (AWS) 创作

代码存储库:aft-bootstrap-pipeline

环境:生产

技术:管理和治理;基础架构

工作负载:开源

AWS 服务:AWS CodeBuild;AWS;AWS CodeCommit;AWS Control Tower CodePipeline;AWS Organizations

Summary

此模式为从的管理 AWS Control Tower 账户部署 Account Factory for Terraform (AFT) 提供了一种简单而安全的方法。 AWS Organizations该解决方案的核心是一个 AWS CloudFormation 模板,该模板通过创建Terraform管道来自动执行AFT配置,该管道的结构易于适应初始部署或后续更新。

安全和数据完整性是重中之重 AWS,因此,Terraform状态文件是跟踪托管基础设施和配置状态的关键组件,可以安全地存储在亚马逊简单存储服务 (Amazon S3) Simple Service 存储桶中。此存储桶配置了多种安全措施,包括服务器端加密和阻止公共访问的策略,以帮助确保您的 Terraform 状态免受未经授权的访问和数据泄露的侵害。

管理账户负责协调和监督整个环境,因此它是中的关键资源。 AWS Control Tower这种模式遵循 AWS 最佳实践,确保部署过程不仅高效,而且符合安全和治理标准,从而为在您的 AWS 环境中部署 AFT 提供了一种全面、安全和高效的方式。

有关 AFT 的更多信息,请参阅AWS Control Tower 文档

先决条件和限制

先决条件

  • 基本的 AWS 多账户环境,至少包含以下账户:管理账户、日志存档账户、审计账户,以及一个用于 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

  • 亚马逊 EventBridge

  • IAM

  • AWS Lambda

  • Amazon S3

目标架构

下图说明了这种模式中讨论的实现。

使用引导流水线实现 AFT 的工作流程

该工作流程包括三个主要任务:创建资源、生成内容和运行管道。

创建资源

此模式提供的CloudFormation 模板将创建和设置所有必需的资源,具体取决于您在部署模板时选择的参数。该模板至少会创建以下资源:

  • 用于 CodeCommit 存储 AFT Terraform 引导程序代码的存储库

  • 一个 S3 存储桶,用于存储与 AFT 实现关联的 Terraform 状态文件

  • 一条 CodePipeline 管道

  • 两个 CodeBuild 项目用于实施 Terraform 计划并在管道的不同阶段应用命令

  • CodeBuild 和 CodePipeline 服务的 IAM 角色

  • 第二个 S3 存储桶,用于存储管道运行时工件

  • 捕获main分支上 CodeCommit 仓库变更的 EventBridge 规则

  • 该 EventBridge 规则的另一个 IAM 角色

此外,如果您将 CloudFormation 模板中的Generate AFT Files参数设置为true,则模板会创建以下额外资源来生成内容:

  • 一个 S3 存储桶,用于存储生成的内容并用作 CodeCommit 存储库的来源

  • 一个 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 资源。

工具

Amazon Web Services

  • 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 bootstrap 管道存储库中找到。

有关官方 AFT 存储库,请参阅中的 T erraform 版 AWS Control Tower Account Factory。 GitHub

最佳实践

使用提供的 CloudFormation 模板部署 AFT 时,我们建议您遵循最佳实践,以帮助确保安全、高效和成功的实施。实施和运营 AFT 的主要指导方针和建议包括以下内容。

  • 全面审查参数:仔细检查并理解 CloudFormation 模板中的每个参数。准确的参数配置对于 AFT 的正确设置和运行至关重要。

  • 定期更新模板:使用最新 AWS 功能和 Terraform 版本更新模板。定期更新可帮助您利用新功能并维护安全性。

  • 版本控制:固定您的 AFT 模块版本,并在可能的情况下使用单独的 AFT 部署进行测试。

  • 范围:仅使用 AFT 来部署基础设施护栏和定制。请勿使用它来部署应用程序。

  • Linting 和验证:AFT 管道需要经过精心设计和验证的 Terraform 配置。在将配置推送到 AFT 存储库之前,运行 lint、验证和测试。

  • Terraform 模块:将可重复使用的 Terraform 代码构建为模块,并始终指定 Terraform 和 AWS 提供者版本以满足组织的要求。

操作说明

任务描述所需技能

准备 AWS Control Tower 环境。

在您的环境 AWS Control Tower 中进行设置和配置,以确保对您的 AWS 环境进行集中管理和治理 AWS 账户。有关更多信息,请参阅 AWS Control Tower 文档 AWS Control Tower中的入门

云管理员

启动 AFT 管理账户。

使用 Ac AWS Control Tower count Factory 启动一个新的 AWS 账户 账户作为你的 AFT 管理账户。有关更多信息,请参阅 AWS Control Tower 文档中的使用 A ccount AWS Service Catalog 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:中的日志存档账户 ID 的 ID AWS Control Tower。

    • Audit Account ID:中审计账户的 ID AWS Control Tower。

    • AFT Management Account ID: 您在第一部长篇故事中创建的 AFT 管理账户的 ID。

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

步骤 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 文档中的 E AWS nterprise Support 计划

    • Enable AFT Delete Default VPC:仅删除 AFT 管理账户中的所有 VPC。有关更多信息,请参阅 AWS Control Tower 文档中的删除 AWS 默认 VPC

步骤 7:指定版本

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

  • AFT Version:定义要部署的 AFT 版本。保留默认设置 (latest) 以使用最新的 AFT 版本。

步骤 8:查看并创建堆栈

  • 查看所有参数和设置。如果一切正常,请继续创建堆栈。

步骤 9:监控堆栈创建

  • AWS CloudFormation 置备和配置您定义的资源。在 CloudFormation 控制台上监控堆栈创建过程。此过程可能需要几分钟。

步骤 10:验证部署

  • 当堆栈状态显示为 CREATE_COMPLET E 时,请确认所有资源均已正确创建。

  • 在 “输出” 部分中,记下该TerraformBackendBucketName值。

云管理员
任务描述所需技能

填充 AFT 引导存储库。

(可选)部署 CloudFormation 模板后,您可以填充或验证新创建的 AFT 引导存储库中的内容,并测试管道是否已成功运行。

如果将Generate AFT Files参数设置为true,请跳至下一个故事(验证管道)。

步骤 1:填充存储库

  1. 打开AWS CodeCommit 控制台并选择新创建的存储库。如果您保留默认名称,则会调用存储库aft-setup

  2. 使用 SSH、HTTPS 或 HTTPS (GRC) 将存储库克隆到本地计算机,然后在编辑器中将其打开。

  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 存储库中的自述文件

第 2 步:提交并推送您的更改

  • 创建并填充文件夹和文件后,确认所做的更改,然后将代码上传到存储库。管道会自动启动,贯穿源代码和构建阶段,然后在部署阶段之前等待批准操作。

云管理员

验证 AFT 引导管道。

步骤 1:查看管道

  • 打开CodePipeline 控制台并检查aft-bootstrap-pipeline管道是否已成功启动。它应该在运行 Terraform 计划或等待手动批准操作。

第 2 步:批准 Terraform 计划结果

  • 您可以通过查看构建阶段的执行日志来查看 Terraform 计划的结果,然后在批准阶段批准或拒绝执行。如果您批准,管道将开始在提供的 AFT 管理账户中部署 AFT 资源。

步骤 3:等待部署

  • 等待管道成功运行。这大约需要30分钟。您可能遇到的任何故障通常都是由 API 配额造成的。在这些情况下,您可以重新运行管道以继续部署。

步骤 4:检查已创建的资源

  • 访问 AFT 管理账户并确认资源已创建。

云管理员

故障排除

问题解决方案

CloudFormation 模板中包含的自定义 Lambda 函数在部署期间失败。

检查亚马逊 CloudWatch 日志中是否有 Lambda 函数以识别错误。这些日志提供了详细信息,可以帮助查明具体问题。确认 Lambda 函数具有必要的权限并且环境变量设置正确。

由于权限不足,您在创建或管理资源时会遇到故障。

查看附加到 Lambda 函数的 IAM 角色和策略以及部署中涉及的其他服务。 CodeBuild确认他们拥有必要的权限。如果存在权限问题,请调整 IAM 策略以授予所需的访问权限。

您使用的 CloudFormation 模板版本已过时,且版本较新 AWS 服务 或 Terraform。

定期更新 CloudFormation 模板以使其与最新版本 AWS 和 Terraform 版本兼容。请查看发行说明或文档,了解任何特定版本的更改或要求。

您在部署期间达到 AWS 服务 配额。

在部署管道之前,请检查 S3 存储桶、IAM 角色和 Lambda 函数等资源的 AWS 服务 配额。如有必要,请求会增加。有关更多信息,请参阅 AWS 网站上的AWS 服务 配额

由于 CloudFormation 模板中的输入参数不正确,您会遇到错误。

仔细检查所有输入参数是否有错别字或错误值。确认资源标识符(例如账户 ID 和区域名称)准确无误。

相关资源

要成功实现此模式,请查看以下资源。这些资源提供了额外的信息和指导,对于通过使用来设置和管理AFT可能非常宝贵 AWS CloudFormation。

AWS文档:

IAM 政策和最佳实践:

Terraform 开启: AWS

AWS 服务 配额:

  • AWS 服务 q@@ u otas 提供有关如何查看 AWS 服务 配额以及如何请求增加配额的信息。