我有一个像这样声明的AWS WAFv2 Web ACL日志配置
resource "aws_wafv2_web_acl_logging_configuration" "logging_configuration" {
count = var.enable_logging && var.waf_s3_log_bucket_id != "" ? 1 : 0
log_destination_configs = [aws_kinesis_firehose_delivery_stream.waf_log_stream.*.arn[0]]
resource_arn = aws_wafv2_web_acl.waf.arn
depends_on = [aws_kinesis_firehose_delivery_stream.waf_log_stream]
}
这段代码可以工作,但是linter给了我一个警告,当引用列表中的项时不要使用已弃用的*符号,而是使用方括号符号。所以我改了
log_destination_configs = [aws_kinesis_firehose_delivery_stream.waf_log_stream[count.index].arn[0]]
当我执行terraform plan
时,它现在运行,但然后给我这个错误
错误:无效索引
aws_kinesis_firehose_delivery_stream。Waf_log_stream是包含一个元素的元组
计数。索引为0
该值没有任何索引。
我理解错误,但有两件事让我困惑
如果计数为0,则不应该创建该资源。如果是这样的话,为什么会被Terraform标记?
如果count不为0,那么我得到的错误应该不存在。为什么Terraform CLI给我这个错误?
谁能告诉我这里的问题是什么,我该如何解决这个问题?
我一直在四处闲逛,试图让它工作,以了解发生了什么,并取得了一些发现。
<标题>TLDR:解决方案正确解决我的问题是将log_destination_configs
参数改为log_destination_configs = [aws_kinesis_firehose_delivery_stream.waf_log_stream[count.index].arn]
不幸的是,来自Terraform的错误消息不清楚是哪个索引导致了令人讨厌的错误。它不是指[count.index]
部分,而是指最后的arn[0]
。
问题源于我对引用使用count
的对象实例的点表示法语法缺乏理解。
为了更好地理解这一点,让我们用一个更简单的例子:
假设我有一个使用count的aws_instance资源,并且我将count设置为2。aws_instance的第一个实例是aws_instance.server[0]
,第二个实例是aws_instance.server[1]
。
方括号很清楚地表明,它正在尝试访问列表中基于索引号的特定元素。
在我的例子中,"*"表示该属性的所有元素的列表。您可以在v0.11文档中的Terraform示例中看到这一点。
所以我得到的基本上是脚本将生成的所有消防水带交付流的整个列表(在我的情况下是最大值为1)。如果此值更高,您将看到如何需要第二个方括号来引用我所引用的消防水带交付流ARN的确切实例。
因为我已经改变了语法来使用[count.index]
,返回的元素不再是所有消防水带交付流的列表,而是消防水带交付流的每个实例;在本例中,"arn"旁边的方括号将不再有意义,因为ARN是字符串而不是列表。