4、标签策略的制定与实施:强制标签与自动化标签

说实话,标签这件事,我在很多客户那里都见过同一个问题——标签打了一堆,分摊的时候发现根本用不上。为什么?因为标签没有策略,没有强制,也没有自动化。

今天我们就来聊聊,怎么把标签从「爱打不打」变成「不打不行」,再变成「自动打好」。

4.1 为什么标签策略这么重要?

我见过最夸张的一个案例:某公司有300多个标签键,但真正用于成本分摊的只有3个。剩下的标签,要么是开发随手打的,要么是运维批量生成的,要么是历史遗留的。

你想想看,标签越多,管理成本越高。而且没有策略的标签,就像没有交通规则的路口——谁都想走,谁都走不快。

所以,标签策略的核心就两件事:

  • 强制标签:哪些标签必须打?不打会怎样?
  • 自动化标签:怎么让标签自动生成?减少人工干预。

核心原则:标签不是越多越好,而是越「有用」越好。一个能分摊成本的标签,胜过一百个无用的标签。

4.2 强制标签:让不打标签的人「疼」

我记得有一次,帮一家电商公司做成本优化。他们的问题很简单——标签覆盖率不到30%。我问运维负责人:「为什么不打标签?」他说:「打了也没奖励,不打也没惩罚,谁愿意多干活?」

嗯,这就是人性。所以强制标签的核心,就是让不打标签的人「疼」。

4.2.1 哪些标签必须强制?

我个人习惯,强制标签不要超过5个。太多了,大家记不住,也容易出错。我常用的强制标签清单:

标签键 标签值示例 用途
CostCenter FC-001, FC-002 成本中心分摊
Environment prod, staging, dev 环境区分
Owner team-a, team-b 责任归属
Project project-x, project-y 项目维度
AutoShutdown true, false 非生产环境自动关闭

小技巧:标签值尽量用「短编码」,比如 FC-001 比「财务中心-北京-研发部」好得多。为什么?因为编码容易匹配,中文容易出错。

4.2.2 强制标签的实施方式

不同云厂商的强制标签机制不太一样,但思路是相通的。我以 AWS 和阿里云为例:

AWS 的 SCP(服务控制策略)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "ec2:RunInstances",
      "Resource": "*",
      "Condition": {
        "Null": {
          "aws:RequestTag/CostCenter": "true"
        }
      }
    }
  ]
}

这段策略的意思是:创建 EC2 实例时,如果没打 CostCenter 标签,直接拒绝。嗯,这就是「不打不让用」的典型做法。

阿里云的标签策略

# 通过 RAM 策略强制标签
{
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "ecs:CreateInstance",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "acs:RequestTag/Environment": ["prod", "staging", "dev"]
        }
      }
    }
  ]
}

注意:强制标签要「逐步推行」。我见过一家公司,第一天就全量强制,结果开发集体罢工——因为他们的自动化脚本没来得及改。建议先试点,再推广。

4.3 自动化标签:让机器替你干活

强制标签解决了「不打不行」的问题,但还有一个问题——人工打标签太慢了。尤其是大规模资源创建时,几百台机器等着打标签,运维手都打酸了。

所以,自动化标签是必须的。说白了,就是让机器替你干活。

4.3.1 基于资源属性的自动标签

我记得在帮一家游戏公司做自动化时,他们有个需求:所有按量付费的实例,自动打上「BillingType=PayAsYouGo」标签。这个用 Lambda 函数就能搞定。

示例代码(AWS Lambda + Python):

import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2')
    
    # 获取所有按量付费实例
    instances = ec2.describe_instances(
        Filters=[
            {'Name': 'instance-lifecycle', 'Values': ['normal']}
        ]
    )
    
    for reservation in instances['Reservations']:
        for instance in reservation['Instances']:
            instance_id = instance['InstanceId']
            
            # 检查是否已有 BillingType 标签
            tags = instance.get('Tags', [])
            has_billing_tag = any(
                tag['Key'] == 'BillingType' for tag in tags
            )
            
            if not has_billing_tag:
                # 自动打标签
                ec2.create_tags(
                    Resources=[instance_id],
                    Tags=[
                        {'Key': 'BillingType', 'Value': 'PayAsYouGo'}
                    ]
                )
                print(f'已为 {instance_id} 自动打标签')

这个函数可以定时运行,比如每天凌晨跑一次。新创建的实例,第二天就会被自动打上标签。

4.3.2 基于命名规范的自动标签

还有一种更聪明的做法——从资源名称中提取标签。比如你的实例命名规范是:

prod-web-server-001
staging-api-server-001
dev-db-server-001

那么,通过正则表达式就能自动提取出 Environment、Service、Role 等标签。

示例代码:

import re

def extract_tags_from_name(resource_name):
    # 命名规范: {environment}-{service}-{role}-{number}
    pattern = r'^(\w+)-(\w+)-(\w+)-\d+$'
    match = re.match(pattern, resource_name)
    
    if match:
        return {
            'Environment': match.group(1),
            'Service': match.group(2),
            'Role': match.group(3)
        }
    return None

我的经验:命名规范 + 自动标签,是最省力的方式。你只需要在创建资源时遵守命名规范,剩下的交给脚本。我曾经用这个方法,帮一个客户把标签覆盖率从40%提升到了95%。

4.4 标签治理的持续运营

标签策略不是「一次搞定,终身受益」的事。它需要持续运营。我建议做三件事:

  1. 定期审计:每周跑一次脚本,检查未打标签的资源,生成报告发给负责人。
  2. 标签健康度看板:在 Grafana 或云厂商的仪表盘上,展示标签覆盖率、合规率等指标。
  3. 违规通知:发现未打标签的资源,自动发邮件或钉钉消息给 Owner。

我曾经遇到过一个场景:某团队为了省事,把所有资源都打上了「Environment=dev」的标签。结果成本分摊时,dev 环境的成本高得离谱,prod 环境反而很低。这就是标签滥用的问题。

所以,除了强制和自动化,还要有标签值校验。比如 Environment 只能取 prod、staging、dev 三个值,其他值一律拒绝。

总结一下

  • 强制标签解决「打不打」的问题
  • 自动化标签解决「怎么打」的问题
  • 持续运营解决「打得好不好」的问题

嗯,标签策略做到这个程度,基本上就能支撑起成本分摊和预算管控了。下一章我们会聊聊,怎么用这些标签来做实际的分摊计算。