如何在硬编码对象列表使用Terraform for_each并解决algolia索引配置报错
报错解读与修复方案
错误原因
你遇到的Attribute supports 1 item maximum, but config has 2 declared报错,是因为在algolia_index资源中重复声明了2次ranking_config配置块。你使用的k-yomo/algolia@0.2.1 provider设计中,ranking_config字段为单例配置,最多只能存在1个块,重复声明就会触发该错误。
你代码中的重复配置如下:
# 硬编码的第一个ranking_config,属于冗余配置,需要删除 ranking_config { ranking = [ "typo", "geo", "words", "filters", "proximity", "attribute", "exact", "custom" ] custom_ranking = [ "asc(has_ranking_malus)", "desc(score_a)", "asc(price)", "desc(has_free_delivery)", "desc(rating)", "desc(rating_count)" ] } # 动态读取each.value的第二个ranking_config,保留即可 ranking_config { ranking = each.value["ranking"] custom_ranking = each.value["custom_ranking"] replicas = each.value["replicas"] }
修复方法
直接删除上述第一个硬编码的ranking_config块即可。你已经在for_each的遍历map中为每个索引定义了专属的ranking、custom_ranking、replicas参数,只保留动态读取each.value的第二个配置块就能覆盖所有场景的配置需求。
历史状态迁移说明
报错重复出现8次正好对应你之前未用for_each时定义的8个存量资源,是因为改为for_each实现后,Terraform识别的资源地址发生了变化:
- 原地址示例:
module.de-b2b-dev-index.algolia_index.index - 新地址示例:
module.de-b2b-dev-index.algolia_index.product_indexes["dev_products_de"]
如果你不希望Terraform销毁原有索引再重建,可以使用terraform state mv命令迁移存量状态到新地址,示例命令如下:
# 迁移dev环境主索引状态 terraform state mv module.de-b2b-dev-index.algolia_index.index 'module.de-b2b-dev-index.algolia_index.product_indexes["dev_products_de"]'
按照相同规则替换剩余7个资源的新旧地址,依次执行命令即可完成状态迁移。
代码复用方案评估
你当前用for_each批量声明4个高度相似资源的方式是Terraform官方推荐的最佳实践:
- 所有公共配置(typos_config、pagination_config等通用块)只需要编写一次,不会出现冗余
- 后续新增索引变体时,仅需要在
for_each的map中新增对应配置项即可,维护成本极低 - 比复制粘贴4份资源块、封装多个子模块的方案可维护性高很多
内容的提问来源于stack exchange,提问作者greg0ire
相关产品推荐
相关产品推荐

