Добавление роли Postgresql в базу данных после создания экземпляра RDS через Terraform - PullRequest
1 голос
/ 09 января 2020

Я пытаюсь добавить роль в базу данных Postgresql после ее создания в RDS через Terraform.

У меня есть два отдельных модуля, один создает экземпляр 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
}

1 Ответ

2 голосов
/ 09 января 2020

В 1.4.0 версии Postgresql провайдера добавлена ​​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
}
...