在大型企业云环境中,EC2实例的标签(Tag)是资源分类、成本分摊和权限管理的核心依据。然而,实际运维中常出现未标注标签的“孤儿实例”,导致资源归属模糊、账单难以追溯,甚至因长期运行产生意外成本。为解决这一问题,需设计一套自动化方案:通过 AWS 原生工具定期扫描未标签的 EC2实例,并自动终止不符合规范的资源,同时确保关键业务实例不受影响。
采用的服务为:AWS Systems Manager + Amazon EventBridge。本方案无需编写代码,仅通过 AWS 控制台配置即可实现。
AWS Systems Manager(SSM)自动化文档:定义扫描和终止实例的标准操作流程。
Amazon EventBridge:设置定时触发规则(如每天凌晨执行)。
IAM 权限控制:通过角色策略限制仅扫描特定标签键值(如 Environment=Production 外的实例)。
终止保护机制:排除已设置 TerminateProtection=true 的实例,避免误删关键资源。
本次采用AWS Console界面完成作业。
注意:根据项目的具体情况,可以采用不同的实施方法。比如使用命令行(CLI)部署、代码部署 (CloudFomation、Terraform等)、以及其它开发语言(SDK)完成作业。
步骤一:创建 SSM 自动化文档
登录 AWS 控制台,进入 Systems Manager > Automation > Create automation。
选择 Amazon EC2 API actions 模板,输入文档名称(如 TerminateUntaggedInstances)。
在 Steps 中添加以下操作:
aws:ec2DescribeInstances:筛选未标签实例(条件:TagFilters=[{Key="*", Values=[]}])。
aws:ec2TerminateInstances:终止符合条件的实例(需通过 InstanceIds 参数动态传入)。
保存文档并记录 ARN(后续 EventBridge 调用需使用)。
步骤二:配置 EventBridge 定时触发
进入 EventBridge > Create rule,选择 Schedule 模式。
设置触发频率(如 cron(0 3 * * ? *)表示每天凌晨3点执行)。
在 Targets 中添加 SSM Automation,选择刚创建的文档,并配置输入参数(如 InstanceIds="{{ automation:OUTPUT_S3_URI }}")。
步骤三:设置 IAM 权限与终止保护
为 SSM 执行角色附加策略,限制仅允许终止未标签实例。
{
"Effect": "Deny",
"Action": "ec2:TerminateInstances",
"Resource": "*",
"Condition": {
"StringEquals": {"ec2:ResourceTag/Environment": "Production"},
"Bool": {"ec2:TerminateProtected": "false"}
}
}
对关键实例手动启用终止保护:在 EC2控制台选中实例 > Actions > Instance Settings > Change Termination Protection。
1. 手动触发测试:在 SSM 控制台选择文档 > Start execution,观察实例终止日志。
2. 检查 CloudTrail 记录:确认终止操作由 AWSServiceRoleForSSM 角色发起,且仅针对未标签实例。