You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:12:42