通过Terraform创建RDS实例后,如何向数据库中添加一个Postgresql角色?

6

我正在尝试通过Terraform在RDS上创建数据库后,将角色添加到Postgresql数据库。

我有两个不同的模块,一个用于创建RDS实例,另一个用于向其添加新角色。数据库地址是“persistence”模块的输出和“persistenceApplicationRole”模块的输入。问题似乎在于在创建RDS实例之前,Postgresql提供程序已经运行,因此地址为空。
我得到的错误信息是:

Error: Error initializing PostgreSQL client: error detecting capabilities: error PostgreSQL version: dial tcp :5432: connect: connection refused

  on ../modules/persistenceApplicationRole/main.tf line 9, in provider "postgresql":
   9: provider postgresql {

通过使用-target=module.persistence标志单独运行模块可以工作,因为persistenceApplicationRole一旦创建就会获取数据库地址。我在MySQL提供程序的文档这里找到了一个具有完全相同情况的示例。
# module.persistenceApplicationRole
provider postgresql {
  host      = var.databaseAddress
  username  = data.external.root_credentials.result["username"]
  password  = data.external.root_credentials.result["password"]
  superuser = false
}

resource "postgresql_role" "application_role" {
  name     = data.external.application_credentials.result["username"]
  password = data.external.application_credentials.result["password"]

  login               = true
  encrypted_password  = true
  skip_reassign_owned = true
  skip_drop_role      = true
}
1个回答

10

Postgresql提供程序的1.4.0版本添加了expected_version,您可以使用它来避免计划时间的功能检测尝试连接到数据库。这是在0.1.1版本中引入的,并且破坏了人们能够同时创建基础实例和配置数据库的能力。

要使用expected_version,您可以像这样操作:

provider postgresql {
  host      = var.databaseAddress
  username  = data.external.root_credentials.result["username"]
  password  = data.external.root_credentials.result["password"]
  superuser = false

  expected_version = "10.1"
}

更常见的用例是创建一个RDS实例或其他内容,并在整个过程中进行插值:
resource "aws_db_instance" "database" {
  # ...
}

provider "postgresql" {
  version = ">=1.4.0"

  host             = aws_db_instance.database.address
  port             = aws_db_instance.database.port
  username         = aws_db_instance.database.user
  password         = aws_db_instance.database.password
  sslmode          = "require"
  connect_timeout  = 15
  superuser        = false
  expected_version = aws_db_instance.database.engine_version
}

谢谢,expected_version字段确实解决了我的问题。 - vladvel
在“更常见的用例”中,预计可以使用aws_db_instance资源的engine_version参数。但这对我不起作用;我收到了Error: dial tcp [::1]:0: connect: can't assign requested address错误信息。 - Jon Burgess
@JonBurgess,我目前在我的新角色中没有使用Postgresql提供程序,但如果您可以提出一个新问题,说明您尝试过的内容以及您正在使用的Terraform版本和插件版本,并链接回这个答案,那么我相信有人会能够帮助您。 - ydaetskcoR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接