2

I am trying to declare the following Terraform provider:

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

I get the following error:

Error refreshing state: 1 error(s) occurred:

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

It seems that Terraform is not performing interpolation on my endpoint string, yet I don't see anything in the documentation about this -- what gives?

4

2 回答 2

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}"
}
于 2016-07-28T22:50:03.800 回答
1

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

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

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

这里可能需要进行一些代码更改 - 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

于 2017-08-18T17:31:58.863 回答