我正在为Terraform模块编写单元测试,我想确认该模块产生了我期望的执行计划。但是,在测试中连接到Amazon需要太长时间,并且需要对持续集成服务器进行过多配置。
如何使用terraform plan
从我的配置中生成执行计划,假定不存在资源?
答案 0 :(得分:4)
我一直在考虑类似于Terraform模块的测试框架,之前使用Moto来模拟Python中的Boto调用。
Moto通过猴子修补对AWS的调用来工作,因此只能在Python本地使用。但它确实提供了在Flask上运行的mocked backend as a server以便在独立模式下使用。
那就是说,我刚刚尝试使用Terraform,虽然plan
似乎工作正常但是应用了一个非常基本的配置导致了这个错误:
* 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"
我接着注意到,即使Moto服务器没有运行,我只是在AWS provider中使用不存在的本地端点,计划也完好无损。
因此,如果您只是需要计划,那么您应该可以通过添加指向localhost的endpoint
block来实现此目的:
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"
}
}
如何将该端点块注入测试而不是实际使用可能是另一个问题,并且需要有关如何构建测试的更多信息。
答案 1 :(得分:0)
terraform plan -refresh=false
能做你想做的吗?
我使用它来执行“快速计划”,而无需花时间刷新所有AWS资源的状态。 不确定它是否实际连接到AWS以执行此操作。
如果您正在使用更复杂的远程状态设置,而这是您不想配置的部分 - 您还可以尝试添加一个空的tfstate文件,并使用-state
选项指向该文件。 / p>