使用操作为 Terraform 托管的基础架构创建自动拉 AWS 取请求 GitHub - AWS 规范指引

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

使用操作为 Terraform 托管的基础架构创建自动拉 AWS 取请求 GitHub

Matt Padgett、Ashish Bhatt、Ashwin Divakaran、Sandip Gangapadhyay 和 Prafful Gupta,Amazon Web Services

Summary

此模式提供了一个自动化实用程序,旨在消除在管理跨多个 Terraform 存储库的更改时所涉及的手动重复工作。许多组织使用 Terraform 存储库来管理其基础设施即代码(IaC),通常有数百个独立存储库,分别代表不同的环境、服务或团队等待。大规模管理这些存储库是一项重大的运营挑战。诸如更新参数、升级模块版本或应用配置更改之类的例行任务通常需要每天在多个存储库中多次创建和管理拉取请求 (PRs)。

即使是简单的更改,这种重复的手动过程也非常耗时且容易出错。工程师必须始终在所有目标存储库中应用相同的更改,并制定有意义的公关标题和描述。此外,他们通常必须与 Jira 等外部工具交互才能获取或纳入问题跟踪参考。这些任务虽然必不可少,但却是无差别的繁重工作,会消耗宝贵的工程时间并降低整体效率。该工作流中缺乏自动化会造成摩擦,减慢交付速度,并增加负责维护大规模 Terraform 基础设施的团队的认知负担。

解决方案概述

为了应对这一挑战,此模式提供了一种完全由配置驱动的实用程序,从而允许用户在结构化配置文件中定义所需的更改。此文件使用明确定义的架构来指定目标存储库、模块、参数和值。

完成配置后,该实用程序将自动执行以下步骤:

  1. 读取用户定义的配置,确定更改的范围和性质

  2. 在每个目标存储库中,创建一个新分支,并应用所需的更新

  3. 为每次更改生成 PR,确保所有存储库之间的一致性

  4. 发送 Slack 通知(可选),提醒利益相关者直接链接到已创建的 PRs

通过自动执行这些重复性任务,该实用程序可显著减少与管理大规模基础设施更新相关的时间、精力和风险。这样一来,团队能够专注于更高价值的工程工作,同时有助于确保变更得到一致的应用并且可以在所有存储库中进行跟踪。

先决条件和限制

先决条件

  • 活跃 AWS 账户的.

  • Python 版本 3.8 或更高版本。

  • GitHub 个人访问令牌 (PAT)。有关更多信息,请参阅 GitHub 文档中的创建个人访问令牌(经典)

  • GitHub PAT 可以访问您的目标存储库,以便该实用程序可以执行诸如创建分支和拉取请求之类的操作。有关更多信息,请参阅此模式的 GitHub 代码存储库

限制

  • 配置复杂性是首要难题。自动化的有效性受其配置文件功能的限制。尽管该系统可以有效地处理标准更改,但复杂的基础设施修改可能需要手动干预,而且某些边缘情况仍不在自动处理的范围。

  • 安全和访问是重要的考虑因素,尤其是在管理 GitHub 访问令牌和 API 速率限制时。Organizations 必须谨慎地在自动化需求与安全的凭证存储和管理之间取得平衡,确保适当的访问控制,同时保持运营效率。

  • 验证约束形成了另一个明显的限制,因为自动化系统验证业务逻辑和特定环境要求的能力有限。复杂的依赖关系和跨服务交互通常需要人工监督,因为自动验证无法完全捕获所有上下文差异细节和业务规则。

  • 在处理大规模基础设施更改时,会出现扩缩和性能问题。系统必须在 GitHub API 限制内运行,同时管理多个存储库。在庞大的基础架构中进行资源密集型操作可能会造成性能瓶颈,因此需要精心谨慎地进行管理。

  • 集成边界限制了系统的灵活性,因为它主要是为与特定工具(如 GitHub 和 Slack)配合使用而设计的。若组织使用不同的工具,则可能需要定制解决方案,不过此模式的工作流自定义选项仅限于支持的集成点。

架构

下图显示了此解决方案的工作流和组件。

使用 GitHub 操作创建自动拉取请求的工作流程。

工作流程由以下步骤组成:

  1. 开发者通过指定 Terraform 存储库来触发 GitHub 操作。

  2. 自动化实用程序读取定义的配置。

  3. 自动化实用程序还会拉取提供的 Terraform 存储库。

  4. 自动化实用程序会创建一个新分支并在本地更新 Terraform 模板。

  5. 自动化实用程序将新分支推送到存储库并创建新 PR。

  6. 自动化实用程序使用包含 PR 链接的 Slack 通知来通知开发人员,并启用 Terraform 模板进行部署。 AWS Cloud

工具

  • GitHub是一个开发者平台,开发人员可以使用它来创建、存储、管理和共享他们的代码。

  • GitHub A@@ c tions 是一个持续集成和持续交付 (CI/CD) 平台,与 GitHub 存储库紧密集成。您可以使用 GitHub Actions 来自动执行构建、测试和部署管道。

  • HashiCorp Terraform 是一款基础设施即代码 (IaC) 工具,可帮助您创建和管理云和本地资源。

  • Salesforce 推出的 Slack 是一款人工智能驱动的对话式平台,可提供聊天和视频协作,自动执行无代码流程,并支持信息共享。

