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



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

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

我一直在考虑为Terraform模块的测试框架做一些类似的事情,并且之前曾使用Moto来模拟Python中的Boto调用。

Moto通过猴子修补对AWS的调用来工作,因此只能在本地使用Python。然而,它确实提供了模拟后端,作为在Flask上运行的服务器,用于独立模式。

也就是说,我刚刚在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提供商中使用一个不存在的本地端点,计划也很好。

因此,如果您只需要计划,那么您应该能够通过添加指向localhost的endpoint块来做到这一点,如下所示:

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"
}
}

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

terraform plan -refresh=false能满足您的要求吗?

我用它来做一个"快速计划",而不需要花时间刷新所有AWS资源的状态。但不确定它是否真的连接到了AWS。

如果你使用的是更复杂的远程状态设置,而这是你不想配置的部分,你也可以尝试添加一个空的tfstate文件,并用-state选项指向它。

最新更新