【问题标题】:Terraform: share resource between modulesTerraform:在模块之间共享资源
【发布时间】:2021-09-24 09:30:07
【问题描述】:

我正在创建一个运行良好的 terraform 模块。但是,当我多次使用它时,它会创建多个角色和策略,它们实际上是相同的。

我正在考虑是否有办法让模块在我第一次调用它时创建一个角色并继续为后续模块使用相同的角色

【问题讨论】:

  • 不,这不是一般的工作方式。您可以自己实现这一点,方法是向模块添加一个输入变量,并根据变量使用它指向的角色,或者如果变量为空则创建一个角色,然后输出角色。

标签: terraform terraform-modules


【解决方案1】:

不,Terraform 不支持这一点。最好的办法是在模块之外(或在单独的模块中)创建共享资源,然后将它们作为输入参数传递到您正在创建的模块中多次。

我喜欢为“共享”资源创建一个模块的方法,因为这样您就可以将整个模块作为输入参数传递给任何使用这些共享资源的模块。

编辑:共享模块的示例代码:

main.tf

module "mod1" {
  source = "./mymodule1"
}

module "mod2" {
  source       = "./mymodule2"
  input_module = module.mod1
}

output "mod2" {
  value = module.mod2
}

mymodule1/main.tf

output "some_field" {
  value = "foo"
}

mymodule2/main.tf

variable "input_module" {}

output "module_that_was_input" {
  value = var.input_module
}

结果:

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

mod2 = {
  "module_that_was_input" = {
    "some_field" = "foo"
  }
}

【讨论】:

  • 将“共享”模块传递给其他模块真的有效吗?当我刚刚尝试它时,它不会让我通过整个对象。我必须导出特定的值。例如我有一个想要在多个其他模块之间共享的 AWS ACM 证书。 Terraform 不允许我传入共享模块。相反,我必须将 ACM ARN 作为输出变量导出,并将相同的变量输入到另一个模块中。很想看到一个传递你提到的整个模块的例子。
  • 它确实有效(至少与我目前正在测试的 TF v1.0.1 一起使用)。有关示例代码,请参阅我的更新答案。
  • 感谢 Jordan 的代码示例。以上工作。困惑在于我试图通过共享模块(input_module.aws_acm_certificate.main.arn)访问资源,当它在将模块传递给模块2时似乎只导入模块1的输出变量。
  • 很高兴它成功了!是的,如果它们是“输出”,您只能访问在模块中创建的东西,这始终是正确的。如果这解决了您的问题,请接受答案,以便将问题标记为已关闭。
猜你喜欢
  • 2019-03-07
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多