自服务基础设施Skill self-service-infrastructure

该技能专注于设计和实现基础设施自服务能力,使开发者能够无需工单即可自动化配置和管理云资源,通过IaC模板(如Terraform、Pulumi)、环境供应系统和策略护栏,平衡开发速度与治理合规。关键词:自服务基础设施、IaC模板、自动化供应、DevOps、云原生、Terraform、Pulumi、成本控制、安全合规。

DevOps 0 次安装 0 次浏览 更新于 3/11/2026

名称: 自服务基础设施 描述: 用于设计基础设施自服务门户、IaC模板或自动化供应系统时使用。涵盖Terraform模块、Pulumi、环境供应和基础设施护栏。 允许工具: 读取、全局匹配、搜索

自服务基础设施

使开发者能够在无需工单的情况下配置基础设施的模式,同时保持治理和控制。

何时使用此技能

  • 设计基础设施自服务能力
  • 创建可重用的Terraform/Pulumi模块
  • 构建环境供应系统
  • 实施基础设施护栏
  • 减少基础设施请求瓶颈
  • 平衡开发者自治与治理

自服务基础

什么是自服务基础设施?

自服务基础设施:
使开发者能够直接配置和管理基础设施,而无需提交工单或等待运维团队。

传统模式:
┌─────────────────────────────────────────────────────────────┐
│ 开发者 → 工单 → 运维审核 → 手动配置 → 完成           │
│                                                              │
│ 时间线: 几天到几周                                          │
│ 瓶颈: 运维团队容量                                          │
│ 结果: 影子IT、变通方法、挫折                                │
└─────────────────────────────────────────────────────────────┘

自服务模式:
┌─────────────────────────────────────────────────────────────┐
│ 开发者 → 门户/API → 自动配置 → 完成                  │
│                                                              │
│ 时间线: 几分钟到几小时                                      │
│ 瓶颈: 无(自动化)                                          │
│ 结果: 速度、一致性、合规性                                  │
└─────────────────────────────────────────────────────────────┘

自服务频谱:
├── 完全托管: 点击按钮,获取数据库
├── 基于模板: 从批准的模板自定义
├── 策略约束: 在护栏内编写IaC
└── 完全自由: 任何基础设施(风险高)

最佳点: 基于模板并带有策略护栏

关键好处

自服务好处:

对开发者:
├── 速度: 分钟而非天数
├── 自治: 需要时配置
├── 一致性: 每次相同的基础设施
├── 学习: 更好理解基础设施
└── 所有权: 更多责任,更多控制

对运维:
├── 扩展: 无需更多人处理更多请求
├── 一致性: 自动强制执行标准
├── 聚焦: 专注于平台,而非工单
├── 审计: 清晰的配置记录
└── 合规性: 内置策略执行

对组织:
├── 速度: 更快上市时间
├── 成本: 减少运维开销
├── 治理: 更好的合规姿态
├── 安全: 一致的安全控制
└── 效率: 需要时配置资源

自服务架构

组件架构

自服务基础设施架构:

┌─────────────────────────────────────────────────────────────┐
│                     用户界面                                 │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │   门户      │  │   CLI       │  │   API       │         │
│  │  (Web UI) │  │ (Terraform)│  │ (REST/gRPC)│         │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘         │
│         └────────────────┼────────────────┘                 │
│                          │                                   │
├──────────────────────────┼───────────────────────────────────┤
│                          ▼                                   │
│  ┌─────────────────────────────────────────────────────┐    │
│  │               编排层                                 │    │
│  │  ├── 请求验证                                       │    │
│  │  ├── 策略评估(OPA/Sentinel)                       │    │
│  │  ├── 成本估算                                       │    │
│  │  ├── 审批工作流(如果需要)                         │    │
│  │  └── 执行编排                                       │    │
│  └─────────────────────────────────────────────────────┘    │
│                          │                                   │
├──────────────────────────┼───────────────────────────────────┤
│                          ▼                                   │
│  ┌─────────────────────────────────────────────────────┐    │
│  │               模板库                                 │    │
│  │  ├── 数据库模块(RDS、Cloud SQL)                   │    │
│  │  ├── 计算模块(EKS、GKE、虚拟机)                   │
│  │  ├── 存储模块(S3、GCS)                            │
│  │  ├── 网络模块(VPC、子网)                           │
│  │  └── 复合模块(完整环境)                            │
│  └─────────────────────────────────────────────────────┘    │
│                          │                                   │
├──────────────────────────┼───────────────────────────────────┤
│                          ▼                                   │
│  ┌─────────────────────────────────────────────────────┐    │
│  │               执行引擎                               │    │
│  │  ├── Terraform Cloud/Enterprise                     │
│  │  ├── Pulumi Service                                 │
│  │  ├── Crossplane                                     │
│  │  └── 云原生(CDK、ARM、Deployment Manager)         │
│  └─────────────────────────────────────────────────────┘    │
│                          │                                   │
├──────────────────────────┼───────────────────────────────────┤
│                          ▼                                   │
│  ┌─────────────────────────────────────────────────────┐    │
│  │               云提供商                               │    │
│  │  AWS  │  GCP  │  Azure  │  Kubernetes  │  其他      │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

