如何在Terraform中基于对象列表创建AWS状态机动态定义?
结论:你的写法不可行,需修正Terraform for表达式语法
你当前的for循环写法不符合Terraform的语法规范,Terraform生成动态map时,必须使用key => value的结构来明确键值映射关系,而不是直接在循环体里写state.name = { ... }。
正确实现示例
修正后的Terraform代码如下:
resource "aws_sfn_state_machine" "this" { name = "my-state" role_arn = "my-role" definition = jsonencode({ Comment = var.definition_comment StartAt = var.definition_startat States = { # 用 => 关联动态键(state.name)和状态配置对象 for state in var.state_object_list : state.name => { Type = state.type Resource = state.resource End = state.end # 补充:非终止状态必须指定Next,这里按示例逻辑添加,可按需调整 Next = state.end ? null : (state.name == "task1" ? "task2" : null) } } }) }
关键注意点
- 必须使用
state.name => { ... }的格式生成States对象的键值对,这是Terraform for表达式生成map的标准语法 - 你的原始状态列表中,
task1的end为false但未指定Next,这会导致状态机定义无效(Step Functions要求非终止状态必须有后续跳转),示例中补充了基础的Next逻辑,你可以根据实际流程调整(比如按列表顺序自动关联下一个状态) - 确保
var.state_object_list的每个元素都包含name、type、resource、end字段,避免出现字段缺失错误
内容的提问来源于stack exchange,提问作者andrea-anf
相关产品推荐
相关产品推荐

