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

How can I generate an execution plan from Terraform configuration without connecting to AWS?

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

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

terraform plan -refresh=false做你想做的事吗?

我用它做了一个 "fast plan",没有花时间刷新所有 AWS 资源的状态。 不确定它是否真的连接到 AWS 来做到这一点。

如果您使用的是更复杂的 remote-state 设置并且这是您不想配置的部分 - 您也可以尝试添加一个空的 tfstate 文件并使用 -state选项。

我一直在考虑围绕 Terraform 模块构建类似的测试框架,并且之前曾使用 Moto 在 Python 中模拟 Boto 调用。

Moto 通过猴子修补对 AWS 的调用来工作,因此只能在本机使用 Python。但是它确实提供了 mocked backend as a server 运行 在 Flask 上以独立模式使用。

就是说,我刚刚在 Terraform 上尝试过,虽然 plans 似乎工作正常,但应用的非常基本的配置导致了这个错误:

* 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.

因此,如果您只需要计划,那么您应该可以通过添加指向本地主机的 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"
    }
}

如何将端点块注入用于测试而不是用于现实世界的使用可能是另一个问题,并且需要有关如何构建测试的更多信息。