通过 Terraform 创建 RDS 实例后向数据库添加 Postgresql 角色

vla*_*vel 3 postgresql amazon-web-services amazon-rds terraform terraform-provider-aws

通过 Terraform 在 RDS 中创建角色后,我试图将其添加到 Postgresql 数据库。

我有两个单独的模块,一个创建 RDS 实例,一个向其中添加新角色。数据库地址是persistence模块的输出和模块的输入persistenceApplicationRole。问题好像是在创建RDS实例之前运行了Postgresql provider,所以地址为空。
我得到的错误是:

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 {
Run Code Online (Sandbox Code Playgroud)

通过-target=module.persistence标志单独运行模块是有效的,因为persistenceApplicationRole一旦创建数据库地址就会获取它。我在此处的文档中为 MySQL Provider 找到了一个包含这种确切场景的示例。

# 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
}
Run Code Online (Sandbox Code Playgroud)

yda*_*coR 6

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"
}
Run Code Online (Sandbox Code Playgroud)

更常见的用例是创建一个 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
}
Run Code Online (Sandbox Code Playgroud)