首页 > 解决方案 > 当 for_each 为空时,忽略动态资源

问题描述

我的 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_statements 为空列表或什么都没有时,我在运行时收到以下错误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" {

标签: terraformterraform-provider-aws

解决方案


看起来这个策略在为空aws_iam_policy.task_role时仍在资源中被引用。var.policy_statements

这将导致aws_iam_policy.task_role创建一个空的Statement(这会导致您看到的格式错误的策略错误)。

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

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

  // Your other args here...
}

这可能会对其他资源(例如消耗 的资源aws_iam_policy.task_role)产生级联影响。您需要通过提供不会破坏的默认值或在其中添加一个来处理这些效果count


推荐阅读