如何引用来自不同模块的值?

How can I reference a value from a different module?

我想使用来自 AWS Secrets Manager 的密钥将 RDS 数据库部署到 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.tfsource,其中定义了资源数据库。除了密码之外,一切正常,我在 myenv 中的块中指定值,并且值“逐渐下降”。 但是对于凭据,我当然不想在 myenv 中对它们进行硬编码。 相反,在 modules/secrets 中,我定义了

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)
}

我解码了 secrcets,现在我想引用它们,例如local.decoded_secrets.usernamemyenv/main 中。这是我对教程的解释。但它不起作用:如果我将 locals 块放在 myenv 中,它不能引用 data,而当我将它放在 modules/secrets 中时,myenv 不能参考 locals。 如何在 myenv/main?

中组合这两个模块的值

db模块中定义一个output in the secrets module. Define an input。将 secrets 中的输出值传递到 db 中的输入 属性。

例如,如果您在 secrets 中定义了一个名为“password”的输出,在 db 中定义了一个名为“password”的输入,那么在您的数据库模块声明中,您将像这样传递值:

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

modules/secrets/outputs.tf

output "secret_id" {
  value = aws_secretsmanager_secret_version.secret.secret_id
}

environments/myenv/main.tf

module "secrets" {
  source = "../../modules/secrets"
  # ...
}

module "db" {
  source    = "../../modules/db"
  # ...
  secret_id = module.secrets.secret_id
}

然而,更好的方法可能是让数据库模块创建和管理自己的机密,并且根本不需要将机密作为参数传递到数据库模块中。如果你想将 secrets 模块与其他模块一起重用,那么你可以将它作为数据库模块的子模块,或者如果这是你当前唯一使用 secrets 模块的地方,那么取消嵌套会使事情变得更简单。

嵌套模块

modules/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

modules/db/secrets.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
}

modules/db/main.tf

resource "aws_db_instance" "database" {
  # ...
  password = aws_secretsmanager_secret_version.database_password.secret_string
}