【AWS 征文】AWS Lambda 自动拷贝EC2 快照

这周老板给了个指示,有几个关键业务的服务器的备份需要额外的再做一个异地备份,以防万一。目前公司的服务器都在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里面了。当我们拷贝快照的时候,第一次是全备份,之后会自动进行增量备份。

控制台的操作如下所示:

【AWS 征文】AWS Lambda 自动拷贝EC2 快照

【AWS 征文】AWS Lambda 自动拷贝EC2 快照

除了控制台的手动操作,我们也可以通过Snapshot Lifecycle Manager进行控制,里面提供了 Cross Region copy 的选择。

【AWS 征文】AWS Lambda 自动拷贝EC2 快照

豆子的选择方案是通过 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的全部访问权限。

【AWS 征文】AWS Lambda 自动拷贝EC2 快照

Role里面他默认有一个权限可以访问Cloudwatch 记录日志,除此之外,我添加了一个EC2的管理权限

【AWS 征文】AWS Lambda 自动拷贝EC2 快照

在CloudWatch里面添加事件的Rule

【AWS 征文】AWS Lambda 自动拷贝EC2 快照

测试一下,监控Cloudwatch 的 Log groups,可以看见脚本的print输出

【AWS 征文】AWS Lambda 自动拷贝EC2 快照

切换到新加坡的Region 看看,我的快照已经成功的拷贝过去了

【AWS 征文】AWS Lambda 自动拷贝EC2 快照

这样一来,我的重要备份就可以自动地复制一份到新加坡了。万一出现极端黑天鹅事件,比如悉尼所有的数据中心都第一时间被摧毁了,我还能从新加坡那边把服务器抢救回来。老板可以睡个安稳觉了。

猜你喜欢

转载自blog.51cto.com/beanxyz/2515077