请求流程

自服务请求流程:

┌─────────────────────────────────────────────────────────────┐
│ 1. 请求                                                     │
│    开发者: "我需要一个用于暂存的PostgreSQL数据库"          │
│    └── 通过门户、CLI或API                                  │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│ 2. 验证                                                     │
│    ├── 用户有权限?          ✓ 团队成员                    │
│    ├── 请求格式正确?        ✓ 有效配置                    │
│    ├── 在配额内?            ✓ 在团队限制内                │
│    └── 符合策略?            ✓ 允许的实例类型              │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│ 3. 丰富                                                     │
│    ├── 应用默认值                 db.t3.medium            │
│    ├── 生成名称                 myapp-staging-db          │
│    ├── 分配网络                 staging-vpc               │
│    ├── 配置监控                 Datadog集成               │
│    └── 估算成本                 ~$50/月                    │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│ 4. 审批(如果需要)                                          │
│    ├── 自动审批: 暂存、开发     ✓ 自动批准                │
│    ├── 手动审批: 生产         (需要审批)                │
│    └── 成本阈值: >$500/月     (需要审批)                │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│ 5. 执行                                                     │
│    ├── 生成Terraform             基于模板                  │
│    ├── 计划                      预览变更                  │
│    ├── 应用                      创建资源                  │
│    └── 验证                      健康检查                  │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│ 6. 交付                                                     │
│    ├── 连接字符串 → Vault                                 │
│    ├── 通知 → Slack/邮件                                  │
│    ├── 文档 → 自动生成                                    │
│    └── 注册 → 服务目录                                    │
└─────────────────────────────────────────────────────────────┘

IaC模块设计

Terraform模块模式

Terraform模块结构:

组织级模块库:
terraform-modules/
├── 数据库/
│   ├── rds-postgres/
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   ├── outputs.tf
│   │   ├── versions.tf
│   │   ├── README.md
│   │   └── 示例/
│   │       ├── 简单/
│   │       └── 生产/
│   └── elasticache-redis/
├── 计算/
│   ├── eks-cluster/
│   └── ecs-service/
├── 存储/
│   └── s3-bucket/
└── 网络/
    └── vpc/

模块设计原则:

1. 有观点的默认值
   # variables.tf
   variable "instance_class" {
     type        = string
     default     = "db.t3.medium"  # 合理的默认值
     description = "RDS实例类型"

     validation {
       condition = can(regex("^db\\.(t3|r5|m5)", var.instance_class))
       error_message = "仅允许批准的实例系列。"
     }
   }

2. 最小必要输入
   # 只要求不能默认化的内容
   variable "name" {
     type        = string
     description = "数据库标识符"
   }

   variable "environment" {
     type        = string
     description = "环境(开发、暂存、生产)"
   }

3. 完整输出
   # outputs.tf
   output "endpoint" {
     description = "数据库连接端点"
     value       = aws_db_instance.main.endpoint
   }

   output "connection_secret_arn" {
     description = "凭证的ARN秘密"
     value       = aws_secretsmanager_secret.db_credentials.arn
   }

