Terraform 当for_每个为空时,忽略动态资源

Terraform 当for_每个为空时,忽略动态资源,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我的main.tf中有以下内容: data "aws_iam_policy_document" "task_role_policy" { dynamic "statement" { for_each = var.policy_statements content { actions = statement.value.actions resources = statement.value.resources effect = "A

我的main.tf中有以下内容:

data "aws_iam_policy_document" "task_role_policy" {
  dynamic "statement" {
    for_each = var.policy_statements
    content {
      actions   = statement.value.actions
      resources = statement.value.resources
      effect    = "Allow"
    }
  }
}
当var.policy_语句为空列表或为空时,我在运行
terraform apply
时出现以下错误:

Error: Error creating IAM policy dev-chatbot-engine-policy: MalformedPolicyDocument: Syntax errors in policy.
    status code: 400, request id: a181b065-b659-4261-87d5-9aae8c4454aa

  on .terraform/modules/service/main.tf line 68, in resource "aws_iam_policy" "task_role":
  68: resource "aws_iam_policy" "task_role" {

var.policy\u语句
为空时,
aws\u iam\u策略.任务角色
资源中似乎仍在引用此策略

这将导致使用空的
语句创建
aws\u iam\u policy.task\u role
(这将导致您看到格式错误的策略错误)

我建议在策略本身上设置一个
count
标志,这样它甚至不会在语句为空时尝试创建它,例如

resource "aws_iam_policy" "task_role" {
  count = length(var.policy_statements) == 0 ? 0 : 1

  // Your other args here...
}

这可能会对其他资源(例如使用
aws\u iam\u policy.task\u role
)产生级联效应。您需要通过提供不中断的默认值或在那里添加
计数来处理这些效果。

我们可以看到资源的代码吗?没有资源代码。该块动态生成
aws\u iam\u policy\u文档
,但我的
var.policy\u语句
可能为空或为零。它应该跳过生成任何
aws_iam_policy_文档
,而是出现错误。在创建名为“task_role”的iam策略时,此错误似乎来自应用步骤中的远程iam API。在应用该资源并获得此错误之前,您是否能够在计划输出中看到该资源的
策略
值?如果是这样的话,这将有助于共享您问题中的
aws\u iam\u policy.task\u role
资源的完整计划,以查看
aws\u iam\u policy\u文档
数据资源在此生成的确切内容,以及iam API可能反对的内容。当
var.policy\u语句
为空时,我不想生成任何
策略
,因此它不应该调用IAM API。是的,我们就是这样解决的:)