Terraform 动态数据策略内容

Terraform 动态数据策略内容,terraform,terraform-provider-aws,terraform0.12+,Terraform,Terraform Provider Aws,Terraform0.12+,请帮助理解如何创建这样的东西 data "aws_iam_policy_document" "assume_role_policy" { statement { actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["ec2.amazonaws.com&qu

请帮助理解如何创建这样的东西

data "aws_iam_policy_document" "assume_role_policy" {
  statement {
    actions = ["sts:AssumeRole"]
    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com"]
    }
  }

  dynamic "statement" {
    for_each     = var.assume_role_identities != [] ? [true] : []
    content {
      actions = ["sts:AssumeRole"]
      principals {
        type        = "AWS"
        identifiers = var.assume_role_identities
      }
    }
  }

  dynamic "statement" {
    for_each     = var.assume_role_services != [] ? [true] : []
    content {
      actions = ["sts:AssumeRole"]
      principals {
        type        = "Service"
        identifiers = var.assume_role_services
      }
    }
  }
}
这段代码的问题是,如果我不指定任何应该有访问权的角色或服务,那么这是一个没有主体的错误退出。 是否可以在动态块上设置一些计数条件?或者如何解决这个问题

问题说明:

问题是,如果我只想传递某个值,它将不起作用,导致它形成一个空值

如果我只添加身份记录,这就是terraform在这个案例中的应用

  + assume_role_policy    = jsonencode(
        {
          + Statement = [
              + {
                  + Action    = "sts:AssumeRole"
                  + Effect    = "Allow"
                  + Principal = {
                      + Service = "ec2.amazonaws.com"
                    }
                  + Sid       = ""
                },
              + {
                  + Action    = "sts:AssumeRole"
                  + Effect    = "Allow"
                  + Principal = {
                      + AWS = "arn:aws:iam::account_id:user/some_user"
                    }
                  + Sid       = ""
                },
              + {
                  + Action    = "sts:AssumeRole"
                  + Effect    = "Allow"
                  + Principal = {
                      + Service = []
                    }
                  + Sid       = ""
                },
            ]
          + Version   = "2012-10-17"
        }
    )
由此产生的问题是:

创建IAM角色名称时出错角色:格式错误策略文档:无效 策略中的主体:com.amazon.balsa.error.InvalidPolicyException: 传入的策略有一个没有主体的语句


这应该可以做到:

data "aws_iam_policy_document" "assume_role_policy" {
  statement {
    actions = ["sts:AssumeRole"]
    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com"]
    }
  }

  dynamic "statement" {
    for_each     = length(var.assume_role_identities) > 0 ? [var.assume_role_identities] : []
    content {
      actions = ["sts:AssumeRole"]
      principals {
        type        = "AWS"
        identifiers = var.assume_role_identities
      }
    }
  }

  dynamic "statement" {
    for_each     = length(var.assume_role_services) > 0 ? [var.assume_role_services] : []
    content {
      actions = ["sts:AssumeRole"]
      principals {
        type        = "Service"
        identifiers = var.assume_role_services
      }
    }
  }
}

您不需要第一条语句,您可以将其作为参数传递给var。假设\u role\u services

这应该可以做到:

data "aws_iam_policy_document" "assume_role_policy" {
  statement {
    actions = ["sts:AssumeRole"]
    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com"]
    }
  }

  dynamic "statement" {
    for_each     = length(var.assume_role_identities) > 0 ? [var.assume_role_identities] : []
    content {
      actions = ["sts:AssumeRole"]
      principals {
        type        = "AWS"
        identifiers = var.assume_role_identities
      }
    }
  }

  dynamic "statement" {
    for_each     = length(var.assume_role_services) > 0 ? [var.assume_role_services] : []
    content {
      actions = ["sts:AssumeRole"]
      principals {
        type        = "Service"
        identifiers = var.assume_role_services
      }
    }
  }
}

您不需要第一条语句,您可以将它作为参数传递给var。假设\u role\u services

我不确定我是否理解这个问题。请分享您的输入和预期输出,然后分享当前正在生成的内容以及为什么不是您想要的内容?如果它有错误,那么将错误也包括在你的问题中也会很有用。你已经有了for_的条件,不需要计数。正如@ydaetskcoR所建议的,您对var.aspect\u role\u标识和var.aspect\u role\u服务的输入是什么。您是否尝试将空列表传递给这些VAR?我猜其目的是为所有角色标识(如果提供)提供一个语句块,然后为所有服务(如果提供)提供另一个语句块,这样做是有意义的,但如果不扩展问题,则很难判断。很抱歉@ydaetskcoR出现混淆。添加了problem@Nick这就是我不能给出空值的问题。增加了问题的例子我不确定我是否理解这个问题。请分享您的输入和预期输出,然后分享当前正在生成的内容以及为什么不是您想要的内容?如果它有错误,那么将错误也包括在你的问题中也会很有用。你已经有了for_的条件,不需要计数。正如@ydaetskcoR所建议的,您对var.aspect\u role\u标识和var.aspect\u role\u服务的输入是什么。您是否尝试将空列表传递给这些VAR?我猜其目的是为所有角色标识(如果提供)提供一个语句块,然后为所有服务(如果提供)提供另一个语句块,这样做是有意义的,但如果不扩展问题,则很难判断。很抱歉@ydaetskcoR出现混淆。添加了problem@Nick这就是我不能给出空值的问题。添加了问题的示例