本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用引导管道实现 Terraform (AFT) 的 Account Factory
由 Vinicius Elias (AWS) 和 Edgar Costa Filho () 创作 AWS
摘要
注意: AWS CodeCommit 已不再向新客户开放。的现有客户 AWS CodeCommit 可以继续照常使用该服务。了解更多
此模式为从的管理 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 最佳实践,确保部署过程不仅高效,而且符合安全和治理标准,从而为AFT在您的 AWS 环境中部署提供一种全面、安全和高效的方式。
有关 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
Amazon EventBridge
IAM
AWS Lambda
Amazon S3
目标架构
下图说明了这种模式中讨论的实现。
该工作流程包括三个主要任务:创建资源、生成内容和运行管道。
创建资源
此模式提供的CloudFormation 模板
用于 CodeCommit 存储 AFT Terraform 引导程序代码的存储库
一个 S3 存储桶,用于存储与实现关联的 Terraform 状态文件 AFT
一条 CodePipeline 管道
两个 CodeBuild 项目用于实施 Terraform 计划并在管道的不同阶段应用命令
IAM角色 CodeBuild 和 CodePipeline 服务
第二个 S3 存储桶,用于存储管道运行时工件
捕获
main
分支上 CodeCommit 仓库变更的 EventBridge 规则EventBridge 规则的另一个IAM角色
此外,如果您将 CloudFormation 模板中的Generate AFT Files
参数设置为true
,则模板会创建以下额外资源来生成内容:
一个 S3 存储桶,用于存储生成的内容并用作 CodeCommit 存储库的来源
一个 Lambda 函数,用于处理给定参数并生成相应内容
用于运行 Lambda IAM 函数的函数
部署模板时运行 Lambda 函数的 CloudFormation 自定义资源
生成内容
为了生成AFT引导文件及其内容,该解决方案使用 Lambda 函数和 S3 存储桶。该函数在存储桶中创建一个文件夹,然后在该文件夹中创建两个文件:main.tf
和backend.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
分支的来源,自动填充存储库。
运行管道
创建资源并配置引导程序文件后,管道将运行。第一阶段(S ou rce)从存储库的主分支获取源代码,第二阶段(构建)运行 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服务集成。
其他工具
代码存储库
此模式的代码可在 GitHub AFT引导流管道存储库
有关官方AFT存储库,请参阅中的 Terraform 的 Cont AWS rol Tower Account Factory
最佳实践
使用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管理账户。 | 使用 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 步:创建新堆栈
步骤 3:配置堆栈参数
第 4 步:决定文件生成
第 5 步:填写 AWS Control Tower 和AFT账户详情
步骤 6:配置AFT选项
步骤 7:指定版本
第 8 步:查看并创建堆栈
步骤 9:监控堆栈创建
步骤 10:验证部署
| 云管理员 |
任务 | 描述 | 所需技能 |
---|---|---|
填充AFT引导存储库。 | (可选)部署 CloudFormation 模板后,您可以填充或验证新创建的AFT引导存储库中的内容,并测试管道是否已成功运行。 如果将 步骤 1:填充存储库
第 2 步:提交并推送您的更改
| 云管理员 |
验证引AFT导管道。 | 步骤 1:查看管道
第 2 步:批准 Terraform 计划结果
步骤 3:等待部署
步骤 4:检查已创建的资源
| 云管理员 |
故障排除
事务 | 解决方案 |
---|---|
CloudFormation 模板中包含的自定义 Lambda 函数在部署期间失败。 | 查看 Amazon CloudWatch 日志中是否有 Lambda 函数以识别错误。这些日志提供了详细信息,可以帮助查明具体问题。确认 Lambda 函数具有必要的权限并且环境变量设置正确。 |
由于权限不足,您在创建或管理资源时会遇到故障。 | 查看附加到 Lambda 函数的IAM角色和策略以及 CodeBuild部署中涉及的其他服务。确认他们拥有必要的权限。如果存在权限问题,请调整IAM策略以授予所需的访问权限。 |
您使用的 CloudFormation 模板版本已过时,且版本较新 AWS 服务 或 Terraform。 | 定期更新 CloudFormation 模板以使其与最新版本 AWS 和 Terraform 版本兼容。请查看发行说明或文档,了解任何特定于版本的更改或要求。 |
您将在部署期间达到 AWS 服务 配额。 | 在部署管道之前,请检查 S3 存储桶、IAM角色和 Lambda 函数等资源的 AWS 服务 配额。如有必要,请求会增加。有关更多信息,请参阅 AWS 网站上的AWS 服务 配额。 |
由于 CloudFormation 模板中的输入参数不正确,您会遇到错误。 | 仔细检查所有输入参数是否有错别字或值不正确。确认资源标识符(例如账户IDs和区域名称)准确无误。 |
相关资源
要成功实现此模式,请查看以下资源。这些资源提供了额外的信息和指导,这些信息和指导对于AFT通过使用进行设置和管理非常有用 AWS CloudFormation。
AWS文档:
AWS Control Tower 《用户指南》提供了有关设置和管理的详细信息 AWS Control Tower。
AWS CloudFormation 文档提供了对 CloudFormation 模板、堆栈和资源管理的见解。
IAM政策和最佳实践:
中的安全最佳实践IAM解释了如何使用IAM角色和策略来帮助保护 AWS 资源。
Terraform 开启: AWS
Terraform P AWS rovider 文档
提供了有关将 Terraform 与配合使用的全面信息。 AWS
AWS 服务 配额:
AWS 服务 q@@ u otas 提供有关如何查看 AWS 服务 配额以及如何请求增加配额的信息。