Amazon web services 如何从其他模块中引用值?
我想使用AWS机密管理器的机密将RDS数据库部署到AWS。我有:Amazon web services 如何从其他模块中引用值?,amazon-web-services,terraform,terraform-provider-aws,terraform-aws-modules,Amazon Web Services,Terraform,Terraform Provider Aws,Terraform Aws Modules,我想使用AWS机密管理器的机密将RDS数据库部署到AWS。我有: ├─ environments │ └─ myenv │ ├── main.tf │ ├── locals.tf │ └── variables.tf └─ modules ├─ db │ ├── main.tf │ └── variables.tf └─ secrets └── main.tf 在myenv/main.tf中,我将具
├─ environments
│ └─ myenv
│ ├── main.tf
│ ├── locals.tf
│ └── variables.tf
└─ modules
├─ db
│ ├── main.tf
│ └── variables.tf
└─ secrets
└── main.tf
在myenv/main.tf
中,我将具有modules/db/main.tf的模块mydb
定义为source
,其中定义了资源数据库。除了密码外,我在myenv
中以块的形式指定值,并指定值“trickle-down”。
但是对于凭证,我当然不想在myenv
中硬编码。
而是在模块/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)
}
我解码密码,现在我想在myenv/main
中引用它们,例如local.decoded\u secrets.username
。这是我对教程的解释。但它不起作用:如果我把locals
块放在myenv
中,它就不能引用数据
,当我把它放在modules/secrets
中时,myenv
就不能引用locals
。
如何在我的myenv/main
中组合这两个模块的值?在secrets
模块中定义一个。在db
模块中定义一个。将输出值从secrets
传递到db
中的输入属性
例如,如果您在secrets
中定义了名为“password”的输出,在db
中定义了名为“password”的输入,则在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
在secrets
模块中定义密码。在db
模块中定义一个。将输出值从secrets
传递到db
中的输入属性
例如,如果您在secrets
中定义了名为“password”的输出,在db
中定义了名为“password”的输入,则在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
您可以在这里使用一些选项将机密传递给数据库模块
从现有设置中,您需要做的最简单的事情就是同时调用两个模块,并将机密模块的输出传递给数据库模块,如下所示:
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
模块/机密/输出.tf
环境/myenv/main.tf
但是,更好的方法可能是让数据库模块创建和管理自己的机密,而不需要将机密作为参数传递到数据库模块中。如果您想将secrets模块与其他模块一起重用,则可以将其作为数据库模块的子模块,或者如果这是您当前使用secrets模块的唯一位置,则取消对这些模块的测试会使事情变得更简单
嵌套模块
modules/db/main.tf
取消模块的测试
模块/db/secrets.tf
modules/db/main.tf
您可以在这里使用一些选项将机密传递给数据库模块
从现有设置中,您需要做的最简单的事情就是同时调用两个模块,并将机密模块的输出传递给数据库模块,如下所示:
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
模块/机密/输出.tf
环境/myenv/main.tf
但是,更好的方法可能是让数据库模块创建和管理自己的机密,而不需要将机密作为参数传递到数据库模块中。如果您想将secrets模块与其他模块一起重用,则可以将其作为数据库模块的子模块,或者如果这是您当前使用secrets模块的唯一位置,则取消对这些模块的测试会使事情变得更简单
嵌套模块
modules/db/main.tf
取消模块的测试
模块/db/secrets.tf
modules/db/main.tf
是否有理由需要将密码放在单独的模块中,而不是db
模块的一部分?这将大大简化它。@ydaetskcoR实际上有几个db实例,每个实例都有自己的秘密,所以我想我最好将关注点分离到它们自己的模块中,并与myenv
进行协调。但是我想我可以合并它们。你的db
模块仍然创建一个数据库,对吗?你不会在这些数据库之间分享秘密吧?在这种情况下,将secrets
模块折叠到db
模块中似乎要干净得多。@ydaetskcoR my db module定义了一个数据库资源,并且没有秘密共享。为什么秘密需要放在一个单独的模块中,而不是db
模块的一部分?这将大大简化它。@ydaetskcoR实际上有几个db实例,每个实例都有自己的秘密,所以我想我最好将关注点分离到它们自己的模块中,并与myenv
进行协调。但是我想我可以合并它们。你的db
模块仍然创建一个数据库,对吗?你不会在这些数据库之间分享秘密吧?在这种情况下,将secrets
模块折叠到db
模块中似乎要干净得多。@ydaetskcoR my db module定义了一个数据库资源,没有秘密共享,而这回答了这个问题,如果您查看关于这个问题的注释,您会发现通过折叠有一种更简单的方法这里将secret模块转换为数据库模块,因为它们不需要单独组合。如果他们还需要其他模块的秘密模块,那么他们也可以将秘密模块称为数据库模块的子模块,并且仍然具有比这更好的结果,为他们的数据库模块提供更干净的API。@ YDaETSkcor,我不认为“更好”或“更干净”,只是不同。我的答案实际上是我在很多地形代码中看到的一种非常常见的模式。1.它让您可以选择在Terraform内部管理密码,或者通过完全在Terraform外部的其他方式管理密码。2.DB密码通常需要传递给其他东西,比如连接到数据库的应用程序,因此在DB模块之外需要该值是非常常见的