Как я могу ссылаться на значение из другого модуля?
Я хочу развернуть базу данных rds в aws с секретом от диспетчера секретов aws. У меня есть:
├─ environments
│ └─ myenv
│ ├── main.tf
│ ├── locals.tf
│ └── variables.tf
└─ modules
├─ db
│ ├── main.tf
│ └── variables.tf
└─ secrets
└── main.tf
В
myenv/main.tf
Я определяю модуль
mydb
который имеет
modules/db/main.tf
в качестве
source
где определена база данных ресурсов. За исключением пароля, все работает, я указываю значения в блоках, а значения «просачиваются вниз». Но что касается учетных данных, я, конечно, не хочу их жестко кодировать. Вместо этого я определяю
data "aws_secretsmanager_secret_version" "my_credentials" {
# Fill in the name you gave to your secret
secret_id = "my-secret-id"
}
и с другим блоком:
locals {
decoded_secrets = jsondecode(data.aws_secretsmanager_secret_version.my_credentials.secret_string)
}
Я декодирую секреты, и теперь я хочу ссылаться на них, например,
local.decoded_secrets.username
в . Это моя интерпретация руководств. Но это не работает: если я помещаю в него блок, он не может ссылаться
data
, и когда я его вставил
modules/secrets
тогда
myenv
не могу ссылаться
locals
. Как я могу объединить значения этих двух модулей в моем
myenv/main
?
2 ответа
Определите вывод в модуле. Определите вход в модуле. Передайте выходное значение из входному свойству в.
Например, если вы определили выход с именем «пароль» в
secrets
и вход с именем "пароль" в
db
, то в объявлении модуля db вы должны передать такое значение:
module "secrets" {
source = "../modules/secrets"
}
module "db" {
source = "../modules/db"
password = module.secrets.password
}
У вас есть несколько вариантов передачи секрета модулю базы данных.
Наименьшее, что вам нужно сделать из существующей настройки, - это вызвать оба модуля одновременно и передать вывод из модуля секретов в модуль базы данных следующим образом:
.
├── environments
│ └── myenv
│ ├── locals.tf
│ ├── main.tf
│ └── variables.tf
└── modules
├── db
│ ├── main.tf
│ └── variables.tf
└── secrets
├── main.tf
└── outputs.tf
модули / секреты / outputs.tf
output "secret_id" {
value = aws_secretsmanager_secret_version.secret.secret_id
}
среды / myenv / main.tf
module "secrets" {
source = "../../modules/secrets"
# ...
}
module "db" {
source = "../../modules/db"
# ...
secret_id = module.secrets.secret_id
}
Однако лучший подход может заключаться в том, чтобы модуль базы данных создавал и управлял своим собственным секретом и вообще не требовал, чтобы секрет передавался в модуль базы данных в качестве параметра. Если вы хотите повторно использовать модуль секретов с другими модулями, вы можете сделать его дочерним модулем модуля базы данных или, если это единственное место, где вы в настоящее время используете модуль секретов, то их удаление упростит задачу.
Вложенные модули
модули / db / main.tf
module "database_password_secret_id" {
source = "../secrets"
# ...
}
data "aws_secretsmanager_secret_version" "database_password" {
secret_id = module.database_password_secret_id.secret_id
}
Распаковка модулей
.
├── environments
│ └── myenv
│ ├── locals.tf
│ ├── main.tf
│ └── variables.tf
└── modules
└── db
├── main.tf
├── secrets.tf
└── variables.tf
модули / БД / секреты.tf
resource "aws_secretsmanager_secret" "database_password" {
name = "database-password"
}
resource "random_password" "database_password" {
length = 32
}
resource "aws_secretsmanager_secret_version" "database_password" {
secret_id = aws_secretsmanager_secret.example.id
secret_string = random_password.database_password.result
}
модули / db / main.tf
resource "aws_db_instance" "database" {
# ...
password = aws_secretsmanager_secret_version.database_password.secret_string
}