如何检测Terraform是否将创建资源并解决aws_lambda_invocation的for_each报错
问题根因
该报错的核心是Terraform要求
for_each遍历的映射/集合的所有键必须在规划阶段就能完全确定,你当前的local.backup_map的键的存在性依赖了aws_instance的arn、root_block_device.tags这类只有实例创建完成后才会生成的运行时属性,新增实例时Terraform无法在规划阶段判断这些新实例是否会被纳入backup_map,因此抛出错误。你新增的can(aws_instance.centralized_node[node].arn)判断仍然依赖了实例的运行时属性,无法解决规划阶段键集合未知的问题。
解决方案
方案1:重构遍历逻辑(长期最优方案)
把for_each的遍历源改为你静态配置的、规划阶段就能确定的节点集合,将实例运行时属性的判断逻辑下移到Lambda调用的入参中,避免用运行时属性决定for_each的键集合:
locals { # 仅用静态配置的标签过滤出需要备份的节点,该映射的键在规划阶段完全确定 backup_candidates = { for node in keys(local.centralized_nodes) : node => node if can(local.tags_map[node]["backup"]) } } data "aws_lambda_invocation" "lambda_backup" { # 用静态确定的候选集合作为for_each遍历源 for_each = local.backup_candidates function_name = "lambdafunc" # 运行时属性判断放到入参中,不符合条件则传入空资源列表,Lambda侧自行忽略空输入即可 input = jsonencode({ "resources" = try( [ aws_instance.centralized_node[each.key].arn if !can(aws_instance.centralized_node[each.key].root_block_device.0.tags["backup"]) ], [] ) }) }
该方案不需要调整工作流,完全符合你只对已创建实例调用Lambda的需求。
方案2:拆分Apply操作(适合新增节点频率低的场景)
如果不想修改现有配置,每次新增节点时可以分两步执行apply:
- 先单独Apply新增的实例资源,等待实例创建完成:
# 替换为你新增的节点key terraform apply -target=aws_instance.centralized_node["your_new_node_key"]
- 实例创建完成后执行全量Apply,此时新实例的ARN等属性已经存在,不会再抛出未知值错误:
terraform apply
内容的提问来源于stack exchange,提问作者Ihor Porokhnia
相关产品推荐
相关产品推荐

