使用Terraform 0.13执行旧0.11模块plan时遇cannot decode dynamic from flatmap错误求助
解决Terraform 0.13迁移时"cannot decode dynamic from flatmap"错误
这个错误源于Terraform 0.12+对类型系统的严格升级,0.11版本的状态文件或远程状态输出未明确类型,导致0.13无法解析动态类型数据。结合你的代码,重点排查以下几点并解决:
1. 显式转换远程状态输出类型
你的代码中引用远程状态的security_group_id字段未明确类型,0.13无法自动将0.11生成的动态值解码为字符串。修改代码,使用tostring()函数强制转换类型:
resource "aws_security_group_rule" "allow_mysql_from_server" { type = "ingress" protocol = -1 from_port = 3306 to_port = 3306 source_security_group_id = aws_security_group.ecs_fargate.id security_group_id = tostring(data.terraform_remote_state.database.outputs.rds["security_group"]) }
2. 升级远程状态源模块(根本解决)
如果条件允许,将生成远程状态的数据库模块(原0.11版本)升级到Terraform 0.12或0.13版本,重新执行terraform apply:
- 在数据库模块的
outputs.tf中添加明确的类型定义,例如:output "rds" { type = map(string) value = { security_group = aws_db_instance.default.vpc_security_group_ids[0] } } - 升级后生成的状态文件会符合0.13的类型规范,彻底避免解码错误。
3. 排查其他动态类型引用
检查代码中其他从0.11遗留的变量、输出或资源引用,确保所有值都有明确的类型(如字符串、列表、映射),避免动态类型导致的解码问题。
内容的提问来源于stack exchange,提问作者harshainfo
相关产品推荐
相关产品推荐

