Terratest - Воспользуйтесь сервисами mock AWS - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь сделать AWS выделение ресурсов через terraform и планирую создать конвейер CICD с наибольшими тестовыми примерами для кода terraform. Моя проблема в том, что у меня CloudFront в моей инфраструктуре, и на его создание уходит около 20 минут, а на удаление - примерно столько же. Я не хочу, чтобы сборка CI занимала около 45 минут только для выполнения юнит-тестов.

Я наткнулся на localstack, чтобы смоделировать среду AWS, но не нашел способов указать terratest на ресурсы localalstack. Это то, что я пробовал

  • Создал локальный стек docker контейнер
  • Настроил terraform так, чтобы он указывал на локальный стек - добавлен 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}"
}

Когда был выполнен самый суровый тестовый пример, как указано ниже, в локальном стеке был создан сегмент. Но я не смог найти ни API, ни конфигурацию, которые указывали бы на модуль terratest AWS на конечные точки локального стека. AssertS3BucketExists по умолчанию проверяет среду AWS на наличие сегмента, и утверждение не выполняется.

Код Terratest выглядит следующим образом.

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)

Любая помощь здесь будет высоко ценится.

...