Terraform 当for_每个为空时,忽略动态资源
我的main.tf中有以下内容: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
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。是的,我们就是这样解决的:)