4. 内置最佳实践
   # 默认安全加固
   resource "aws_db_instance" "main" {
     # 始终加密
     storage_encrypted = true

     # 无公共访问
     publicly_accessible = false

     # 自动备份
     backup_retention_period = var.environment == "prod" ? 30 : 7

     # 增强监控
     monitoring_interval = 60
   }

模块版本控制

模块版本控制策略:

语义版本控制:
├── 主要: 破坏性变更(新必需输入、移除输出)
├── 次要: 新功能(新可选输入、新输出)
└── 补丁: 错误修复(无接口变更)

版本约束:
# 允许自动补丁更新
module "database" {
  source  = "terraform.company.com/modules/rds-postgres"
  version = "~> 2.1.0"  # >=2.1.0, <2.2.0
}

# 固定到精确版本(生产)
module "database" {
  source  = "terraform.company.com/modules/rds-postgres"
  version = "= 2.1.3"
}

弃用策略:
┌─────────────────────────────────────────────────────────────┐
│ 模块版本生命周期                                             │
├─────────────────────────────────────────────────────────────┤
│ 当前(v2.x):     支持,新功能                             │
│ 先前(v1.x):     支持,仅安全修复                         │
│ 弃用(v0.x):     使用警告,无支持                         │
│ 移除:             无法工作                                 │
│                                                              │
│ 通知:                                                      │
│ ├── Slack公告当版本弃用                                    │
│ ├── terraform plan输出中的警告                             │
│ ├── 仪表板显示弃用模块使用                                  │
│ └── 提供迁移指南                                            │
└─────────────────────────────────────────────────────────────┘

策略和护栏

策略即代码

策略即代码选项:

1. HashiCorp Sentinel(Terraform Enterprise)
   # 要求所有存储加密
   import "tfplan/v2" as tfplan

   s3_buckets = filter tfplan.resource_changes as _, rc {
     rc.type is "aws_s3_bucket" and
     rc.mode is "managed" and
     (rc.change.actions contains "create" or
      rc.change.actions contains "update")
   }

   encryption_enabled = rule {
     all s3_buckets as _, bucket {
       bucket.change.after.server_side_encryption_configuration
         is not null
     }
   }

   main = rule { encryption_enabled }

2. Open Policy Agent(OPA)
   # Kubernetes的Rego策略
   package kubernetes.admission

   deny[msg] {
     input.request.kind.kind == "Pod"
     container := input.request.object.spec.containers[_]
     not container.securityContext.runAsNonRoot
     msg := "容器必须以非root用户运行"
   }

3. 云原生策略
   # AWS服务控制策略
   {
     "Version": "2012-10-17",
     "Statement": [{
       "Sid": "RequireEncryption",
       "Effect": "Deny",
       "Action": ["s3:CreateBucket"],
       "Resource": "*",
       "Condition": {
         "StringNotEquals": {
           "s3:x-amz-server-side-encryption": "AES256"
         }
       }
     }]
   }

护栏类别

基础设施护栏:

1. 安全护栏
   ├── 要求加密(静态、传输中)
   ├── 默认无公共访问
   ├── 必需的安全组
   ├── IAM角色要求
   └── 漏洞扫描

2. 成本护栏
   ├── 实例类型限制
   ├── 存储大小限制
   ├── 必需的成本标签
   ├── 预算阈值
   └── 大型资源审批

3. 合规护栏
   ├── 允许的区域(数据驻留)
   ├── 必需的日志记录
   ├── 备份要求
   ├── 保留策略
   └── 审计追踪要求

4. 运营护栏
   ├── 命名约定
   ├── 必需标签(所有者、成本中心)
   ├── 每团队资源配额
   ├── 监控要求
   └── 删除保护

护栏实施:
┌─────────────────────────────────────────────────────────────┐
│                    护栏时机                                  │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  预计划(最快反馈):                                        │
│  ├── 验证terraform文件                                      │
│  ├── 静态分析(tfsec、checkov)                            │
│  └── 模块版本检查                                           │
│                                                              │
│  后计划(资源感知):                                        │
│  ├── OPA/Sentinel策略评估                                   │
│  ├── 成本估算                                               │
│  └── 影响半径评估                                           │
│                                                              │
│  后应用(验证):                                            │
│  ├── 配置验证                                               │
│  ├── 安全扫描                                               │
│  └── 合规审计                                               │
│                                                              │
└─────────────────────────────────────────────────────────────┘

