Terratest Получает Ошибку При Использовании Count С Созданием Терраформы EC2

#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. Да, именно поэтому я сделал свое предложение; оно продвинет вас вперед, если вы его реализуете.