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

时间:2018-02-21 16:21:28

标签: amazon-web-services terraform

我的项目的terraform结构是:

import subprocess
import os


errors = 0
num_workers = 40
N = 100
assigned = 0
completed = 0
processes = set()

while completed < N:
    if assigned < N:
        p = subprocess.Popen(['false'])
        processes.add((assigned, p))
        assigned += 1
    if len(processes) >= num_workers or assigned == N:
        os.wait()

    for i, p in frozenset(processes):
        if p.poll() is not None:
            completed += 1
            processes.remove((i, p))
            err = p.returncode
            print(i, err)
            if err != 0:
                errors += 1

print(f"There were {errors}/{N} errors")

policy1.tf包含多个策略等:

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

roles1.tf包含多个角色等:

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

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

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

1 个答案:

答案 0 :(得分:1)

您不能在目录之间进行此类引用,因为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的警告,除非您完全确定您正在做什么,因为它会将策略从其恰好附加的任何其他内容中分离出来。如果您想采用托管策略并将其附加到N个角色,我建议您使用aws_iam_role_policy_attachment,而不是相反。

相关问题