4. 蓝绿环境准备:基础设施即代码(IaC)、Terraform创建蓝绿环境、环境标签管理

蓝绿发布的核心前提是存在两套独立、对等且可随时切换的生产环境。传统手动搭建环境的方式耗时且易出错,无法满足快速迭代与回滚的需求。本章将基于基础设施即代码(IaC)理念,使用 Terraform 实现蓝绿环境的自动化创建与标签管理,确保环境的一致性与可追溯性。

4.1 基础设施即代码(IaC)在蓝绿发布中的价值

IaC 将网络、计算、存储等基础设施的配置以声明式代码管理,与应用程序代码一同纳入版本控制。在蓝绿发布中,IaC 带来以下关键优势:

  • 环境一致性:蓝绿两套环境由同一套 Terraform 配置生成,消除配置漂移。
  • 快速创建与销毁:通过代码即可在数分钟内完成整套环境的部署或回收。
  • 版本化回滚:环境配置的历史版本可追溯,回滚时只需切换 Terraform 状态。
  • 自动化集成:与 CI/CD 流水线结合,实现环境创建、部署、切换的全自动化。
核心原则:蓝绿环境必须是对等的(identical),任何差异都可能导致发布或回滚失败。IaC 是保障对等性的唯一可靠手段。

4.2 Terraform 创建蓝绿环境的核心架构

使用 Terraform 管理蓝绿环境时,通常采用工作区(Workspace)或模块化目录两种模式。对于生产级蓝绿发布,推荐使用模块化目录 + 环境变量的方式,将蓝(blue)和绿(green)视为同一 Terraform 配置的两个独立实例,通过不同的状态文件(state)隔离。

下图展示了基于 Terraform 的蓝绿环境创建逻辑:

Terraform 蓝绿环境创建架构 Terraform 蓝绿环境创建架构 Terraform 配置仓库 环境变量输入 env=blue / env=green 独立状态文件 blue.tfstate / green.tfstate terraform apply -var="environment=blue" 蓝环境 (Blue) VPC / 子网 / 安全组 ECS / ALB / RDS 绿环境 (Green) VPC / 子网 / 安全组 ECS / ALB / RDS 通过变量 environment 区分蓝绿,共享同一套 Terraform 代码,但使用独立状态文件

4.3 使用 Terraform 创建蓝绿环境:关键代码示例

以下是一个简化的 Terraform 配置示例,展示如何通过变量控制创建蓝或绿环境。实际生产环境中,该配置会包含 VPC、子网、安全组、负载均衡器、计算实例和数据库等完整资源。

# variables.tf
variable "environment" {
  description = "指定环境名称:blue 或 green"
  type        = string
  validation {
    condition     = contains(["blue", "green"], var.environment)
    error_message = "环境名称必须为 blue 或 green。"
  }
}

variable "region" {
  default = "cn-north-1"
}

# main.tf
provider "aws" {
  region = var.region
}

# 根据环境名称创建独立的 VPC
resource "aws_vpc" "main" {
  cidr_block           = var.environment == "blue" ? "10.0.0.0/16" : "10.1.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name        = "vpc-${var.environment}"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

# 根据环境名称创建子网
resource "aws_subnet" "public" {
  count             = 2
  vpc_id            = aws_vpc.main.id
  cidr_block        = var.environment == "blue" ? "10.0.${count.index}.0/24" : "10.1.${count.index}.0/24"
  availability_zone = data.aws_availability_zones.available.names[count.index]

  tags = {
    Name        = "subnet-${var.environment}-public-${count.index}"
    Environment = var.environment
  }
}

# 安全组
resource "aws_security_group" "alb" {
  name        = "sg-${var.environment}-alb"
  description = "Security group for ALB in ${var.environment} environment"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Environment = var.environment
  }
}

# 输出 ALB DNS 名称
output "alb_dns_name" {
  value = aws_lb.main.dns_name
}
最佳实践:使用 terraform workspace 也可以实现环境隔离,但蓝绿发布要求两套环境同时存在,因此推荐使用变量 + 独立状态文件的方式,而非工作区(工作区通常一次只激活一个)。

4.4 环境标签管理策略

标签(Tags)是蓝绿环境中识别、分组和自动化操作的基础。统一的标签体系能够帮助运维人员快速定位资源,并支持 CI/CD 流水线通过标签筛选目标环境。下表列出了推荐的蓝绿环境标签规范:

标签键(Key) 标签值(Value) 说明
Environment blue 或 green 标识资源所属环境,是蓝绿切换的核心标签
Service web-api、worker 等 标识所属微服务名称
ManagedBy terraform 标识资源管理工具,便于自动化清理
DeploymentGroup production 标识部署组,用于区分生产/预发/测试
Version v1.2.3 当前部署的应用版本号(CI/CD 流水线注入)
CreatedAt 2025-03-15T10:00:00Z 环境创建时间戳,辅助判断环境生命周期

在 Terraform 中,标签通常通过 tags 参数统一注入,避免在每个资源中重复定义:

# locals.tf
locals {
  common_tags = {
    Environment      = var.environment
    Service          = "web-api"
    ManagedBy        = "terraform"
    DeploymentGroup  = "production"
    Version          = var.app_version  # 由 CI/CD 传入
    CreatedAt        = timestamp()
  }
}

# 在资源中引用
resource "aws_instance" "app" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.medium"
  subnet_id     = aws_subnet.public[0].id

  tags = merge(local.common_tags, {
    Name = "app-${var.environment}-${count.index}"
  })
}

4.5 蓝绿环境创建与切换的完整流程

结合 Terraform 与标签管理,蓝绿环境的创建与切换遵循以下标准化步骤:

  1. 代码提交:开发人员将应用代码与 Terraform 配置一同提交至 Git 仓库。
  2. 流水线触发:CI/CD 流水线检测到代码变更,开始执行。
  3. 环境选择:流水线判断当前活跃环境(例如当前流量指向 blue),决定将新版本部署到 green。
  4. Terraform Apply:执行 terraform apply -var="environment=green" -var="app_version=v2.0.0",创建或更新绿环境。
  5. 健康检查:流水线等待绿环境通过健康检查(ALB 目标组健康状态)。
  6. 流量切换:修改 DNS 或负载均衡器规则,将流量从 blue 切换到 green。
  7. 标签更新:更新 green 环境的标签,标记为 Active: true;同时标记 blue 为 Active: false。
  8. 旧环境保留:保留 blue 环境作为回滚备用,直到下一次发布确认稳定后再销毁。
注意:在切换流量前,务必确认绿环境的标签与监控系统、日志采集、告警规则完全匹配。标签不一致可能导致监控数据丢失或告警误报。

4.6 环境清理与回收

蓝绿环境并非永久保留。当新环境稳定运行一段时间(例如 72 小时)后,旧环境应被回收以节省成本。通过标签 Environment 和 CreatedAt,可以编写自动化脚本定期清理过期环境:

# 使用 AWS CLI 按标签查找并销毁旧环境
aws ec2 describe-instances \
  --filters "Name=tag:Environment,Values=blue" "Name=tag:DeploymentGroup,Values=production" \
  --query "Reservations[*].Instances[*].InstanceId" \
  --output text

# 在 CI/CD 流水线中执行 terraform destroy
terraform destroy -var="environment=blue" -auto-approve

通过 IaC 与标签管理的结合,蓝绿环境实现了从创建、切换、监控到回收的全生命周期自动化,为后续的流水线集成与网络回滚策略奠定了坚实的基础。