使用 LocalStack 和 Terraform 测试来测试 AWS 基础架构 - AWS 规范指引

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

使用 LocalStack 和 Terraform 测试来测试 AWS 基础架构

Ivan Girardi 和 Ioannis Kalyvas,Amazon Web Services

Summary

此模式可帮助您在本地测试 Terraform AWS 中的基础设施即代码 (IaC),而无需在环境中配置基础架构。 AWS 它将 Terraform Tests 框架与。LocalStackD LocalStack ocker 容器提供了一个模拟各种本地开发环境。 AWS 服务这样可帮助您测试和迭代基础设施部署,而不会在 AWS 云中产生成本。

该解决方案具有以下优势:

  • 成本优化 — 运行测试 LocalStack 无需使用 AWS 服务。这样可以防止您产生与创建、操作和修改这些 AWS 资源相关的成本。

  • 速度和效率 — 本地测试通常也比部署 AWS 资源更快。这一快速反馈循环加快了开发和调试速度。由于在本地 LocalStack 运行,因此无需互联网连接即可开发和测试 Terraform 配置文件。您可以在本地调试 Terraform 配置文件并立即获得反馈,这样就简化了开发过程。

  • 一致性和可重复性 — LocalStack 为测试提供一致的环境。这种一致性有助于确保无论外部 AWS 变化或网络问题如何,测试都会产生相同的结果。

  • 隔离 — 使用测试 LocalStack 可防止意外影响实时 AWS 资源或生产环境。这一隔离使试验和测试各种配置变得安全。

  • 自动化 – 通过与持续集成和持续交付(CI/CD)管道集成,可帮助您自动测试 Terraform 配置文件。在部署之前,管道会对 IaC 进行全面测试。

  • 灵活性-您可以模拟不同的和服务配置 AWS 区域 AWS 账户,以更紧密地匹配您的生产环境。

先决条件和限制

先决条件

限制

  • 此模式为测试亚马逊简单存储服务 (Amazon S3) Simple Service AWS Lambda、 AWS Step Functions、和亚马逊 DynamoDB 资源提供了明确的示例。但是,您可以扩展此解决方案以包括其他 AWS 资源。

  • 此模式提供了在本地运行 Terraform Tests 的说明,但是您可以将测试集成到任何 CI/CD 管道中吗。

  • 此模式提供了使用 LocalStack 社区图片的说明。如果您使用的是 LocalStack Pro 镜像,请参阅 LocalStack Pro 文档

  • LocalStack 为不同 AWS APIs提供仿真服务。要获得完整列表,请参阅 AWS 服务功能覆盖范围。某些高级功能可能需要订阅 LocalStack Pro。

架构

下图显示了该解决方案的架构。主要组件是源代码存储库、 CI/CD 管道和 LocalStack Docker 容器。 LocalStack Docker 容器在 AWS 服务 本地托管以下内容:

  • 一个用于存储文件的 Amazon S3 存储桶

  • Amazon CloudWatch 用于监控和记录

  • 用于运行无服务器代码的 AWS Lambda 函数

  • 用于协调多步骤工作流程的 AWS Step Functions 状态机

  • 一个用于存储 NoSQL 数据的 Amazon DynamoDB 表

CI/CD 管道用于构建和测试 LocalStack Docker 容器和 AWS 资源。

下图显示了如下工作流:

  1. 您可以添加一个 Terraform 配置文件,并将它提交到源代码存储库中。

  2. CI/CD 管道检测更改并启动生成过程以进行静态 Terraform 代码分析。管道构建并运行 LocalStack Docker 容器。随后,此管道将启动测试过程。

  3. 管道将对象上传到 LocalStack Docker 容器中托管的 Amazon S3 存储桶。

  4. 上传对象会调用一个函数。 AWS Lambda

  5. Lambda 函数将亚马逊 S3 事件通知存储在日志中。 CloudWatch

  6. Lambda 函数启动 AWS Step Functions 状态机。

  7. 此状态机会将 Amazon S3 对象的名称写入到一个 DynamoDB 表中。

  8. CI/CD 管道中的测试过程会验证上传对象的名称是否与 DynamoDB 表中的条目相匹配。它还会验证 S3 存储桶是否已使用指定名称部署,并且该 AWS Lambda 函数已成功部署。

