标签:lambda rip 手动 start 要求 mic 指示 nat 数据
这周老板给了个指示,有几个关键业务的服务器的备份需要额外的再做一个异地备份,以防万一。目前公司的服务器都在EC2上,每天会自动定时做快照服务。EC2的快照是保存在S3上面的,S3 standard 号称提供了11个9 的可靠性,99.999999999%,理论上整个region大区的所有数据中心都挂了的情况不太可能发生 ,不过既然老板要求了,那么就来看看如何实现吧。尽管EC2的快照是备份在S3上面的,但是这个S3的Bucket是对用户不可见的,AWS也不支持把快照异地拷贝到其他S3 Bucket的功能。如果一定要这么做,那么只能把Snapshot生成Volume,然后挂载到EC2上,把Volume的内容拷贝到S3中,这个操作明显是不靠谱的。那么唯一的方案只有把Snapshot 快照 copy到其他Region里面了。当我们拷贝快照的时候,第一次是全备份,之后会自动进行增量备份。
控制台的操作如下所示:
除了控制台的手动操作,我们也可以通过Snapshot Lifecycle Manager进行控制,里面提供了 Cross Region copy 的选择。
豆子的选择方案是通过 Cloudwatch定期触发Lambda 函数来拷贝指定的快照。
脚本思路如下:
一个EC2 实例 会有多个 Volume,这些Volume都会有多个对应的快照。 对于我关注的几个服务器,找到他们每一个Volume的最新快照,拷贝到其他Region 即可。
下面是具体的Lambda代码,我使用的平台是Python 3.8。 下面的代码是在本地的Pycharm里面成功通过之后,再配置在Lambda中,毕竟控制台网页上提供的那个编译环境真的不好用。
import boto3, datetime
#拷贝快照从悉尼到新加坡
def lambda_handler(event, context):
region_source = ‘ap-southeast-2‘
client_source = boto3.client(‘ec2‘, region_name=region_source)
li=[‘vol-099cc6ff1ce6bc10e‘, ‘vol-0deb7c69aace940a5‘, ‘vol-06906cce4f523bbc4‘,
‘vol-0b77ba1055cde48ac‘, ‘vol-0febbe3ff641f547d‘, ‘vol-0ba66804738267fd2‘, ‘vol-07306208033024ece‘]
copylist=[]
#通过Volume ID来匹配对应的快照列表
def get_snapshots(item):
response = client_source.describe_snapshots(
Filters=[{‘Name‘: ‘tag:OpsAutomator:OpsAutomator-Snapshot-SourceVolume‘,
‘Values‘: item }
]
)
return response["Snapshots"]
#把这些Volume对应的最新的快照都放在一个列表里
for i in li:
snapshot = sorted(
[(s[‘SnapshotId‘], datetime.datetime.strftime(s[‘StartTime‘], ‘%Y-%m-%d‘), s[‘VolumeId‘]) for s in
get_snapshots([i])], key=lambda k: k[1], reverse=True)[0]
copylist.append(snapshot)
#拷贝这些快照到其他的Region
for snapshot in copylist:
print(‘Copying Snapshot -> ‘ + snapshot[0])
destination_client = boto3.client(‘ec2‘, region_name=‘ap-southeast-1‘)
copy_response = destination_client.copy_snapshot(
Description=‘Snapshot copied from volume‘ + snapshot[0] + " at " + snapshot[1],
DestinationRegion=‘ap-southeast-1‘,
SourceRegion=‘ap-southeast-2‘,
SourceSnapshotId=snapshot[0],
TagSpecifications=[
{
‘ResourceType‘: ‘snapshot‘,
‘Tags‘: [
{
‘Key‘: ‘Name‘,
‘Value‘: snapshot[2]
},
]
},
],
)
print(copy_response)
控制台里面,创建一个Lambda 函数,记得配置合适的Role的权限, 我这里图省事,直接添加了EC2的全部访问权限。
Role里面他默认有一个权限可以访问Cloudwatch 记录日志,除此之外,我添加了一个EC2的管理权限
在CloudWatch里面添加事件的Rule
测试一下,监控Cloudwatch 的 Log groups,可以看见脚本的print输出
切换到新加坡的Region 看看,我的快照已经成功的拷贝过去了
这样一来,我的重要备份就可以自动地复制一份到新加坡了。万一出现极端黑天鹅事件,比如悉尼所有的数据中心都第一时间被摧毁了,我还能从新加坡那边把服务器抢救回来。老板可以睡个安稳觉了。
标签:lambda rip 手动 start 要求 mic 指示 nat 数据
原文地址:https://blog.51cto.com/beanxyz/2515077