如何用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
相关产品推荐
相关产品推荐

