在通过 Terraform 创建 RDS 实例后,将 Postgresql 角色添加到数据库



我正在尝试通过Terraform在RDS中创建Postgresql数据库后将其添加到Postgresql数据库。

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

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
}

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
}

相关内容

  • 没有找到相关文章

最新更新