我试图通过terraform来实现AWS资源的配置,并计划为terraform代码提供一个带有最简单单元测试用例的CICD管道。我的问题是,我的基础设施中有CloudFront,创建过程大约需要20分钟,而移除则需要大约20分钟。我不希望CI构建花费大约45分钟来运行单元测试用例。
我偶然看到local堆栈来模拟AWS环境,但没有找到将其指向本地堆栈资源的方法。这就是我试过的
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或配置来将最迟的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)这里的任何帮助都将不胜感激。
发布于 2020-07-24 15:45:50
为了在不修改库的情况下用terratest来模拟AWS,您可以使用类似于独立服务器模式的东西。由于没有(明显的)方法来更改terratest中的端点,因此可能需要修改本地DNS解析以将端点指向本地moto服务器。
使用terratest,无法将模拟AWS注入库本身,因为用于连接AWS的接口没有公开。
发布于 2020-09-24 07:12:32
有一个工作的按下将获得Terratest来验证本地堆栈中的资源。
您可以使用替换指令更新go.mod文件以测试它。
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包的自定义端点。
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
https://stackoverflow.com/questions/60377803
复制相似问题