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似乎没有对我的端点字符串执行插值,但我在文档中没有看到任何关于这一点的内容——给出了什么?

是的。文档中有一个示例,位于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}"
}

我遇到了一组类似的错误消息("连接失败"、"无效域查找"),并对此进行了一些研究。我希望这能帮助你或其他人在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

最新更新