我的项目的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 = ....
}
答案 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
,而不是相反。