Terraform 基于使用count创建的值获取资源

Terraform 基于使用count创建的值获取资源,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我在aws提供商v2.34.0中使用Terraform v12.19。 想象一下,我生成了一个具有计数值的资源: resource "aws_iam_role" "role" { count = length(var.somevariable) name = var.somevariable[count.index] } 稍后,我想以这种方式引用一个特定的资源实例,例如。g、 : resource "aws_iam_role_policy_attachment" "polatt" {

我在aws提供商v2.34.0中使用Terraform v12.19。 想象一下,我生成了一个具有计数值的资源:

resource "aws_iam_role" "role" {
  count = length(var.somevariable)
  name = var.somevariable[count.index]
}
稍后,我想以这种方式引用一个特定的资源实例,例如。g、 :

resource "aws_iam_role_policy_attachment" "polatt" {
  role       = aws_iam_role.role["TheRoleNameIWant"].id
  policy_arn = "arn:aws:iam::aws:policy/..."
}
我不知道索引,我只能依靠变量提供的名称。这是因为变量的值是由外部源提供的,并且顺序可能会改变


有没有办法做到这一点?

您应该能够使用index terraform功能完成这一点

下面是一个使用null_资源进行测试的最小示例

locals {
  role_names = [
    "role-a",
    "role-b",
    "role-c",
    "role-d",
  ]

  target_role_name = "role-c"
}

resource "null_resource" "hi" {
  count = length(local.role_names)
}

output "target_resource" {
  value = null_resource.hi[index(local.role_names, local.target_role_name)].id
}

output "all_resources" {
  value = [for r in null_resource.hi : r.id]
}
例如,这是一个输出

all_resources = [
  "4350570701002192774",
  "9173388682753384584",
  "1634695740603384613",
  "2098863759573339880",
]
target_resource = 1634695740603384613
我想你的例子应该是

resource "aws_iam_role_policy_attachment" "polatt" {
  role       = aws_iam_role.role[index(var.somevariable, "TheRoleNameIWant")].id
  policy_arn = "arn:aws:iam::aws:policy/..."
}
使现代化 您在下面的评论中提到,实际上您的数据结构比名称列表更复杂。我只想提一下,您可以从JSON结构派生名称

假设你有如下的东西

variable "role_values" {
  value = [
    {
      name = "foo",
      other = "details",
      fields = 3
    },
    {
      name = "bar",
      other = "yet more details",
      fields = 3
    }
  ]
}
您可以使用本地和较新的for循环TF 0.12来派生名称

locals {
  role_names = [for role in var.role_values: role.name]
}

这样您就不必存储两次名称。

使用for_each而不是count。好的,我将问题简化了一点。我在资源中已经有一个动态块,每个块使用一个for_。我不认为对每个语句都使用嵌套语句是可能的。为什么你不认为这是可能的呢?你试过了吗?这样做时是否会收到错误消息?如果是这样的话,将其添加到问题中可能会很有用。不管for_each:如果该角色是使用for_each创建的,我将如何引用该角色?这里的这一行:role=aws\u iam\u role.role.mydynamicrolename.id这应该如何工作?是的,现在以类似的方式解决了它。var.somevariable是字符串的名称。在我的例子中,我没有字符串,事实上它后面是一个json文件,但是如果你只为索引单独存储名称,一切都会正常工作。非常感谢您的回答@Stefan啊是的,更复杂的数据结构使它更复杂。我将更新我的答案,提及你如何做到这一点。