

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

# 使用 AWS 创建用于验证 Terraform 配置的 CI/CD 管道 CodePipeline
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline"></a>

*Aromal Raj Jayarajan 和 Vijesh Vijayakumaran Nair，Amazon Web Services*

## Summary
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-summary"></a>

此模式展示了如何使用 AWS 部署的持续集成和持续交付 (CI/CD) 管道来测试 HashiCorp Terraform 配置。 CodePipeline

Terraform 是一款命令行界面应用程序，可帮助您使用代码来配置和管理云基础设施和资源。[此模式中提供的解决方案创建了一个 CI/CD 管道，通过运行五个CodePipeline 阶段来帮助您验证 Terraform 配置的完整性：](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-stages)

1. `"checkout"`从 AWS 存储库中提取你正在测试的 Terraform 配置。 CodeCommit 

1. `"validate"`[运行基础设施即代码 (IaC) 验证工具，包括 [tfsec [TFLint](https://github.com/terraform-linters/tflint)、和 chec](https://github.com/aquasecurity/tfsec) kov。](https://www.checkov.io/)该阶段还会运行以下 Terraform IaC 验证命令：`terraform validate` 和 `terraform fmt`。

1. `"plan"` 显示如果应用 Terraform 配置，将对基础架构应用哪些更改。

1. `"apply"` 使用生成的计划在测试环境中配置所需基础架构。

1. `"destroy"` 移除在 `"apply"` 阶段中创建的测试基础架构。

## 先决条件和限制
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ AWS 命令行界面（AWS CLI），[已安装](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)并[配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)，已在本地计算机上安装并配置
+ [Terraform](https://learn.hashicorp.com/collections/terraform/aws-get-started?utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS)，已在本地计算机上安装并配置

**限制**
+ 这种模式的方法 CodePipeline 将 AWS 部署到一个 AWS 账户中，并且仅限于 AWS 区域。多账户和多区域部署需更改配置。
+ 此模式配置的 AWS Identity and Access Management (IAM) 角色 (**codepiline\_iam\_role**) 遵循最低权限的原则。必须根据您的管道需要创建的特定资源，更新此 IAM 角色的权限。 ****

**产品版本**
+ AWS CLI 版本 2.9.15 或更高版本
+ Terraform 版本 1.3.7 或更高版本

## 架构
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-architecture"></a>

**目标技术堆栈**
+ AWS CodePipeline
+ AWS CodeBuild
+ AWS CodeCommit
+ Amazon IAM
+ Amazon Simple Storage Service(Amazon S3)
+ AWS Key Management Service（AWS KMS）
+ Terraform

**目标架构**

下图显示了用于在中测试 Terraform 配置的示例 CI/CD 管道工作流程。 CodePipeline

![使用 AWS CI/CD 管道测试 Terraform 配置的架构。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/4df7b1f8-8eef-4d85-a971-a7f158be9691/images/90b931c8-e745-4b52-92de-a367fb0f1f51.png)


下图显示了如下工作流：

1. 在中 CodePipeline，AWS 用户通过在 AWS CLI 中运行`terraform apply`命令来启动 Terraform 计划中建议的操作。

1. AW CodePipeline S 担任 IAM 服务角色，其中包括访问 CodeCommit CodeBuild、AWS KMS 和 Amazon S3 所需的策略。

1. CodePipeline 运行`"checkout"`管道阶段，从 AWS CodeCommit 存储库中提取 Terraform 配置进行测试。

1. CodePipeline 通过运行 IaC 验证工具并在项目中运行 Terraform iaC 验证命令来运行测试 Terraform 配置的`"validate"`阶段。 CodeBuild 

1. CodePipeline 运行该`"plan"`阶段以基于 Terraform 配置在 CodeBuild 项目中创建计划。在将更改应用至测试环境前，AWS 用户可查看此计划。

1. Code Pi `"apply"` peline 通过使用 CodeBuild 项目在测试环境中配置所需的基础架构，来实施计划。

1. CodePipeline 运行`"destroy"`阶段，该阶段用于 CodeBuild 移除在`"apply"`阶段中创建的测试基础架构。

1. Amazon S3 存储桶存储管道项目，这些项目使用 AWS KMS [客户托管密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)进行加密和解密。

## 工具
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-tools"></a>

**工具**

*AWS 服务*
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可帮助您快速建模和配置软件发布的不同阶段，并自动执行持续发布软件变更所需的步骤。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一项完全托管的构建服务，可帮助您编译源代码、运行单元测试和生成可随时部署的项目。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一项版本控制服务，可帮助您私下存储和管理 Git 存储库，而无需管理自己的源代码控制系统。
+ [AWS Identity and Access Management (AWS IAM) ](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)通过控制验证和授权使用您 AWS 资源的用户，帮助您安全地管理对您 AWS 资源的访问。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可帮助您创建和控制加密密钥，以帮助保护您的数据。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

*其他服务*
+ [HashiCorp Terraform](https://www.terraform.io/docs) 是一款命令行界面应用程序，可帮助您使用代码来配置和管理云基础架构和资源。

**代码**

此模式的代码可在 GitHub [aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples)存储库中找到。存储库包含创建此模式所述目标架构所需 Terraform 配置。

## 操作说明
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-epics"></a>

### 配置解决方案组件
<a name="provision-the-solution-components"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆 GitHub 存储库。 | 在终端窗口中运行以下命令来克隆 GitHub[aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples)存储库：<pre>git clone https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples.git</pre><br />有关更多信息，请参阅 GitHub 文档[中的克隆存储库](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)。 | DevOps 工程师 | 
| 创建 Terraform 变量定义文件。 | 基于您的使用案例要求创建 `terraform.tfvars` 文件。您可以更新克隆存储库中 `examples/terraform.tfvars` 文件中的变量。<br />有关更多信息，请参阅 Terraform 文档中的[为根模块变量赋值](https://developer.hashicorp.com/terraform/language/values/variables#assigning-values-to-root-module-variables)。存储库的 `Readme.md` 文件包含有关所需变量的更多信息。 | DevOps 工程师 | 
| 将 AWS 配置为 Terraform 提供程序。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)有关更多信息，请参阅 Terraform 文档中的 [AWS 提供者](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)。 | DevOps 工程师 | 
| 更新用于构建 Amazon S3 复制存储桶的 Terraform 提供程序配置。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)复制支持跨 Amazon S3 存储桶自动以异步方式复制对象。 | DevOps 工程师 | 
| 初始化 Terraform 配置。 | 如要初始化包含 Terraform 配置文件的工作目录，在克隆存储库的根文件夹运行以下命令。<pre>terraform init</pre> | DevOps 工程师 | 
| 创建 Terraform 计划。 | 若要创建 Terraform 计划，请在克隆存储库的根文件夹中运行以下命令：<pre>terraform plan --var-file=terraform.tfvars -out=tfplan</pre>Terraform 会评估配置文件，以确定已声明资源的目标状态。然后，其将比较目标状态与当前状态，并创建计划。 | DevOps 工程师 | 
| 验证 Terraform 计划。 | 查看 Terraform 计划，并确认它已在您的目标 Amazon Web Services account 中配置了所需架构。 | DevOps 工程师 | 
| 部署解决方案。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)Terraform 创建、更新或销毁基础设施，以实现配置文件中声明的目标状态。 | DevOps 工程师 | 

### 通过运行管道验证 Terraform 配置
<a name="validate-terraform-configurations-by-running-the-pipeline"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置源代码存储库。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html) | DevOps 工程师 | 
| 验证管道阶段。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)有关更多信息，请参阅 *AWS CodePipeline 用户指南*中的[查看管道详情和历史记录（控制台）](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-view-console.html)。将更改提交至源存储库的主分支时，测试管道会自动激活。 | DevOps 工程师 | 
| 验证报告输出。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)在此`"validate"`阶段，该`<project_name>-validate` CodeBuild 项目会为您的代码生成漏洞报告。 | DevOps 工程师 | 

