阿里云Lighthouse自动创建快照

前言

配置自动化脚本创建快照保存数据,单台轻量应用服务器最多可创建3个快照。

创建快照Python脚本

环境配置

1
2
pip3 install aliyun-python-sdk-core
pip3 install aliyun-python-sdk-ecs

脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import time

# 初始化客户端
client = AcsClient('<your-access-key-id>', '<your-access-key-secret>', 'cn-hangzhou')

# 动态生成快照名称
current_date = time.strftime("%Y%m%d", time.localtime()) # 获取当前日期
SNAPSHOT_NAME = f"Snapshot-{current_date}"

def create_snapshot(disk_id):
request = CommonRequest()
request.set_domain('swas.cn-guangzhou.aliyuncs.com')
request.set_version('2020-06-01')
request.set_action_name('CreateSnapshot')
request.add_query_param('RegionId', 'cn-guangzhou')
request.add_query_param('DiskId', disk_id)
request.add_query_param('SnapshotName', SNAPSHOT_NAME) # 使用动态生成的快照名称
response = client.do_action_with_exception(request)
return eval(response)

# 示例:创建快照
disk_id = "d-bp18kjxg9ebrhsgi****" # 替换为实际磁盘 ID
response = create_snapshot(disk_id)
print(f"Snapshot Created: {response}")

配置定时计划任务

1
2
3
$ crontab -l
0 2 * * * /usr/bin/python3 /apps/snapshot/aliyun-lighthouse-snapshot.py

配置自动删除脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import time
from datetime import datetime, timezone
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest

# 初始化客户端
client = AcsClient('<your-access-key-id>', '<your-access-key-secret>', 'cn-hangzhou')

def list_snapshots():
"""
查询快照列表
"""
request = CommonRequest()
request.set_domain('swas.cn-guangzhou.aliyuncs.com')
request.set_version('2020-06-01')
request.set_action_name('ListSnapshots')
request.add_query_param('RegionId', 'cn-guangzhou')
response = client.do_action_with_exception(request)
return eval(response)

def delete_snapshot(snapshot_id):
"""
删除指定快照
"""
request = CommonRequest()
request.set_domain('swas.cn-guangzhou.aliyuncs.com')
request.set_version('2020-06-01')
request.set_action_name('DeleteSnapshot')
request.add_query_param('RegionId', 'cn-guangzhou')
request.add_query_param('SnapshotId', snapshot_id)
response = client.do_action_with_exception(request)
return eval(response)

def convert_utc_to_timestamp(utc_time):
"""
将UTC时间转换为时间戳
:param utc_time: UTC时间字符串,格式为ISO 8601 (yyyy-MM-ddTHH:mm:ssZ)
:return: 时间戳(秒级)
"""
utc_datetime = datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=timezone.utc)
return int(utc_datetime.timestamp())

def main():
# 获取快照列表
snapshots = list_snapshots().get('Snapshots', [])
current_time = time.time()

print("当前快照列表:")
for snapshot in snapshots:
snapshot_id = snapshot.get('SnapshotId', '未知')
creation_time = snapshot.get('CreationTime', '未知')
status = snapshot.get('Status', '未知')

if creation_time != '未知':
# 转换快照创建时间为时间戳
creation_timestamp = convert_utc_to_timestamp(creation_time)
# 计算时间差(秒)
time_diff = current_time - creation_timestamp
days_diff = time_diff / (24 * 3600) # 转换为天数

print(f"快照 ID: {snapshot_id}, 创建时间: {creation_time}, 状态: {status}, 存在时间: {days_diff:.2f} 天")

# 检查快照是否超过3天
if days_diff > 3:
print(f"快照 {snapshot_id} 已超过3天,正在删除...")
delete_snapshot(snapshot_id)
else:
print(f"快照 {snapshot_id} 尚未超过3天,无需删除。")
else:
print(f"快照 {snapshot_id} 的创建时间未知,跳过处理。")

if __name__ == "__main__":
main()

执行脚本

1
2
3
4
5
当前快照列表:
快照 ID: s-bp16oazlsold4dks****, 创建时间: 2023-10-01T04:00:00Z, 状态: Accomplished, 存在时间: 3.15 天
快照 s-bp16oazlsold4dks**** 已超过3天,正在删除...
快照 ID: s-bp16oazlsold4dk****, 创建时间: 2023-10-04T07:30:00Z, 状态: Accomplished, 存在时间: 0.12 天
快照 s-bp16oazlsold4dk**** 尚未超过3天,无需删除。

配置定时任务

1
2
$ crontab -l
0 1 * * * /usr/bin/python3 /apps/snapshot//apps/snapshot/aliyun-lighthouse-delete-snapshot.py

阿里云Lighthouse自动创建快照
http://example.com/2025/04/24/阿里云Lighthouse自动创建快照/
作者
种田人
发布于
2025年4月24日
许可协议