如何在不连接AWS的情况下从Terraform配置生成执行计划?

时间:2017-01-31 20:13:38

标签: amazon-web-services terraform

我正在为Terraform模块编写单元测试,我想确认该模块产生了我期望的执行计划。但是,在测试中连接到Amazon需要太长时间,并且需要对持续集成服务器进行过多配置。

如何使用terraform plan从我的配置中生成执行计划,假定不存在资源?

2 个答案:

答案 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>