terraform - 当 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" {
解决方案
看起来这个策略在为空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
。
推荐阅读
- javascript - 需要帮助让 1 行被 Jest (React) 覆盖
- javascript - 如何在动画画布html之前加载图像
- docker - 适用于 Windows 的 Docker 桌面 - 无法在本地硬盘驱动器上创建持久卷
- java - 如何在java中从逗号分隔的字符串值创建一个json?
- generics - Haxe @:generic 导致编译器错误?
- c# - GroupBy 后投影到没有 .ToList() 的域模型
- javascript - 在移动设备上使用 AR.js 时,相机缩放过多
- kriging - gstat 中的克里金法
- assembly - 除法程序集 8086 中的奇怪结果
- javascript - 如何检查数据/有效负载是否可以被protobuf解码