如何在 terraform 中引用另一个文件夹的目标

How to refer target of another folder in terrform

我项目的terraform结构是:

iam/policies/policy1.tf
iam/roles/roles1.tf

policy1.tf包括几个政策等:

resource "aws_iam_policy" "policy1A" {
  name   = "..."
  policy = "${data.template_file.policy1ATempl.rendered}"
}

roles1.tf包括几个角色等:

resource "aws_iam_role" "role1" {
  name               = ....
  assume_role_policy = ....
}

现在我想将 policy1A 附加到 role1。由于 policy1 和 role1 不在同一个文件夹中,我该如何附加它们?

resource "aws_iam_policy_attachment" "attach1" {
  name       = "attachment1"
  roles      = ??? (sth. like ["${aws_iam_role.role1.name}"])
  policy_arn = ??? (sth. like "${aws_iam_policy.Policy1.arn}")
}

您不能像这样跨目录进行引用,因为 Terraform 一次只能在一个目录中工作。如果您确实需要将它们分成不同的文件夹(我不建议在这里这样做),那么通常您会使用数据源来检索有关已创建资源的信息。

在这种情况下,尽管 aws_iam_policy data source 目前几乎没有用,因为它需要策略的 ARN 而不是路径或名称。相反,如果您知道策略名称,则可以构造它,因为它符合众所周知的模式。您显然知道要将策略附加到的角色的名称,并且您知道策略的名称以便涵盖这些内容。

data "aws_caller_identity" "current" {}

resource "aws_iam_policy_attachment" "attach1" {
  name       = "attachment1"
  roles      = "role1"
  policy_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:policy/policy1A"
}

上面的示例确实简要展示了如何使用数据源,因为它使用 aws_caller_identity data source 获取 AWS 账户 ID,并动态使用它来构建您尝试附加的策略的 ARN。

我会回应文档中关于使用资源 aws_iam_policy_attachment unless you are absolutely certain with what you're doing because it will detach the policy from anything else it happens to be attached to. If you want to take a managed policy and attach it to N roles I would instead recommend using aws_iam_role_policy_attachment 的警告,而它就像。