unit-testing - Terratest - 使用模拟 AWS 服务

标签 unit-testing terraform terraform-provider-aws localstack terratest

我正在尝试通过 Terraform 进行 AWS 资源配置,并计划拥有一个 CICD 管道,其中包含用于 Terraform 代码的 terratest 单元测试用例。我的问题是我的基础设施中有 CloudFront,创建和删除大约需要 20 分钟。我不希望 CI 构建花费大约 45 分钟来运行单元测试用例。

我遇到了 localstack 来模拟 AWS 环境,但没有找到将 terratest 指向 localstack 资源的方法。这是我试过的

  • 创建了一个 localstack docker 容器
  • 将 terraform 配置为指向 localstack - 在提供程序部分添加了端点 url。
  • 应用了 terraform 配置并验证了在本地堆栈中创建的存储桶。
  • 编写了一个简单的 terratest 测试用例来断言存储桶是否存在。

Terraform代码如下,

terraform {
  backend "s3" {
    bucket  = "<bucket-name>"
    key     = "state/terraform.tfstate"
    region  = "us-east-1"
    profile = "default"
  }
}

provider "aws" {
  region = "us-east-1"
  s3_force_path_style = true
  skip_metadata_api_check = true
  endpoints {
    s3             = "http://localhost:4572"
  }
}

resource "aws_s3_bucket" "test_bucket" {

  bucket = "test-bucket"
  acl    = "public-read-write"
  cors_rule {
    allowed_headers = ["*"]
    allowed_methods = ["GET", "HEAD", "PUT"]
    allowed_origins = ["*"]
    expose_headers  = ["ETag"]
  }
  region = "us-east-1"
}

output "name" {
  value = "${aws_s3_bucket.test_bucket.bucket}"
}

output "region" {
  value = "${aws_s3_bucket.test_bucket.region}"
}

当执行下面给出的 terratest 测试用例时,在本地堆栈中创建了一个桶。但是我找不到任何将 terratest AWS 模块指向 localstack 端点的 api 或配置。 AssertS3BucketExists 默认检查存储桶的 AWS 环境并且断言失败。

测试代码如下。

package aws

import (
"fmt"
"testing"

"github.com/gruntwork-io/terratest/modules/aws"
"github.com/gruntwork-io/terratest/modules/terraform"
)

func TestWebServer(t *testing.T) {
    terraformOptions := &terraform.Options{
    // The path to where your Terraform code is located
    TerraformDir: ".",
}


terraform.InitAndApply(t, terraformOptions)

name := terraform.Output(t, terraformOptions, "name")
region := terraform.Output(t, terraformOptions, "region")
aws.AssertS3BucketExists(t, region, name)

如有任何帮助,我们将不胜感激。

最佳答案

要在不修改库的情况下使用 terratest 模拟 AWS,您可以使用类似 moto's standalone server mode 的东西.由于没有(显而易见的)方法来更改 terratest 中的端点,因此可能需要修改本地 DNS 解析以将端点指向本地 moto 服务器。

使用 terratest,无法将模拟 AWS 注入(inject)库本身,因为用于连接到 AWS 的接口(interface)未公开。

关于unit-testing - Terratest - 使用模拟 AWS 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60377803/

相关文章:

terraform - 如何在 Terraform 中传递凭据?

terraform - 在 Terraform 中使用 for-each 循环本地 json

Terraform 获取安全组的私有(private)子网

iOS 测试和 UITests 混淆

azure - AKS 使用 Terraform - 等待完成时出错

azure - Terraform Azure 后端问题

Terraform resource_aws_vpc_endpoint Dns 列表为空

javascript - Jest - 模拟一个函数被导入到你正在测试的组件文件中

java - 如何使用 DB 为方法创建 jUnit 测试用例

java - 如何避免在 Java 测试中重复插入