Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何从其他模块中引用值?_Amazon Web Services_Terraform_Terraform Provider Aws_Terraform Aws Modules - Fatal编程技术网

Amazon web services 如何从其他模块中引用值?

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中,我将具

我想使用AWS机密管理器的机密将RDS数据库部署到AWS。我有:

├─ 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模块之外需要该值是非常常见的