环境供应

环境模板

环境供应:

环境类型:
┌─────────────────────────────────────────────────────────────┐
│ 开发环境                                                    │
│ ├── 目的: 个人开发者测试                                    │
│ ├── 生命周期: 几小时到几天                                 │
│ ├── 资源: 最小(最小实例)                                  │
│ ├── 数据: 合成或匿名化                                      │
│ └── 审批: 无(在配额内)                                    │
├─────────────────────────────────────────────────────────────┤
│ 暂存环境                                                    │
│ ├── 目的: 集成测试、QA                                      │
│ ├── 生命周期: 每个服务持久化                                │
│ ├── 资源: 类似生产(缩小规模)                              │
│ ├── 数据: 清洗的生产数据子集                                │
│ └── 审批: 无(在配额内)                                    │
├─────────────────────────────────────────────────────────────┤
│ 生产环境                                                    │
│ ├── 目的: 实时客户流量                                      │
│ ├── 生命周期: 永久                                          │
│ ├── 资源: 全容量                                            │
│ ├── 数据: 真实客户数据                                      │
│ └── 审批: 必需(安全审核)                                  │
└─────────────────────────────────────────────────────────────┘

环境模板:
# environment/main.tf
module "network" {
  source      = "../modules/vpc"
  environment = var.environment
  cidr_block  = var.network_cidr
}

module "kubernetes" {
  source      = "../modules/eks"
  environment = var.environment
  vpc_id      = module.network.vpc_id
  node_count  = var.environment == "prod" ? 5 : 2
}

module "database" {
  source         = "../modules/rds"
  environment    = var.environment
  vpc_id         = module.network.vpc_id
  instance_class = var.environment == "prod" ? "db.r5.xlarge" : "db.t3.medium"
  multi_az       = var.environment == "prod"
}

module "cache" {
  source      = "../modules/elasticache"
  environment = var.environment
  vpc_id      = module.network.vpc_id
  node_type   = var.environment == "prod" ? "cache.r5.large" : "cache.t3.micro"
}

临时环境

临时/预览环境:

使用案例:
├── PR预览环境
├── 功能分支测试
├── 演示环境
├── 负载测试环境
└── 事件复现

生命周期:
┌─────────────────────────────────────────────────────────────┐
│                                                              │
│  PR创建 ──► 环境创建 ──► 测试运行                          │
│       │              │                      │               │
│       │              ▼                      ▼               │
│       │         预览URL                 PR更新               │
│       │         发布到PR                    │                 │
│       │                                   │                 │
│       ▼                                   ▼                 │
│  PR合并 ───────────────────────► 环境销毁                   │
│                                                              │
│  超时: 7天无活动后自动销毁                                  │
│                                                              │
└─────────────────────────────────────────────────────────────┘

实施:
# .github/workflows/preview.yml
名称: 预览环境

on:
  pull_request:
    types: [opened, synchronize]

工作:
  部署预览:
    runs-on: ubuntu-latest
    步骤:
      - 名称: 创建/更新环境
        run: |
          terraform workspace select pr-${{ github.event.pull_request.number }} || \
          terraform workspace new pr-${{ github.event.pull_request.number }}
          terraform apply -auto-approve

      - 名称: 评论预览URL
        uses: actions/github-script@v6
        with:
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              body: '🚀 预览: https://pr-${{ github.event.pull_request.number }}.preview.company.com'
            })

技术选项

自服务平台

平台比较:

1. Terraform Cloud/Enterprise
   ├── 原生Terraform体验
   ├── 策略即代码(Sentinel)
   ├── 私有模块注册表
   ├── 成本估算
   └── 企业功能(SSO、审计)

2. Pulumi
   ├── 真实编程语言
   ├── 强类型和IDE支持
   ├── 策略即代码(CrossGuard)
   └── 自动化API