代码存储库

此模式的代码可在使用 A c GitHub tions 存储库的 GitHub 自动 Terraform 基础设施更新工作流程中找到。

最佳实践

  • 有效的更改管理对于成功实施至关重要。对于大规模更改,组织应采用逐步推进策略。保持一致的分支命名惯例和 PR 描述,并确保对所有更改进行全面的记录。

  • 必须严格实施安全控件,重点是最低权限访问原则和安全的凭证管理。启用分支保护规则,以防止未经授权的更改。定期进行安全审计,以维护系统的完整性。

  • 强大的测试协议应包括在持续集成和持续部署(CI/CD)管道中自动terraform plan执行。该协议还应包括提交前的验证检查,以及针对关键更改的专属审查环境。这种多层测试方法即有助于尽早发现问题,又能确保基础设施的稳定性。

  • 监控策略需要包括全面的警报机制、详细的 success/failure 指标跟踪以及针对失败操作的自动重试机制。该策略有助于确保运营可见性,并能够对出现的任何问题做出快速响应。

  • 配置标准应强调所有配置的版本控制,保持模块化以实现可重用性和可扩展性。清晰的架构和示例文档有助于团队有效地了解和使用自动化系统。

操作说明

Task说明所需技能

设置存储库。

要设置存储库,请运行以下命令:

# Clone the automation tool repository git clone https://github.com/aws-samples/sample-terraform-pr-automation-utility cd sample-terraform-pr-automation-utility # Copy example configuration cp config.example.yaml config.yaml
AWS DevOps

安装依赖项。

要安装和验证 Python 依赖项,请运行以下命令:

# Install Python dependencies pip3 install -r requirements.txt # Verify installation python3 -c "import github; import hcl2; import yaml; import requests; print('All packages installed successfully')"
AWS DevOps

配置令 GitHub 牌。

要配置 GitHub 令牌并验证其是否有效,请运行以下命令:

# Set GitHub token environment variable export GITHUB_TOKEN="your_github_token_here" # Verify token works curl -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/user
AWS DevOps
Task说明所需技能

设置 config.yaml 文件

要定义目标存储库和所需的更改,请按照以下方式编辑 config.yaml 文件:

repositories: - owner: "your-org" repo: "your-terraform-repo" files: - path: "variables.tf" changes: variables: - app_version: default: update: - from: ["1.0.0"] to: "1.1.0" settings: pr_title_template: "Infrastructure Update - {{timestamp}}" slack: username: "Terraform Bot" icon_emoji: ":terraform:" notify_on_success: true notify_on_error: true notify_batch_summary: true
AWS DevOps
Task说明所需技能

执行预检测试。

在生产存储库上运行配置之前,请务必先对其进行测试。使用以下命令:

# 1. Test configuration syntax python3 -c "from main import get_config_content; get_config_content()" # 2. Run in dry-run mode first DRY_RUN=true python3 main.py # 3. Test with minimal configuration # Use a simple config.yaml with just one repository and one change
AWS DevOps

验证存储库访问权限。

要验证令 GitHub 牌是否可以访问存储库,请运行以下命令:

# Test GitHub token access curl -H "Authorization: token $GITHUB_TOKEN" \ https://api.github.com/repos/owner/repo-name # Should return repository information, not 404
AWS DevOps
Task说明所需技能

使用 GitHub 操作界面运行自动化实用程序。

要使用 GitHub 操作界面运行自动化实用程序,请执行以下操作:

  1. 在上导航到您的存储库 GitHub。

  2. 选择操作选项卡。

  3. 选择 Terraform 基础设施更新自动化工作流。

  4. 选择 运行工作流

  5. 配置以下工作流输入:

    • 源配置

      • 选择自动化的目标分支。

      • 指定包含所需更改的配置文件 (config.yaml) 的路径。

    • 预览控件

      • 选择预览选项,以审查更改但不应用。

    • 分支管理

      • 输入用于创建新功能分支的基础分支。

      • 输入分支前缀配置。

      • 选中自动关闭过时的拉取请求复选框。

    • 通知设置

      • 输入您的 URL:用于富通知的 Slack webhook URL(覆盖存储库密钥)

      • 选中在处理之前测试 Slack 集成(仅限试运行)复选框。

      • 输入您的覆盖默认的 Slack 频道(例如 #infrastructure-test)。

    • 高级设置

      • 选中启用调试日志以进行问题排查复选框。

AWS DevOps

(备选)从命令行运行自动化实用程序。

如果您愿意,可以从命令行运行自动化实用程序,而不必使用 GitHub 操作界面。使用以下命令:

# Run actual automation python3 main.py
AWS DevOps
Task说明所需技能

查看已创建 PRs 和更改。

要监控工作 GitHub 流程执行的结果,请执行以下操作:

  • 检查工作流运行日志,以了解处理状态。

  • 查看自动化实用程序创建的。 PRs

  • 监控 Slack 通知(如果已配置)。

AWS DevOps
Task说明所需技能

(可选)清理 PRs。

关闭已放弃或不必要 PRs。

AWS DevOps

相关资源

AWS 规范性指导

GitHub 文档