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

Terraform是否在提供者声明中执行插值?,terraform,Terraform,我正在尝试声明以下Terraform提供程序: provider "mysql" { endpoint = "${aws_db_instance.main.endpoint}:3306" username = "root"

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

是的,它给出了。文档中有一个例子


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

这似乎归结为MySQL提供程序试图在数据库初始化后立即建立数据库连接,如果您试图构建数据库服务器并将数据库/授权配置为同一Terraform运行的一部分,这可能是一个问题。提供程序根据Terraform在您的Terraform代码中找到该提供程序拥有的资源进行初始化,并且由于此连接尝试在提供程序初始化时发生,因此您无法使用
-target=
解决此问题

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

这里可能需要进行一些代码更改—Terraform MySQL提供程序需要延迟连接到数据库,直到Terraform告诉它在资源上运行操作,并且可能需要查看Terraform如何处理提供程序之间的依赖关系。我尝试入侵延迟连接逻辑,只是为了查看
mysql\u数据库
资源是否解决了我的所有问题,Terraform仍然抱怨图形中存在依赖循环

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

之前的提供者的评论被划分为他们自己的可发布代码库:


您的
aws\u db\u实例的资源定义是什么样子的?此外,mysql提供程序文档中的示例似乎暗示
aws\u db\u实例…端点将端口作为输出的一部分返回,因此您不必再次追加它。vscode terraform插件可能会对HCL2插值语句加下划线,就好像它们是非法的一样。
# 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}"
}