### 清除资源
<a name="clean-up-your-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 清理管道和关联资源。 | 要从您的 Amazon Web Services account 中删除测试资源，请在克隆存储库的根文件夹运行以下命令：<pre>terraform destroy --var-file=terraform.tfvars</pre> | DevOps 工程师 | 

## 问题排查
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 在`"apply"`舞台期间您会收到**AccessDenied **错误。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html) | 

## 相关资源
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-resources"></a>
+ [模块数据库](https://developer.hashicorp.com/terraform/language/modules/syntax)（Terraform 文档）
+ [ CI/CD 如何使用 Terraform 部署和配置 AWS 安全服务](https://aws.amazon.com/blogs/security/how-use-ci-cd-deploy-configure-aws-security-services-terraform/)（AWS 博客文章）
+ [使用服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html)（IAM 文档）
+ [create-pipeline](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/codepipeline/create-pipeline.html)（AWS CLI 文档）
+ [为存储在 Amazon S3 中的项目配置服务器端加密 CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/S3-artifact-encryption.html)（AWS CodePipeline 文档）
+ [AWS 配额 CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/limits.html)（AWS CodeBuild 文档）
+ [AWS 中的数据保护 CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/data-protection.html)（AWS CodePipeline 文档）

## 附加信息
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-additional"></a>

**自定义 Terraform 模块**

以下是在此模式中使用的自定义 Terraform 模块列表：
+ `codebuild_terraform`创建构成管道每个阶段的 CodeBuild 项目。
+ `codecommit_infrastructure_source_repo`捕获并创建源 CodeCommit 存储库。
+ `codepipeline_iam_role` 为管道创建所需 IAM 角色。
+ `codepipeline_kms` 为 Amazon S3 对象加密和解密创建所需 AWS KMS 密钥。
+ `codepipeline_terraform`为源 CodeCommit 存储库创建测试管道。
+ `s3_artifacts_bucket` 创建一个 Amazon S3 存储桶以管理管道项目。

**生成规范文件**

以下是此模式用于运行每个管道阶段的构建规范 (buildspec) 文件列表：
+ `buildspec_validate.yml` 运行 `"validate"` 阶段。
+ `buildspec_plan.yml` 运行 `"plan"` 阶段。
+ `buildspec_apply.yml` 运行 `"apply"` 阶段。
+ `buildspec_destroy.yml` 运行 `"destroy"`阶段。

*生成规格文件变量*

每个 buildspec 文件都使用以下变量激活不同的特定构建设置：


| 
| 
| 变量 | 默认 值 | 说明 | 
| --- |--- |--- |
| `CODE_SRC_DIR` | "." | 定义源 CodeCommit 目录 | 
| `TF_VERSION` | "1.3.7" | 为构建环境定义 Terraform 版本 | 

每个 `buildspec_validate.yml` 文件都使用以下变量激活不同的特定构建设置：


| 
| 
| 变量 | 默认 值 | 说明 | 
| --- |--- |--- |
| `SCRIPT_DIR` | "./templates/scripts" | 定义脚本目录 | 
| `ENVIRONMENT` | "dev" | 定义环境名称 | 
| `SKIPVALIDATIONFAILURE` | "Y" | 失败时跳过验证 | 
| `ENABLE_TFVALIDATE` | "Y" | 激活 Terraform 验证  | 
| `ENABLE_TFFORMAT` | "Y" | 激活 Terraform 格式 | 
| `ENABLE_TFCHECKOV` | "Y" | 激活 checkovov 扫描 | 
| `ENABLE_TFSEC` | "Y" | 激活 tfsec 扫描 | 
| `TFSEC_VERSION` | "v1.28.1" | 定义 tfsec 版本 | 