工具

AWS 服务

  • Amazon CloudWatch 可帮助您实时监控您的 AWS 资源和运行的应用程序 AWS 的指标。

  • Amazon DynamoDB 是一项完全托管式 NoSQL 数据库服务,可提供快速、可预测、可扩展的性能。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预调配或管理服务器。它只在需要时运行您的代码,并自动进行扩展,因此您只需为使用的计算时间付费。

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

  • AWS Step Functions是一项无服务器编排服务,可帮助您组合 AWS Lambda 功能和其他功能 AWS 服务 来构建关键业务应用程序。

其他工具

  • Docker 是一组平台即服务(PaaS)产品,它们利用操作系统级的虚拟化技术在容器中提供软件。

  • Docker Compose 是一款工具,用于定义和运行多容器应用程序。

  • LocalStack是在单个容器中运行的云服务模拟器。通过使用 LocalStack,您可以在使用的本地计算机上运行工作负载 AWS 服务,而无需连接到 AWS 云。

  • Terraform 是一款 IaC 工具 HashiCorp ,可帮助您创建和管理云和本地资源。

  • Terraform Tests 可帮助您通过类似于集成或单元测试的测试,来验证 Terraform 模块配置更新。

代码存储库

此模式的代码可在使用 LocalStack 和 Terraform Tests 存储库的 GitHub 测试 AWS 基础架构中找到。

最佳实践

  • 此解决方案测试在 Terraform 配置文件中指定的 AWS 基础架构,并且不会在中部署这些资源。 AWS 云如果您希望部署这些资源,请遵循最低权限原则(IAM 文档),并正确配置 Terraform 后端(Terraform 文档)。

  • 集成到 CI/CD 管道 LocalStack 中时,我们建议您不要在权限模式下运行 LocalStack Docker 容器。有关更多信息,请参阅运行时权限和 Linux 功能(Docker 文档)和自管理运行器的安全性(GitLab 文档)。

操作说明

Task说明所需技能

克隆存储库。

在一个 bash Shell 中,输入如下命令。这将使用以下内容克隆测试 AWS 基础架构 LocalStack 和 Terraform Te sts 存储库: GitHub

git clone https://github.com/aws-samples/localstack-terraform-test.git
DevOps 工程师

运行 LocalStack 容器。

  1. 输入以下命令,以导航到克隆的存储库:

    cd localstack-terraform-test
  2. 输入以下命令以分离模式启动 LocalStack Docker 容器:

    docker-compose up -d
  3. 等待 LocalStack Docker 容器开始运行。

DevOps 工程师

初始化 Terraform。

输入以下命令初始化 Terraform:

terraform init
DevOps 工程师

运行 Terraform Tests。

  1. 输入如下命令,以便运行 Terraform Tests:

    terraform test
  2. 确认已成功完成所有测试。此输出应当类似于如下所示:

    Success! 3 passed, 0 failed.
DevOps 工程师

清理资源。

输入以下命令销毁 LocalStack 容器:

docker-compose down
DevOps 工程师

问题排查

问题解决方案

运行 terraform test 命令时的 Error: reading DynamoDB Table Item (Files|README.md): empty 结果。

  1. 重新输入 terraform test 命令。

  2. 如果这样无法解决错误,请编辑 main.tf 文件,以便将睡眠超时时间值增大到 15 秒钟以上:

    resource "time_sleep" "wait" { create_duration = "15s" triggers = { s3_object = local.key_json } }

相关资源

附加信息

与 GitHub 操作集成

您可以使用操作在 CI/CD 管道中集成 LocalStack 和 Terraform 测试。 GitHub 有关更多信息,请参阅GitHub 操作文档。以下是 GitHub 操作配置文件示例:

name: LocalStack Terraform Test on: push: branches: - '**' workflow_dispatch: {} jobs: localstack-terraform-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build and Start LocalStack Container run: | docker compose up -d - name: Setup Terraform uses: hashicorp/setup-terraform@v3 with: terraform_version: latest - name: Run Terraform Init and Validation run: | terraform init terraform validate terraform fmt --recursive --check terraform plan terraform show - name: Run Terraform Test run: | terraform test - name: Stop and Delete LocalStack Container if: always() run: docker compose down