6

我正在尝试使用同级目录中的特定代码,但这样做时遇到了一些麻烦。例如,请参阅下文了解我的文件的结构:

parents/
    brother/
        main.tf
        outputs.tf
        variables.tf
    sister/
        main.tf
        outputs.tf
        variables.tf

我想使用我在其中创建的定义,但我brother/main.tf似乎sister/main.tf无法找出正确的方法。我曾尝试使用模块:

module "brother" {
    source = "../brother"
}

这样做行得通,但它没有。我能够导入和使用代码,但由于某种原因,terraform 正在使用新的模块名称(如果有任何意义的话)创建一堆具有新资源名称的其他资源。从本质上讲,它创建了所需的资源,但也创建了 100 多个其他不需要的资源。

通过将我想要使用的定义放在同一个sister目录中,我可以很容易地让它工作,但这不是我想要构造我的文件的方式。这样做的正确方法是什么?如果我有一个在 中定义的 IAM 角色brother,并且我想在 中引用它sister,我该怎么做?提前致谢!

编辑:

当前代码:

姐姐/main.tf

resource "aws_config_config_rule" "test-rule" {
  name = "test-rule"

  source {
    owner             = "AWS"
    source_identifier = "TEST"
  }

  depends_on = ["aws_config_configuration_recorder.config_configuration_recorder"]
}

resource "aws_config_configuration_recorder" "config_configuration_recorder" {
  name     = "config_configuration_recorder"
  role_arn = "${var.test_assume_role_arn}"
}

兄弟/main.tf

resource "aws_iam_role" "test_assume_role" {
    name               = "${var.test_assume_role_name}"
    path               = "/"
    assume_role_policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "config.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
POLICY
}

所以基本上,我希望能够test_assume_rolesister/main.tf.

4

2 回答 2

6

当您需要另一个模块时,它将重新创建这些资源。听起来您想引用已创建资源的状态。您可以使用远程状态数据源来做到这一点。

这允许您读取另一个状态的输出,但不会创建额外的资源

data "terraform_remote_state" "brother" {
  backend = "..."
}

resource "aws_instance" "sister" {
  # ...
  subnet_id = "${data.terraform_remote_state.brother.my_output}"
}
于 2018-04-10T08:14:14.983 回答
1

除了将资源的属性输出到 Terraform 状态并将其与terraform_remote_state数据源一起读取之外,另一种方法是在可能的情况下首先为您的资源使用适当的数据源。

在这种情况下,您可以使用aws_iam_role数据源按名称查找 IAM 角色的 ARN:

data "aws_iam_role" "example" {
  name = "an_example_role_name"
}
于 2018-04-12T09:10:52.653 回答