2017-01-31 2 views
2

Ich schreibe einen Komponententest für ein Terraform-Modul, und ich möchte bestätigen, dass das Modul den Ausführungsplan erstellt, den ich erwarte. Die Verbindung zu Amazon innerhalb eines Tests würde jedoch zu lange dauern und eine zu große Konfiguration des Servers für die kontinuierliche Integration erfordern.Wie kann ich einen Ausführungsplan aus der Terraform-Konfiguration erstellen, ohne eine Verbindung zu AWS herzustellen?

Wie kann ich terraform plan verwenden, um einen Ausführungsplan aus meiner Konfiguration zu generieren, der davon ausgeht, dass keine Ressourcen vorhanden sind?

Antwort

2

Ich habe etwas Ähnliches für ein Testframework um Terraform-Module in Erwägung gezogen und zuvor Moto für Spottbotaufrufe in Python verwendet.

Moto funktioniert durch Affe Patch-Aufrufe an AWS, so dass nur nativ mit Python funktioniert. Es bietet jedoch die mocked backend as a server läuft auf Flask im Stand-Alone-Modus verwendet werden.

Das heißt, ich habe gerade versucht es mit Terraforming und während plan s scheinen in Ordnung eine sehr einfache Konfiguration führte zu diesem Fehler angewendet wird zu arbeiten:

* aws_instance.web: Error launching source instance: SerializationError: failed decoding EC2 Query response 
caused by: parsing time "2015-01-01T00:00:00+0000" as "2006-01-02T15:04:05Z": cannot parse "+0000" as "Z" 

ich zufällig dann, dass die Pläne bemerken komplette Fein auch wenn der Moto-Server nicht läuft und ich nur einen nicht vorhandenen lokalen Endpunkt im AWS provider verwende.

Als solcher, wenn Sie nur Pläne müssen, dann sollten Sie in der Lage sein, dies zu tun, indem sie ein endpoint block Zugabe, die wie folgt auf localhost-Punkte:

provider "aws" { 
    skip_credentials_validation = true 
    max_retries = 1 
    skip_metadata_api_check = true 
    access_key = "a" 
    secret_key = "a" 
    region = "us-west-2" 

    endpoints { 
    ec2 = "http://127.0.0.1:5000/" 
    } 
} 


resource "aws_instance" "web" { 
    ami = "ami-123456" 
    instance_type = "t2.micro" 
    tags { 
     Name = "HelloWorld" 
    } 
} 

Wie Sie diesen Endpunkt Block in zum Testen injizieren und nicht für Die Verwendung in der realen Welt ist wahrscheinlich eine andere Frage und würde weitere Informationen darüber erfordern, wie Ihre Tests erstellt werden.

+0

Nach dem Hinzufügen von gefälschten Anmeldeinformationen zum Anbieter, es hat funktioniert! Vielen Dank! –

0

Funktioniert terraform plan -refresh=false was Sie wollen?

Ich verwende es, um einen "schnellen Plan" zu machen, ohne die Zeit zu nehmen, um den Status aller AWS-Ressourcen zu aktualisieren. Nicht sicher, ob es tatsächlich zu AWS verbindet, um das zu tun.

Wenn Sie eine kompliziertere Remote-State-Konfiguration verwenden und dies ist der Teil, den Sie nicht konfigurieren möchten - Sie könnten auch versuchen, eine leere Tfstate-Datei hinzufügen und mit der Option -state darauf zeigen.

+0

Ich habe es einfach aus Neugierde ausprobiert, weil mir die Einfachheit gefallen hat, aber ohne jegliche Netzwerkfähigkeit ist es einfach nur für mich selbst bei sehr einfacher Konfiguration möglich. Ich nehme an, dass versucht wird, zu AWS zu gelangen, aber ohne tiefer zu schauen, versucht es vielleicht, für andere Dinge ins Internet zu kommen. Es beschleunigt die Pläne jedoch etwas. – ydaetskcoR

+0

'Terraform Plan -refresh = false' scheint nicht zu funktionieren. Wenn ich einen AWS-Provider-Abschnitt weglasse, werden AWS-Anmeldeinformationen angefordert. Wenn ich einen Provider-Abschnitt zur Verfügung stelle, überprüft er die Anmeldeinformationen und gibt den Fehler "InvalidClientTokenId: Das in der Anfrage enthaltene Sicherheitstoken ist ungültig. \t Statuscode: 403, Anfrage-ID: XXX". –

+0

'terraform plan -state =/dev/null' und' terraform plan -state = empty_file.tfstate' funktionieren auch nicht. Sie drucken "Fehler beim Lesen des lokalen Status: Fehler beim Überprüfen auf magische Bytes: EOF". –

Verwandte Themen