У меня есть простой скрипт, который должен возвращать строку подключения для базы данных, которую я затем могу использовать в качестве входных параметров для поставщика postgres.
Я читаю учетные данные из AWS Secrets Manager, используя небольшой скрипт bash. Скрипт работает и возвращает JSON в подходящем формате.
Когда я впервые протестировал мой скрипт, он работал! Ну, не совсем - имя пользователя было неверным. Я исправил мой скрипт, чтобы он возвращал правильное имя пользователя, но terraform продолжал использовать старое имя пользователя
План терраформ:
provider "postgresql" {
alias = "db_admin"
host = "${data.external.root_password.result.host}"
sslmode = "disable"
port = 5432
database = "postgres"
username = "${data.external.root_password.result.username}"
password = "${data.external.root_password.result.password}"
}
data "external" "root_password" {
program = ["bash", "${path.module}/get_root_password.sh"]
query = {
secret_name = "${var.root_password_name}"
assume_role = "${terraform.workspace}"
}
}
И скрипт bash:
#!/bin/bash
set -e
# This is a simplified version of the script for debugging purposes
# The first version had username = martin, but then got changed to root
echo {\"password\": \"not_the_password\", \"host\": \"some_db\", \"username\": \"root\"}
Вывод terraform выглядит следующим образом (обратите внимание, что имя пользователя martin не root):
Error: Error refreshing state: 1 error(s) occurred:
* module.db_roles.provider.postgresql.db_admin: Error initializing PostgreSQL client: error detecting capabilities: error PostgreSQL version: pq: password authentication failed for user "martin"
Старое значение должно быть где-то в кэше ... но я пытался искать везде, но безуспешно. Еще одна вещь, которую я заметил, - это план инициализации поставщика postgres до запуска внешних данных. Может ли это быть так? Это все еще не ответило бы, откуда исходит старое значение!