You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改CloudWatch Rule为自动备份的EBS快照添加名称?

解决CloudWatch Rule备份EBS快照无名称的问题

这个问题我之前帮同事处理过,本质就是你的备份逻辑(不管是用Systems Manager自动化文档还是自定义Lambda)没指定SnapshotName参数,分两种常见场景来修改:

场景1:用AWS Systems Manager自动化文档触发备份

如果你的CloudWatch Rule是调用AWS托管的AWS-CreateEbsSnapshot(或自定义自动化文档),直接给文档加参数就行:

  1. 打开CloudWatch控制台,找到你的规则,点击编辑
  2. 滚动到「目标」区域,选中对应的Systems Manager自动化文档,点击配置详细信息
  3. 在「输入参数」里新增SnapshotName参数,推荐用动态值来区分快照,比如:
    • 用卷ID+时间戳:"SnapshotName": "ebs-snapshot-{{ VolumeId }}-{{ currentDateTime }}"
    • 如果你的EBS卷有Name标签,直接引用标签值:"SnapshotName": "{{ Tags.Name }}-snapshot-{{ currentDateTime }}"

    注:{{ currentDateTime }}是自动化文档内置的变量,会自动生成当前时间戳;{{ Tags.Name }}会读取目标EBS卷的Name标签值

  4. 保存规则,下次触发备份时,快照就会自动带上名称了

如果是你自己写的自动化文档,要确保文档里的aws:createSnapshot步骤明确包含SnapshotName参数,并传递输入值。

场景2:用自定义Lambda函数触发备份

如果是自己写的Lambda来创建快照,只需要在调用EC2 API时添加SnapshotName参数即可,给你个Python示例:

import boto3
import datetime

ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    # 这里替换成你获取需要备份的EBS卷ID的逻辑(比如从事件或标签筛选)
    volume_ids = ['vol-xxxxxx', 'vol-yyyyyy']
    
    for vol_id in volume_ids:
        # 尝试获取EBS卷的Name标签,没有的话用卷ID代替
        vol_desc = ec2.describe_volumes(VolumeIds=[vol_id])
        vol_name = next(
            (tag['Value'] for tag in vol_desc['Volumes'][0]['Tags'] if tag['Key'] == 'Name'),
            vol_id
        )
        
        # 生成带时间戳的快照名称
        snapshot_name = f"{vol_name}-snapshot-{datetime.datetime.now().strftime('%Y%m%d-%H%M%S')}"
        
        # 创建快照并指定名称
        ec2.create_snapshot(
            VolumeId=vol_id,
            Description=f"Automated backup for volume {vol_id}",
            SnapshotName=snapshot_name
        )

修改完Lambda代码后保存,测试一下触发逻辑,新生成的快照就会有名称了。

额外:批量补全已有无名称快照(可选)

如果之前已经生成了一堆没名称的快照,可以用AWS CLI批量补全,比如:

# 筛选出当前账号下无名称的自动化备份快照,批量添加名称
aws ec2 describe-snapshots --owner-ids self --filters "Name=description,Values=Automated backup*" --query "Snapshots[?SnapshotName==null].[SnapshotId,VolumeId]" --output text | while read snap_id vol_id; do
    # 获取卷的Name标签
    vol_name=$(aws ec2 describe-volumes --volume-ids $vol_id --query "Volumes[0].Tags[?Key=='Name'].Value" --output text)
    # 用卷名称/ID+快照创建时间作为名称
    snap_time=$(aws ec2 describe-snapshots --snapshot-ids $snap_id --query "Snapshots[0].StartTime" --output text | cut -c1-19 | tr ':' '-')
    aws ec2 create-tags --resources $snap_id --tags Key=Name,Value="${vol_name:-$vol_id}-snapshot-$snap_time"
done

内容的提问来源于stack exchange,提问作者Kelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:46:53