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

如何用Terraform保留AWS API Gateway部署历史并实现回滚?

实现API Gateway部署历史保留与Terraform回滚

当前配置问题

你当前使用单个aws_api_gateway_deployment资源的方式,Terraform会将其视为单一资源管理,每次触发新部署时都会替换旧部署,无法保留历史版本。


1. 保留最近几个部署历史

要保留部署历史,需修改配置让Terraform管理多个独立的部署资源,而非替换单个资源:

配置示例

# 定义需要保留的部署数量
variable "keep_deployment_count" {
  type        = number
  description = "保留的API Gateway部署版本数量"
  default     = 3
}

# 维护部署版本标识列表,新增部署时往末尾添加新值,超出保留数量的旧值可移除
variable "deployment_versions" {
  type        = list(string)
  description = "需保留的部署版本标识(如v1、v2)"
  default     = ["v1", "v2", "v3"]
}

# 批量创建部署资源,每个版本对应一个独立部署
resource "aws_api_gateway_deployment" "history" {
  for_each = toset(var.deployment_versions)

  rest_api_id = aws_api_gateway_rest_api.this
  description = "部署版本: ${each.key}"

  triggers = {
    redeploy = filebase64sha256("api-gateway.tf")
  }

  lifecycle {
    prevent_destroy = true  # 防止Terraform意外销毁旧部署
    create_before_destroy = true
  }

  depends_on = [
    aws_api_gateway_integration.api_integration,
  ]
}

操作逻辑

  • 每次需要新部署时,在deployment_versions列表末尾添加新的版本标识(如"v4")
  • 若需自动清理旧部署,将列表中超出keep_deployment_count数量的最早版本移除(比如保留3个时,移除"v1")
  • 执行terraform apply后,会创建新部署,同时移除被删除标识对应的旧部署(若已移除),最终保留指定数量的历史版本

2. 通过Terraform回滚到旧部署

回滚核心是将API Stage关联的部署ID切换为旧版本的部署ID,有两种实现方式:

方式1:直接引用已管理的旧部署资源

修改aws_api_gateway_stage的deployment_id,指向列表中对应的旧部署资源:

resource "aws_api_gateway_stage" "deploy_stage" {
  # 把"v2"替换为你要回滚的版本标识
  deployment_id = aws_api_gateway_deployment.history["v2"].id
  rest_api_id   = aws_api_gateway_rest_api.this.id
  stage_name    = var.stage_name
}

执行terraform apply后,Stage会立即切换到该旧部署版本。

方式2:引用未在Terraform配置中的旧部署

如果旧部署未在当前配置的deployment_versions列表中,可以通过数据资源直接获取已有部署ID:

# 读取AWS中已存在的旧部署
data "aws_api_gateway_deployment" "old_deployment" {
  rest_api_id = aws_api_gateway_rest_api.this.id
  deployment_id = "d-ABCDE12345"  # 替换为实际的旧部署ID
}

# 切换Stage到旧部署
resource "aws_api_gateway_stage" "deploy_stage" {
  deployment_id = data.aws_api_gateway_deployment.old_deployment.id
  rest_api_id   = aws_api_gateway_rest_api.this.id
  stage_name    = var.stage_name
}

执行terraform apply即可完成回滚。


内容的提问来源于stack exchange,提问作者Croad Langshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:04:59