首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terratest -使用模拟AWS服务

Terratest -使用模拟AWS服务
EN

Stack Overflow用户
提问于 2020-02-24 14:17:03
回答 2查看 2.6K关注 0票数 3

我试图通过terraform来实现AWS资源的配置,并计划为terraform代码提供一个带有最简单单元测试用例的CICD管道。我的问题是,我的基础设施中有CloudFront,创建过程大约需要20分钟,而移除则需要大约20分钟。我不希望CI构建花费大约45分钟来运行单元测试用例。

我偶然看到local堆栈来模拟AWS环境,但没有找到将其指向本地堆栈资源的方法。这就是我试过的

  • 创建了一个本地堆栈对接器容器
  • 将terraform配置为指向提供者部分中添加了本地堆栈的端点url。
  • 应用在本地堆栈中创建的terraform配置和验证桶。
  • 编写了一个简单的、最简单的测试用例来断言桶是否存在。

Terraform代码如下,

代码语言:javascript
复制
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或配置来将最迟的AWS模块指向本地堆栈端点。默认情况下,AssertS3BucketExists检查桶的AWS环境,断言失败。

Terratest代码如下。

代码语言:javascript
复制
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)

这里的任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2020-07-24 15:45:50

为了在不修改库的情况下用terratest来模拟AWS,您可以使用类似于独立服务器模式的东西。由于没有(明显的)方法来更改terratest中的端点,因此可能需要修改本地DNS解析以将端点指向本地moto服务器。

使用terratest,无法将模拟AWS注入库本身,因为用于连接AWS的接口没有公开。

票数 2
EN

Stack Overflow用户

发布于 2020-09-24 07:12:32

有一个工作的按下将获得Terratest来验证本地堆栈中的资源。

您可以使用替换指令更新go.mod文件以测试它。

代码语言:javascript
复制
module github.com/GITHUB_USERNAME/REPO_NAME

go 1.15

require (
    github.com/gruntwork-io/terratest v0.30.0
    github.com/stretchr/testify v1.6.1
)

replace github.com/gruntwork-io/terratest v0.30.0 => github.com/ffernandezcast/terratest v0.28.6-0.20200915124510-25813206bebc

然后使用以下vars更新您的Terratest测试,以配置aws包的自定义端点。

代码语言:javascript
复制
    var LocalEndpoints = map[string]string{
        "apigateway":     "http://localhost:4566",
        "cloudformation": "http://localhost:4566",
        "cloudwatch":     "http://localhost:4566",
        "dynamodb":       "http://localhost:4566",
        "es":             "http://localhost:4566",
        "firehose":       "http://localhost:4566",
        "iam":            "http://localhost:4566",
        "kinesis":        "http://localhost:4566",
        "lambda":         "http://localhost:4566",
        "route53":        "http://localhost:4566",
        "redshift":       "http://localhost:4566",
        "s3":             "http://localhost:4566",
        "secretsmanager": "http://localhost:4566",
        "ses":            "http://localhost:4566",
        "sns":            "http://localhost:4566",
        "sqs":            "http://localhost:4566",
        "ssm":            "http://localhost:4566",
        "stepfunctions":  "http://localhost:4566",
        "sts":            "http://localhost:4566",
    }
    aws.SetAwsEndpointsOverrides(LocalEndpoints)

然后,运行go test,Terratest现在将验证LocalStack中的资源。我在这里详细介绍了这方面的内容,本地堆栈/

希望PR不久将合并到Terratest master分支机构。

~jq1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60377803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档