#amazon-ec2 #count #terraform #terratest
Вопрос:
Я получаю ошибку при тестировании Terratest подготовленных экземпляров EC2 с использованием Terraform, я использую count для создания нескольких экземпляров, и кажется, что функция (GetPublicIpOfEc2Instance) путается при возврате нескольких идентификаторов экземпляров, есть ли способ заставить ее принимать несколько значений?
--- FAIL: TestRecourcesProvisioning (295.89s)
ec2.go:121:
Error Trace: ec2.go:121
flugel_test.go:50
Error: Received unexpected error:
InvalidInstanceID.Malformed: Invalid id: "[i-0d1e09244e6bdb*** i-0257c214b3242c***]"
status code: 400, request id: ***-8c64-449f-b830-***
Test: TestRecourcesProvisioning
FAIL
FAIL command-line-arguments 295.909s
FAIL
Код Terratest:
package test
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"strings"
"testing"
"github.com/gruntwork-io/terratest/modules/aws"
"github.com/gruntwork-io/terratest/modules/random"
"github.com/gruntwork-io/terratest/modules/terraform"
"github.com/stretchr/testify/assert"
)
func TestRecourcesProvisioning(f *testing.T) {
f.Parallel()
// Specify A Region And Names For Resourses For Provisioning
approvedRegions := []string{"us-west-1"}
awsRegion := aws.GetRandomRegion(f, approvedRegions, nil)
expectedNameIns := fmt.Sprintf("ex-%s", random.UniqueId())
expectedBucket_name := fmt.Sprintf("ex-%s", strings.ToLower(random.UniqueId()))
terraformOptions := amp;terraform.Options{
// The Path To Terrafom Code
TerraformDir: "../",
// Variables Will Be Passed To Terraform Code
Vars: map[string]interface{}{
"instance_name": expectedNameIns,
"s3_name": expectedBucket_name,
"lb_name": fmt.Sprintf("ex-%s", random.UniqueId()),
"tg_name": fmt.Sprintf("ex-%s", random.UniqueId()),
"bucket_name": fmt.Sprintf("ex-%s", strings.ToLower(random.UniqueId())),
},
}
defer terraform.Destroy(f, terraformOptions)
terraform.InitAndApply(f, terraformOptions)
actualInstanceId := terraform.Output(f, terraformOptions, "instance_id")
actualPublicIP := terraform.Output(f, terraformOptions, "instance_public_ip")
actualBucketId := terraform.Output(f, terraformOptions, "bucket_id")
albDNS := terraform.Output(f, terraformOptions, "ex_lb_dns")
tagName := "Name"
exptectedPublicIP := aws.GetPublicIpOfEc2Instance(f, actualInstanceId, awsRegion)
expectedBucketID := aws.FindS3BucketWithTag(f, awsRegion, tagName, expectedBucket_name)
url := fmt.Sprintf("http://%s", albDNS)
resp, err := http.Get(url)
if err != nil {
log.Fatalln(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
sb := string(body)
log.Printf(sb)
assert.Equal(f, actualPublicIP, exptectedPublicIP)
assert.Equal(f, expectedBucketID, actualBucketId)
assert.Contains(f, sb, "Hello World!")
}
Код терраформирования:
resource "aws_instance" "ex_ec2" {
ami = var.ami_id
instance_type = "t2.micro"
key_name = "ex"
subnet_id = "${element(aws_subnet.ex_subnet.*.id, count.index)}"
associate_public_ip_address = true
security_groups = [aws_security_group.ec2_sg.id]
count = 2
user_data = file("userdata.sh")
tags = {
Name = var.instance_name
Owner = var.owner
}
Комментарии:
1. Нам нужно увидеть код terratest — независимо от того, нет общедоступного IP-адреса экземпляра EC2 wokr на 1 экземпляре, не более 1
2. Я добавил код terratest, есть ли альтернативная функция для тестирования нескольких экземпляров?
3. Если вывод TF возвращает список идентификаторов экземпляров, то вам нужно обработать его как список или фрагмент в Go и итеративно вызвать
aws.GetPublicIpOfEc2Instance
функцию.4. @MattSchuchard Я попытался обработать его как список, я получил эту ошибку (не удается использовать actualInstanceId (строка типа []) в качестве строки типа в аргументе для «github.com/gruntwork-io/terratest/modules/aws». GetPublicIpOfEc2Instance) похоже, как упоминал Эрмия Эскандари, функция принимает только одно значение.
5. Да, именно поэтому я сделал свое предложение; оно продвинет вас вперед, если вы его реализуете.