使用创建 CI/CD 管道来验证 Terraform 配置 AWS CodePipeline - AWS Prescriptive Guidance

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

使用创建 CI/CD 管道来验证 Terraform 配置 AWS CodePipeline

由 Aromal Raj Jayarajan () 和 Vijesh Vijayakumaran Nair (AWS) 创作 AWS

摘要

注意: AWS CodeCommit 不再向新客户开放。的现有客户 AWS CodeCommit 可以继续照常使用该服务。了解更多

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

Terraform 是一款命令行界面应用程序,可帮助您使用代码来配置和管理云基础设施和资源。此模式中提供的解决方案创建了一个 CI/CD 管道,通过运行五个阶段来帮助您验证 Terraform 配置的完整性:CodePipeline

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

  2. “validate”运行基础设施即代码 (IaC) 验证工具,包括 tfsec TFLint、和 chec kov。该阶段还会运行以下 Terraform IaC 验证命令:terraform validateterraform fmt

  3. “plan” 显示如果应用 Terraform 配置,将对基础架构应用哪些更改。

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

  5. “destroy” 移除在 “apply” 阶段中创建的测试基础架构。

先决条件和限制

先决条件

  • 一个活跃的AWS账户

  • AWS命令行界面 (AWSCLI),已安装配置

  • Git,已在本地计算机上安装并配置

  • Terraform,已在本地计算机上安装并配置

限制

  • 这种模式的方法仅部署AWS CodePipeline 到一个AWS账户和AWS区域。多账户和多区域部署需更改配置。

  • 此模式AWS提供的身份和访问管理 (IAM) 角色(codepipeline_iam_role)遵循最低权限原则。必须根据您的管道需要创建的特定资源来更新此IAM角色的权限。

产品版本

  • AWSCLI版本 2.9.15 或更高版本

  • Terraform 版本 1.3.7 或更高版本

架构

目标技术堆栈

  • AWS CodePipeline

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS IAM

  • Amazon Simple Storage Service(Amazon S3)

  • AWS密钥管理服务 (AWSKMS)

  • Terraform

目标架构

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

使用 CI/ AWS CD 管道测试 Terraform 配置的架构。

图表显示了以下工作流:

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

  2. AWS CodePipeline 担任的IAM服务角色包括访问 CodeCommit CodeBuildAWSKMS、和 Amazon S3 所需的策略。

  3. CodePipeline 运行“checkout”流水线阶段,从AWS CodeCommit 存储库中提取 Terraform 配置进行测试。

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

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

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

  7. CodePipeline 运行“destroy”阶段,该阶段用于 CodeBuild 移除在“apply”阶段中创建的测试基础架构。

  8. Amazon S3 存储桶存储管道项目,这些项目使用AWSKMS客户托管密钥进行加密和解密。

工具

工具

AWS 服务

  • AWS CodePipeline帮助您快速建模和配置软件发布的不同阶段,并自动执行持续发布软件更改所需的步骤。

  • AWS CodeBuild是一项完全托管的生成服务,可帮助您编译源代码、运行单元测试和生成可随时部署的工件。

  • AWS CodeCommit是一项版本控制服务,可帮助您私下存储和管理 Git 存储库,而无需管理自己的源代码控制系统。

  • AWSIdentity and Access Management (IAM) 通过控制谁经过身份验证并有权使用AWS资源,从而帮助您安全地管理对资源的访问权限。

  • AWS密钥管理服务 (AWSKMS) 可帮助您创建和控制加密密钥,以帮助保护您的数据。

  • Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

其他服务

  • HashiCorp Terraform 是一款命令行界面应用程序,可帮助您使用代码来配置和管理云基础架构和资源。

代码

此模式的代码可在 GitHub aws-codepipeline-terraform-cicdsamples存储库中找到。存储库包含创建此模式所述目标架构所需 Terraform 配置。

操作说明

任务描述所需技能

克隆 GitHub 存储库。

在终端窗口中运行以下命令来克隆 GitHubaws-codepipeline-terraform-cicdsamples存储库:

git clone https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples.git

有关更多信息,请参阅 GitHub 文档中的克隆存储库

DevOps 工程师

创建 Terraform 变量定义文件。

基于您的使用案例要求创建 terraform.tfvars 文件。您可以更新克隆存储库中 examples/terraform.tfvars 文件中的变量。

有关更多信息,请参阅 Terraform 文档中的为根模块变量赋值

注意

存储库Readme.md的文件包含有关所需变量的更多信息。

DevOps 工程师

配置AWS为 Terraform 提供者。

  1. 在代码编辑器中,打开克隆存储库的 main.tf 文件。

  2. 添加必要的配置以建立与目标AWS账户的连接。

有关更多信息,请参阅 Terraform 文档中的AWS提供者

DevOps 工程师

更新用于构建 Amazon S3 复制存储桶的 Terraform 提供程序配置。

  1. 通过运行以下命令打开存储库的 S3 目录:

    cd ./modules/s3
  2. 通过更新 tf 文件中的 region 值,更新用于创建 Amazon S3 复制存储桶的 Terraform 提供程序配置。确保您输入您希望 Amazon S3 将对象复制到的目标区域。

  3. (可选)默认情况下,Terraform 使用本地状态文件进行状态管理。若要将 Amazon S3 添加为远程后端,则必须更新 Terraform 配置。有关更多信息,请参阅 Terraform 文档中的后端配置

