如何修改CloudWatch Rule为自动备份的EBS快照添加名称?
解决CloudWatch Rule备份EBS快照无名称的问题
这个问题我之前帮同事处理过,本质就是你的备份逻辑(不管是用Systems Manager自动化文档还是自定义Lambda)没指定SnapshotName参数,分两种常见场景来修改:
场景1:用AWS Systems Manager自动化文档触发备份
如果你的CloudWatch Rule是调用AWS托管的AWS-CreateEbsSnapshot(或自定义自动化文档),直接给文档加参数就行:
- 打开CloudWatch控制台,找到你的规则,点击编辑
- 滚动到「目标」区域,选中对应的Systems Manager自动化文档,点击配置详细信息
- 在「输入参数」里新增
SnapshotName参数,推荐用动态值来区分快照,比如:- 用卷ID+时间戳:
"SnapshotName": "ebs-snapshot-{{ VolumeId }}-{{ currentDateTime }}" - 如果你的EBS卷有
Name标签,直接引用标签值:"SnapshotName": "{{ Tags.Name }}-snapshot-{{ currentDateTime }}"
注:
{{ currentDateTime }}是自动化文档内置的变量,会自动生成当前时间戳;{{ Tags.Name }}会读取目标EBS卷的Name标签值 - 用卷ID+时间戳:
- 保存规则,下次触发备份时,快照就会自动带上名称了
如果是你自己写的自动化文档,要确保文档里的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
相关产品推荐
相关产品推荐

