当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" {

var.policy_statements为空时,此策略似乎仍在aws_iam_policy.task_role资源中引用。

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

我建议在策略本身上设置一个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来处理这些影响。

这是Stevemao回答的稍微简洁的版本

resource "aws_iam_policy" "task_role" {
count = min(length(var.policy_statements), 1)
// Your other args here...
}

相关内容

  • 没有找到相关文章

最新更新