4. 蓝绿环境准备:基础设施即代码(IaC)、Terraform创建蓝绿环境、环境标签管理
蓝绿发布的核心前提是存在两套独立、对等且可随时切换的生产环境。传统手动搭建环境的方式耗时且易出错,无法满足快速迭代与回滚的需求。本章将基于基础设施即代码(IaC)理念,使用 Terraform 实现蓝绿环境的自动化创建与标签管理,确保环境的一致性与可追溯性。
4.1 基础设施即代码(IaC)在蓝绿发布中的价值
IaC 将网络、计算、存储等基础设施的配置以声明式代码管理,与应用程序代码一同纳入版本控制。在蓝绿发布中,IaC 带来以下关键优势:
- 环境一致性:蓝绿两套环境由同一套 Terraform 配置生成,消除配置漂移。
- 快速创建与销毁:通过代码即可在数分钟内完成整套环境的部署或回收。
- 版本化回滚:环境配置的历史版本可追溯,回滚时只需切换 Terraform 状态。
- 自动化集成:与 CI/CD 流水线结合,实现环境创建、部署、切换的全自动化。
4.2 Terraform 创建蓝绿环境的核心架构
使用 Terraform 管理蓝绿环境时,通常采用工作区(Workspace)或模块化目录两种模式。对于生产级蓝绿发布,推荐使用模块化目录 + 环境变量的方式,将蓝(blue)和绿(green)视为同一 Terraform 配置的两个独立实例,通过不同的状态文件(state)隔离。
下图展示了基于 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 与标签管理,蓝绿环境的创建与切换遵循以下标准化步骤:
- 代码提交:开发人员将应用代码与 Terraform 配置一同提交至 Git 仓库。
- 流水线触发:CI/CD 流水线检测到代码变更,开始执行。
- 环境选择:流水线判断当前活跃环境(例如当前流量指向 blue),决定将新版本部署到 green。
- Terraform Apply:执行
terraform apply -var="environment=green" -var="app_version=v2.0.0",创建或更新绿环境。 - 健康检查:流水线等待绿环境通过健康检查(ALB 目标组健康状态)。
- 流量切换:修改 DNS 或负载均衡器规则,将流量从 blue 切换到 green。
- 标签更新:更新 green 环境的标签,标记为
Active: true;同时标记 blue 为Active: false。 - 旧环境保留:保留 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 与标签管理的结合,蓝绿环境实现了从创建、切换、监控到回收的全生命周期自动化,为后续的流水线集成与网络回滚策略奠定了坚实的基础。