注意

复制可以激活在 Amazon S3 存储桶之间自动异步复制对象。

DevOps 工程师

初始化 Terraform 配置。

如要初始化包含 Terraform 配置文件的工作目录,在克隆存储库的根文件夹运行以下命令。

terraform init
DevOps 工程师

创建 Terraform 计划。

若要创建 Terraform 计划,请在克隆存储库的根文件夹中运行以下命令:

terraform plan --var-file=terraform.tfvars -out=tfplan
注意

Terraform 会评估配置文件,以确定已声明资源的目标状态。然后,其将比较目标状态与当前状态,并创建计划。

DevOps 工程师

验证 Terraform 计划。

查看 Terraform 计划并确认它已在您的目标账户中配置了所需的架构。AWS

DevOps 工程师

部署解决方案。

  1. 若要应用 Terraform 计划,请在克隆存储库的根文件夹中运行以下命令:

    terraform apply "tfplan"
  2. 输入,以确认您要部署资源。

注意

Terraform 创建、更新或销毁基础设施,以实现配置文件中声明的目标状态。

DevOps 工程师
任务描述所需技能

设置源代码存储库。

  1. 从 Terraform 输出中,获取包含要验证的 Terraform 配置的存储库的源存储库详细信息。

  2. 登录 AWS 管理控制台。然后,打开CodeCommit 控制台

  3. 在名为 main 的源存储库中创建一个新的分支。有关说明,请参阅 CodeCommit 文档AWS CodeCommit中的创建分支

  4. 源存储库main 分支克隆至您的本地工作站。有关说明,请参阅 CodeCommit 文档中的使用AWSCLI凭据助手在 Windows 上HTTPS连接AWS CodeCommit 存储库的安装步骤

  5. 通过运行以下命令从 GitHubaws-codepipeline-terraform-cicdsamples存储库中复制templates文件夹:

    cp -r templates $YOUR_CODECOMMIT_REPO_ROOT
    注意

    templates文件夹包含编译规范文件和源存储库根目录的验证脚本。

  6. 将所需 Terraform IaC 配置添加至源存储库的根文件夹。

  7. 在项目的 Terraform 配置中添加远程后端详细信息。有关更多信息,请参阅 Terraform 文档中的 S3

  8. (可选)更新 templates 文件夹中的变量,以激活或停用预配置的扫描、工具更改版本,并在自定义脚本文件中指定您的目录。有关更多信息,请参阅此模式的其他信息部分。

  9. 将更改推送至源存储库main 分支。

DevOps 工程师

验证管道阶段。

  1. 登录 AWS 管理控制台,打开 CodePipeline 控制台

  2. 在上一节 Epic 部分的terraform apply "tfplan"命令生成的输出中,找到生成的名称CodePipeline

  3. 在 CodePipeline 控制台中打开管道,然后选择 “发布更改”。

  4. 查看每个管道阶段,并确认其按预期运行。

有关更多信息,请参阅《AWS CodePipeline 用户指南》中的查看管道详细信息和历史记录(控制台)

重要

将更改提交到源存储库的主分支时,测试管道会自动激活。

DevOps 工程师

验证报告输出。

  1. CodePipeline 控制台的左侧导航窗格中,选择 B uild。然后,选择报告历史记录

  2. 查看管道生成的 tfsec 与 checkov 扫描报告。这些报告可帮助您通过可视化和图形形式来识别问题。

注意

在此“validate”阶段,该<project_name>-validate CodeBuild 项目会为您的代码生成漏洞报告。

DevOps 工程师
任务描述所需技能

清理管道和关联资源。

要从您的AWS账户中删除测试资源,请在克隆存储库的根文件夹中运行以下命令:

terraform destroy --var-file=terraform.tfvars
DevOps 工程师

故障排除

事务解决方案

“apply”舞台期间您会收到AccessDenied 错误。

  1. 查看与该“apply”阶段关联的 CodeBuild 项目的执行日志,找出任何缺少的IAM权限。有关更多信息,请参阅《AWS CodeBuild 用户指南》AWS CodeBuild中的 “查看版本详情”。

  2. 在代码编辑器中,打开克隆存储库 modules 文件夹。然后,导航到 iam-role 文件夹并打开该文件夹中的 main.tf 文件。

  3. codepipeline_policy声明中,添加在您的AWS账户中配置资源所需的IAM策略。

相关资源

其他信息

自定义 Terraform 模块

以下是在此模式中使用的自定义 Terraform 模块列表:

  • codebuild_terraform创建构成管道每个阶段的 CodeBuild 项目。

  • codecommit_infrastructure_source_repo捕获并创建源 CodeCommit 存储库。

  • codepipeline_iam_role为管道创建所需的IAM角色。

  • codepipeline_kms创建 Amazon S3 对象加密和解密所需的密AWSKMS钥。

  • 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 版本