Terraform是否在提供程序声明中执行插值?

时间:2016-07-24 18:15:40

标签: terraform

我正在尝试声明以下Terraform提供程序:

provider "mysql" {                                                              
    endpoint = "${aws_db_instance.main.endpoint}:3306"                   
    username = "root"                                                           
    password = "root"                                                           
}

我收到以下错误:

Error refreshing state: 1 error(s) occurred:

* dial tcp: lookup ${aws_db_instance.main.endpoint}: invalid domain name

似乎Terraform没有在我的端点字符串上执行插值,但我在文档中没有看到任何关于此的内容 - 是什么给出了?

2 个答案:

答案 0 :(得分:2)

是的,确实如此。在https://www.terraform.io/docs/providers/mysql/

的文档中有一个示例
# Configure the MySQL provider based on the outcome of
# creating the aws_db_instance.
provider "mysql" {
    endpoint = "${aws_db_instance.default.endpoint}"
    username = "${aws_db_instance.default.username}"
    password = "${aws_db_instance.default.password}"
}

答案 1 :(得分:1)

我遇到了一组类似的错误消息("连接失败,""无效的域查找")并对此进行了一些调查。我希望这可以帮助您或其他人在Terraform中跨云和数据库提供商工作。

这似乎归结为MySQL提供程序在初始化时尝试建立数据库连接,如果您尝试构建数据库服务器并配置它可能会出现问题作为同一Terraform运行的一部分,数据库/授予它。提供程序根据Terraform在Terraform代码中查找该提供程序所拥有的资源进行初始化,并且由于此连接尝试在提供程序初始化时发生,因此您无法使用-target=<SPECIFIC RESOURCE>解决此问题。

我能想到的解决方法是拥有一个用于设置数据库服务器的代码库和一个用于设置数据库授权等的不同代码库......或者让Terraform启动一个脚本来为您工作(当然还有动态参数!)。无论哪种方式,您都可以有效地从初始Terraform运行中删除mysql_*资源,以及解决此问题的原因。

这里可能需要进行一些代码更改 - Terraform MySQL提供程序需要延迟连接到数据库,直到Terraform告诉它在资源上运行操作,并且可能有必要了解Terraform如何处理提供商之间的依赖关系。我试图在mysql_database资源中使用延迟连接逻辑来查看是否解决了我的所有问题,而且Terraform仍抱怨图中的依赖循环。

您可以在此处跟踪MySQL提供商问题:

https://github.com/terraform-providers/terraform-provider-mysql/issues/2

来自提供商之前的评论被分成了他们自己的可释放代码库:

https://github.com/hashicorp/terraform/issues/5687