1

我想使用来自 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.tf定义source资源数据库的位置。保存密码,一切正常,我指定块中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)
}

我解码了这些秘密,现在我想引用它们,例如local.decoded_secrets.usernamemyenv/main. 这是我对教程的解释。但它不起作用:如果我把locals块放在myenv里面就不能引用data,当我把它放进去时,modules/secretsmyenv不能引用locals。如何将这两个模块的值组合在我的myenv/main?

4

2 回答 2

2

在模块中定义一个输出。在模块中secrets定义一个输入。db将输出值传递secrets给 中的输入属性db

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

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

module "db" {
  source = "../modules/db"
  password = module.secrets.password

}
于 2021-02-16T18:57:41.620 回答
1

您可以在此处使用一些选项将密钥传递给数据库模块。

您需要从现有设置中做的最小的事情是同时调用两个模块并将秘密模块的输出传递给数据库模块,如下所示:

.
├── environments
│   └── myenv
│       ├── locals.tf
│       ├── main.tf
│       └── variables.tf
└── modules
    ├── db
    │   ├── main.tf
    │   └── variables.tf
    └── secrets
        ├── main.tf
        └── outputs.tf

模块/秘密/输出.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
}

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

嵌套模块

模块/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

模块/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
}

模块/db/main.tf

resource "aws_db_instance" "database" {
  # ...
  password = aws_secretsmanager_secret_version.database_password.secret_string
}
于 2021-02-17T09:45:38.807 回答