

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

# 使用操作为 Terraform 托管的基础架构创建自动拉 AWS 取请求 GitHub
<a name="create-automated-pull-requests-for-terraform-managed-aws-infrastructure"></a>

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

## Summary
<a name="create-automated-pull-requests-for-terraform-managed-aws-infrastructure-summary"></a>

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

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

**解决方案概述**

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

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

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

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

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

1. **发送 Slack 通知**（可选），提醒利益相关者直接链接到已创建的 PRs

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

## 先决条件和限制
<a name="create-automated-pull-requests-for-terraform-managed-aws-infrastructure-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ Python 版本 3.8 或更高版本。
+  GitHub 个人访问令牌 (PAT)。有关更多信息，请参阅 GitHub 文档中的[创建个人访问令牌（经典）](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic)。
+  GitHub PAT 可以访问您的目标存储库，以便该实用程序可以执行诸如创建分支和拉取请求之类的操作。有关更多信息，请参阅此模式的 GitHub [代码存储库](https://github.com/aws-samples/sample-terraform-pr-automation-utility?tab=readme-ov-file#repository-access-verification)。

**限制**
+ **配置复杂性**是首要难题。自动化的有效性受其配置文件功能的限制。尽管该系统可以有效地处理标准更改，但复杂的基础设施修改可能需要手动干预，而且某些边缘情况仍不在自动处理的范围。
+ **安全和访问**是重要的考虑因素，尤其是在管理 GitHub 访问令牌和 API 速率限制时。Organizations 必须谨慎地在自动化需求与安全的凭证存储和管理之间取得平衡，确保适当的访问控制，同时保持运营效率。
+ **验证约束**形成了另一个明显的限制，因为自动化系统验证业务逻辑和特定环境要求的能力有限。复杂的依赖关系和跨服务交互通常需要人工监督，因为自动验证无法完全捕获所有上下文差异细节和业务规则。
+ 在处理大规模基础设施更改时，会出现**扩缩和性能**问题。系统必须在 GitHub API 限制内运行，同时管理多个存储库。在庞大的基础架构中进行资源密集型操作可能会造成性能瓶颈，因此需要精心谨慎地进行管理。
+ **集成边界**限制了系统的灵活性，因为它主要是为与特定工具（如 GitHub 和 Slack）配合使用而设计的。若组织使用不同的工具，则可能需要定制解决方案，不过此模式的工作流自定义选项仅限于支持的集成点。

## 架构
<a name="create-automated-pull-requests-for-terraform-managed-aws-infrastructure-architecture"></a>

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

![使用 GitHub 操作创建自动拉取请求的工作流程。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/e211359a-03b1-4e69-b152-eb7c09bdb01a/images/6cee0660-5b44-4abe-970c-c0a3c830a9aa.png)


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

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

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

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

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

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

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

## 工具
<a name="create-automated-pull-requests-for-terraform-managed-aws-infrastructure-tools"></a>
+ [GitHub](https://docs.github.com/)是一个开发者平台，开发人员可以使用它来创建、存储、管理和共享他们的代码。
+ GitHub A@@ [c](https://docs.github.com/en/actions) tions 是一个持续集成和持续交付 (CI/CD) 平台，与 GitHub 存储库紧密集成。您可以使用 GitHub Actions 来自动执行构建、测试和部署管道。
+ [HashiCorp Terraform](https://www.terraform.io/) 是一款基础设施即代码 (IaC) 工具，可帮助您创建和管理云和本地资源。
+ Salesforce 推出的 [Slack](https://slack.com/help/articles/115004071768-What-is-Slack-) 是一款人工智能驱动的对话式平台，可提供聊天和视频协作，自动执行无代码流程，并支持信息共享。

**代码存储库**

此模式的代码可在使用 A [c GitHub tions 存储库的 GitHub 自动 Terraform 基础设施更新工作流程](https://github.com/aws-samples/sample-terraform-pr-automation-utility?tab=readme-ov-file)中找到。

## 最佳实践
<a name="create-automated-pull-requests-for-terraform-managed-aws-infrastructure-best-practices"></a>
+ 有效的**更改管理**对于成功实施至关重要。对于大规模更改，组织应采用逐步推进策略。保持一致的分支命名惯例和 PR 描述，并确保对所有更改进行全面的记录。
+ 必须严格实施**安全控件**，重点是最低权限访问原则和安全的凭证管理。启用分支保护规则，以防止未经授权的更改。定期进行安全审计，以维护系统的完整性。
+ 强大的**测试协议**应包括在持续集成和持续部署（CI/CD）管道中自动`terraform plan`执行。该协议还应包括提交前的验证检查，以及针对关键更改的专属审查环境。这种多层测试方法即有助于尽早发现问题，又能确保基础设施的稳定性。
+ **监控策略**需要包括全面的警报机制、详细的 success/failure 指标跟踪以及针对失败操作的自动重试机制。该策略有助于确保运营可见性，并能够对出现的任何问题做出快速响应。
+ **配置标准**应强调所有配置的版本控制，保持模块化以实现可重用性和可扩展性。清晰的架构和示例文档有助于团队有效地了解和使用自动化系统。

## 操作说明
<a name="create-automated-pull-requests-for-terraform-managed-aws-infrastructure-epics"></a>

### 安装和设置
<a name="installation-and-setup"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置存储库。 | 要设置存储库，请运行以下命令：<pre># Clone the automation tool repository<br />git clone https://github.com/aws-samples/sample-terraform-pr-automation-utility<br />cd sample-terraform-pr-automation-utility<br /><br /># Copy example configuration<br />cp config.example.yaml config.yaml<br /></pre> | AWS DevOps | 
| 安装依赖项。 | 要安装和验证 Python 依赖项，请运行以下命令：<pre># Install Python dependencies<br />pip3 install -r requirements.txt<br /><br /># Verify installation<br />python3 -c "import github; import hcl2; import yaml; import requests; print('All packages installed successfully')"<br /></pre> | AWS DevOps | 
| 配置令 GitHub 牌。 | 要配置 GitHub 令牌并验证其是否有效，请运行以下命令：<pre># Set GitHub token environment variable<br />export GITHUB_TOKEN="your_github_token_here"<br /><br /># Verify token works<br />curl -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/user<br /></pre> | AWS DevOps | 

### 为 Terraform 更改设置配置文件
<a name="set-up-configuration-file-for-terraform-changes"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置 `config.yaml` 文件 | 要定义目标存储库和所需的更改，请按照以下方式编辑 `config.yam`l 文件：<pre>repositories:<br />  - owner: "your-org"<br />    repo: "your-terraform-repo"<br />    files:<br />      - path: "variables.tf"<br />        changes:<br />          variables:<br />            - app_version:<br />                default:<br />                  update:<br />                    - from: ["1.0.0"]<br />                      to: "1.1.0"<br /><br />settings:<br />  pr_title_template: "Infrastructure Update - {{timestamp}}"<br />  slack:<br />    username: "Terraform Bot"<br />    icon_emoji: ":terraform:"<br />    notify_on_success: true<br />    notify_on_error: true<br />    notify_batch_summary: true<br /></pre> | AWS DevOps | 

### 测试和评估
<a name="test-and-validate"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 执行预检测试。 | 在生产存储库上运行配置之前，请务必先对其进行测试。使用以下命令：<pre># 1. Test configuration syntax<br />python3 -c "from main import get_config_content; get_config_content()"<br /><br /># 2. Run in dry-run mode first<br />DRY_RUN=true python3 main.py<br /><br /># 3. Test with minimal configuration<br /># Use a simple config.yaml with just one repository and one change</pre> | AWS DevOps | 
| 验证存储库访问权限。 | 要验证令 GitHub 牌是否可以访问存储库，请运行以下命令：<pre># Test GitHub token access<br />curl -H "Authorization: token $GITHUB_TOKEN" \<br />  https://api.github.com/repos/owner/repo-name<br /><br /># Should return repository information, not 404</pre> | AWS DevOps | 

### 运行自动化实用程序
<a name="run-the-automation-utility"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 GitHub 操作界面运行自动化实用程序。 | 要使用 GitHub 操作界面运行自动化实用程序，请执行以下操作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-automated-pull-requests-for-terraform-managed-aws-infrastructure.html) | AWS DevOps | 
| （备选）从命令行运行自动化实用程序。 | 如果您愿意，可以从命令行运行自动化实用程序，而不必使用 GitHub 操作界面。使用以下命令：<pre># Run actual automation<br />python3 main.py</pre> | AWS DevOps | 

### 验证 PRs 和更改
<a name="validate-prs-and-changes"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 查看已创建 PRs 和更改。 | 要监控工作 GitHub 流程执行的结果，请执行以下操作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-automated-pull-requests-for-terraform-managed-aws-infrastructure.html) | AWS DevOps | 

### 清理
<a name="clean-up"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| （可选）清理 PRs。 | 关闭已放弃或不必要 PRs。 | AWS DevOps | 

## 相关资源
<a name="create-automated-pull-requests-for-terraform-managed-aws-infrastructure-resources"></a>

**AWS 规范性指导**
+ [使用 Terraform 作为 IaC 的工具 AWS Cloud](https://docs.aws.amazon.com/prescriptive-guidance/latest/choose-iac-tool/terraform.html)

**GitHub 文档**
+ [关于拉取请求](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests)
+ [管理您的个人访问令牌](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)
+ [了解 GitHub 动作](https://docs.github.com/en/actions/get-started/understand-github-actions)
+ [操作快速入 GitHub 门](https://docs.github.com/en/actions/get-started/quickstart)