为何Terraform每次部署都会替换aws_api_gateway_deployment(触发器值看似不变)
Terraform API Gateway 重复部署问题解决
问题根源
你猜的没错——Terraform 不会保证映射(字典)类型的键值顺序,jsonencode 处理映射时,哪怕键值对完全没变,每次生成的 JSON 字符串键的排列顺序都可能不一样。这就导致你拼接后的字符串每次都有差异,sha1 哈希值跟着变,最终触发了不必要的重新部署。
修复方案
要解决这个问题,关键是让映射转 JSON 时的键顺序固定下来。可以用 sort 函数先对映射的键进行排序,再按固定顺序生成键值对:
修改后的代码如下:
resource "aws_api_gateway_deployment" "api_gateway" { rest_api_id = aws_api_gateway_rest_api.api_gateway.id triggers = { redeployment = sha1(join(",", [ jsonencode(local.rendered_openapi), jsonencode({ for k in sort(keys(data.aws_default_tags.default_tags)) : k => data.aws_default_tags.default_tags[k] if k != "DeploymentId" }) ])) } lifecycle { create_before_destroy = true } }
关键改动说明
- 用
sort(keys(data.aws_default_tags.default_tags))获取排序后的键列表,确保键的顺序固定 - 基于排序后的键生成新映射,这样
jsonencode输出的 JSON 键顺序始终一致,哈希值也就稳定了,不会再触发无意义的部署
内容的提问来源于stack exchange,提问作者Shuzheng
相关产品推荐
相关产品推荐