3. Crossplane
   ├── Kubernetes原生
   ├── GitOps工作流
   ├── 模块组合
   └── 多云抽象

4. Backstage + Terraform
   ├── 统一开发者门户
   ├── 软件模板
   ├── 插件生态系统
   └── 服务目录集成

5. Port/Cortex/OpsLevel
   ├── 商业开发者门户
   ├── 快速实施
   ├── 内置集成
   └── 自服务工作流

选择标准:
┌────────────────────────────────────────────────────────────┐
│ 因素                │ 最佳匹配                            │
├──────────────────────┼─────────────────────────────────────┤
│ 现有Terraform       │ Terraform Cloud/Enterprise         │
│ Kubernetes优先      │ Crossplane                         │
│ 开发者门户          │ Backstage或商业平台                │
│ 编程语言            │ Pulumi                             │
│ 快速启动            │ 商业平台(Port、OpsLevel)         │
│ 最大控制            │ 自定义构建                          │
└────────────────────────────────────────────────────────────┘

成本管理

成本控制

自服务中的成本管理:

1. 成本可见性
   ├── 配置前显示估算成本
   ├── 自动应用成本标签
   ├── 每团队/项目仪表板
   └── 异常检测和警报

2. 成本护栏
   ├── 实例类型限制
   ├── 按团队预算阈值
   ├── 高于阈值需审批
   └── 自动关闭未使用资源

3. 成本优化
   ├── 适当规模建议
   ├── 预留实例建议
   ├── 非生产使用Spot实例
   └── 计划缩放

成本估算流程:
┌─────────────────────────────────────────────────────────────┐
│ 请求: 暂存PostgreSQL数据库                                 │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  成本估算:                                                 │
│  ├── 计算(db.t3.medium):        $30/月                  │
│  ├── 存储(100GB gp3):           $10/月                  │
│  ├── 备份存储:                ~$5/月                      │
│  └── 数据传输:                 ~$5/月                      │
│                                     ─────────               │
│  估算总计:                   ~$50/月                       │
│                                                              │
│  ✓ 在团队预算内($500/月配额)                             │
│  ✓ 无需审批                                                 │
│                                                              │
│  [继续] [修改] [取消]                                        │
└─────────────────────────────────────────────────────────────┘

最佳实践

自服务基础设施最佳实践:

1. 从小开始,逐步扩展
   ├── 从2-3个常见资源开始
   ├── 根据需求添加
   ├── 基于反馈迭代
   └── 不要试图第一天覆盖一切

2. 平衡自治与治理
   ├── 护栏而非闸门
   ├── 安全处自动化审批
   ├── 明确升级路径
   └── 信任但验证

3. 优化开发者体验
   ├── 最小必要输入
   ├── 合理默认值
   ├── 清晰错误消息
   └── 快速反馈循环

4. 维护模块质量
   ├── 自动化测试
   ├── 文档要求
   ├── 版本控制策略
   └── 弃用流程

5. 监控和改进
   ├── 跟踪配置成功率
   ├── 测量配置时间
   ├── 收集用户反馈
   └── 识别自动化机会

6. 处理边缘案例
   ├── 如果配置失败怎么办?
   ├── 如何处理孤儿资源?
   ├── 现有资源怎么办?
   └── 如何在版本间迁移?

反模式

自服务反模式:

1. "自服务一切"
   ❌ 每个可能的配置选项
   ✓ 批准的精选模式集

2. "安全表演"
   ❌ 无价值的手动审批
   ✓ 自动化策略执行

3. "配置爆炸"
   ❌ 每个资源50个参数
   ✓ 带有少量覆盖的合理默认值

4. "忽略成本"
   ❌ 无配置成本可见性
   ✓ 成本估算和预算

5. "构建与购买错误"
   ❌ 从头构建一切
   ✓ 适当时使用现有工具

6. "无逃生舱口"
   ❌ 阻塞合法例外
   ✓ 合理偏差流程

相关技能

  • internal-developer-platform - 平台工程概述
  • golden-paths - 标准化工作流
  • container-orchestration - Kubernetes基础设施
  • serverless-patterns - 服务器less基础设施