Как я могу ссылаться на значение из другого модуля?

Я хочу развернуть базу данных 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
}
Другие вопросы по тегам