引用在不同文件夹中创建的 Terraform 资源

mad*_*adu 14 terraform terraform-provider-aws

我有以下文件夹结构:

\n
infrastructure\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80security-groups\n\xe2\x94\x82   \xe2\x94\x82   main.tf\n\xe2\x94\x82   \xe2\x94\x82   config.tf\n\xe2\x94\x82   \xe2\x94\x82.  security_groups.tf\n\xe2\x94\x82   \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80instances\n    \xe2\x94\x82   main.tf\n    \xe2\x94\x82   config.tf\n    \xe2\x94\x82   instances.tf\n
Run Code Online (Sandbox Code Playgroud)\n

我想通过引用来引用 security-groups 文件夹中实例化的安全组 ID。\n我尝试使用以下命令在 security_groups.tf 文件中输出所需的 ID

\n
output "sg_id" {\n  value = "${aws_security_group.server_sg.id}"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后在实例文件中将其添加为模块:

\n
module "res" {\n  source = "../security-groups"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这种方法的问题是,当我在实例文件夹中执行 terraform apply 时,它也会尝试创建安全组(我已经通过在安全组文件夹中执行 terraform apply 创建了安全组),但它失败了,因为 SG 是现存的。

\n

在不更改代码结构的情况下引用在不同文件夹中创建的资源的最简单方法是什么?

\n

谢谢。

\n

lxo*_*xop 11

要引用现有资源,您需要使用data块。您不会直接引用其他文件夹中的资源块,而是指定名称或 ID 或它具有的任何其他唯一标识符。因此,对于安全组,您可以添加类似的内容

data "aws_security_group" "sg" {
  name = "the-security-group-name"
}
Run Code Online (Sandbox Code Playgroud)

到您的实例文件夹,并引用该实体将您的实例与该安全组关联。

您还应该考虑是否真的只想将 terraform 应用于整个树,而不是分别应用于每个文件夹。然后,您可以像您尝试做的那样直接在所有托管资源之间进行引用,而不必terraform apply多次调用。


sko*_*oll 8

虽然 lxop 的答案是更好的做法,但如果您确实需要引用另一个本地文件夹中的输出,您可以这样做:

data "terraform_remote_state" "sg" {
  backend = "local"

  config = {
    path = "../security-groups/terraform.tfstate"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用例如引用它

locals {
  sgId = data.terraform_remote_state.sg.outputs.sg_id
}
Run Code Online (Sandbox Code Playgroud)