使用Terraform创建AWS IoT主题规则时调用topic()内置函数的方法
解决方案:Terraform中调用AWS IoT内置函数
错误原因
你当前的写法是让Terraform直接解析topic(3),但topic()是AWS IoT规则引擎的SQL内置函数,并非Terraform的内置函数,因此Terraform会报错“不存在名为'topic'的函数”。需要将AWS IoT的表达式作为字符串传递给AWS服务端,由AWS来执行这些函数。
修正后的代码示例
有两种可行的写法:
方法1:使用转义美元符号
在Terraform字符串中,用$${}代替${},让Terraform将其解析为单个${}传递给AWS IoT:
resource "aws_iot_topic_rule" "rule" { # 其他必填配置(如name、sql等) kafka { # 其他Kafka配置(如topic_arn等) key = "$${sha1(topic(3))}" } }
方法2:使用单引号包裹字符串
HCL的单引号字符串不会解析内部的$符号,可直接传递原始表达式给AWS IoT:
resource "aws_iot_topic_rule" "rule" { # 其他必填配置(如name、sql等) kafka { # 其他Kafka配置(如topic_arn等) key = '${sha1(topic(3))}' } }
原理说明
两种写法的核心都是让Terraform不尝试解析AWS IoT的内置函数,而是将完整的表达式字符串传递给AWS IoT服务。AWS IoT规则引擎接收到表达式后,会识别并执行topic(3)这类内置函数,完成计算后将结果作为Kafka消息的key使用。
内容的提问来源于stack exchange,提问作者Eyal Solomon
相关产品推荐
相关产品推荐

