Python实现ECS自动镜像创建&镜像复制至其他地域

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介:

一、背景

1.1 问题:

同事反馈有可以鉴于目前几次大的公有云事故,腾讯云/阿里云两大公有云厂商尚且存在这样令人触目惊心的时刻,更何况其他厂商和我们的日常操作,有人的地方就有误操作,百分之一的风险但如果一旦发生就是100%的问题,虽SLA但或多或少存在影响,客户反馈如果阿里的A地域发生故障,例如地质灾害或不可控因素引发的ecs无法访问,用户数据都在云上无法操作情况下该如何,但考虑到不同地域灾备的高额度IT成本,想采用每天ecs的冷备。

1.2 思路:

在最大程度的降低IT成本,又想在不可控大规模地域性灾难面前做些什么,每天凌晨业务低峰期对ECS制作镜像,同时复制到其他的不同地域,如北京的镜像复制到上海,当北京整个region异常情况下,可利用复制在目标地域的ECS创建出来,在此抛砖引玉,后续可以将ecs在目标地域开出来并关机,归档删除之前的镜像,等等。同样可以将RDS备份也同样备份到异地OSS内,目前阿里已经有EBS非常方便的灾难情况下恢复RDS。利用此思路同意的适用于其他场景下。

二、代码

2.1 结构


如果多个实例可同时写入配置文件,用,进行分割。

2.2 核心代码

配置文件

# 阿里云ak配置,建议采用子账户只授权ecs镜像操作
[common]
# 阿里云acccesskeyid
accessKeyId = LTAIhfXlcjyln6tW
# 阿里云accesssecret
accessSecret = GwfAMvR4K2ELmt76184oqLTVgRfAso
# log目录名称
logdir_name = logdir
# log文件名称
logfile_name = ecsoperlog.log

# ecs源地域配置信息段
#支持在华北 1、华北 2、华北 3、华北 5、华东 1、华东 2 和华南 1 地域之间复制镜像。涉及其他国家和地区地域时,可以 提交工单 申请
[source]
# 源地域实例regionid,可以参考:https://help.aliyun.com/document_detail/40654.html?spm=a2c1g.8271268.10000.5.5f98df25B98bhJ
s_RegionId = cn-shanghai

# 源实例id,可指定多个用,进行分隔
s_InstanceId =  i-uf661wb708uvqc9jyhem,i-uf661wb708uvqc9jyhel

# 源端制作镜像name
s_ImageName = api-source-image

# 源镜像描述信息
s_Description = api-source-image源镜像描述信息

# 镜像复制目的地域配置信息段
[destination]
# 目的地域实例regionid,
d_DestinationRegionId = cn-qingdao

# 复制过来的镜像名称
d_DestinationImageName = api-destination-image

# 复制过来的镜像描述信息
d_DestinationDescription = api-destination-image目的镜像描述信息

image操作(制作镜像->查看镜像制作状态->复制镜像)

    # 创建实例生成器
    def _get_Instance(self):
        for Instance in self.s_InstanceId_list.split(','):
            yield Instance
                        
    def _create_image(self):
        """
        创建镜像
        :return:返回镜像id
        """
        s_timer = time.strftime("%Y-%m-%d-%H:%M", time.localtime(time.time()))
        request = CreateImageRequest.CreateImageRequest()
        request.set_accept_format('json')
        request.add_query_param('RegionId', self.s_RegionId)
        request.add_query_param('InstanceId', self.s_InstanceId)
        request.add_query_param('ImageName', self.s_ImageName + s_timer)
        request.add_query_param('Description', self.s_Description + s_timer)
        response = self.ecshelper.do_action_with_exception(request)
        self.logoper.info('创建镜像任务已提交,镜像id:%s' % json.loads(response)["ImageId"])
        print('创建镜像任务已提交,镜像id:%s' % json.loads(response)["ImageId"])
        return json.loads(response)["ImageId"]
                
 def _describe_image(self,imageid):
        """
        查询image状态
        :param imageid:
        :return:
        """
        request = DescribeImagesRequest.DescribeImagesRequest()
        request.set_accept_format('json')
        request.add_query_param('RegionId', self.s_RegionId)
        request.add_query_param('ImageId', imageid)
        response = self.ecshelper.do_action_with_exception(request)
        # 进度 json.loads(response)['Images']['Image'][0]['Progress']
        self.logoper.info('镜像创建进度:%s' %json.loads(response)['Images']['Image'][0]['Progress'])
        # 镜像状态
        return json.loads(response)['Images']['Image'][0]['Status']


    #镜像复制
    def _copy_image(self,imageid):
        """
        镜像复制
        :param imageid:源镜像id
        :return: 复制成功后的镜像id
        """
        flag = True
        while flag:
            try:
                if self._describe_image(imageid) == 'Available':
                    flag = False
                else:
                    time.sleep(300)
            except Exception as e:
                pass
        print('镜像已经创建完成')
        d_timer = time.strftime("%Y-%m-%d-%H:%M", time.localtime(time.time()))
        request = CopyImageRequest.CopyImageRequest()
        request.set_accept_format('json')
        request.add_query_param('RegionId', self.s_RegionId)
        request.add_query_param('DestinationRegionId', self.d_DestinationRegionId)
        request.add_query_param('DestinationImageName', self.d_DestinationImageName + d_timer)
        request.add_query_param('DestinationDescription', self.d_DestinationDescription + d_timer)
        request.add_query_param('ImageId', imageid)
        response = self.ecshelper.do_action_with_exception(request)
        self.logoper.info('复制镜像任务已提交,镜像id:%s' % json.loads(response)['ImageId'])
        print('复制镜像任务已提交,镜像id:%s' % json.loads(response)['ImageId'])
        return json.loads(response)['ImageId']

三、测试

3.1 查看运行结果

3.2 查看web控制台

源镜像

添加了时间戳,方便查看

目的地域镜像

3.3 查看日志

四、优化

  • 可以后续增加对制定天数的镜像进行归档删除
相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
4天前
|
存储 固态存储 安全
阿里云服务器香港地域租用收费标准参考
阿里云有香港云服务器吗?当然是有的,香港地域云服务器即可满足外贸型企业用户需求,也可以满足部分国内用户的需求,本文为大家展示2024年阿里云服务器香港地域的最新收费标准,以供参考。
阿里云服务器香港地域租用收费标准参考
|
15天前
|
机器学习/深度学习 数据挖掘 Python
使用Python实现简单的Web服务器
使用Python内置的http.server模块,本文演示了创建基本Web服务器的步骤。通过编写简单的代码,实现响应GET请求并返回“Hello, World!”。此外,还展示了如何扩展服务器功能,处理不同URL路径,如根路径和/about路径,并实现404错误页面。这个基础教程为理解HTTP服务器原理和Python网络编程入门提供了帮助。对于复杂Web应用,建议使用Flask或Django等高级框架。
|
17天前
|
Linux 网络安全 开发工具
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
22 0
|
18天前
|
弹性计算 负载均衡 容灾
阿里云服务器地域和可用区是什么关系?云服务器地域和可用区选择参考
在我们选择阿里云服务器地域的时候,不管是选择国内的云服务器还是国外地域的云服务器,都有多个地域及可用区选择,那么什么是地域?什么是可用区?他们之间有何关系?云服务器地域和可用区应该如何选择呢?本文来为大家做个简单的介绍及选择参考。
阿里云服务器地域和可用区是什么关系?云服务器地域和可用区选择参考
|
23天前
|
缓存 中间件 数据安全/隐私保护
在Python中实现代理服务器的配置和使用方法
在Python中实现代理服务器的配置和使用方法
|
25天前
|
弹性计算 负载均衡 Linux
阿里云服务器地域、实例、带宽与操作系统选择思路参考
在数字化时代,无论是个人博客、企业官网、APP后端支持,还是小程序运行,云服务器都扮演着至关重要的角色。考虑到性价比大家现在都喜欢选择阿里云服务器。然而,对于初次接触云服务的新手来说,可能并不是很清楚应该如何选阿里云服务器的地域、实例、带宽与操作系统等配置。本文将从地域选择、实例规格、操作系统、云盘配置、购买时长以及带宽选择等六个方面,为新手用户提供详细的选购思路参考,以免选错或者不合适需要从新选择。
阿里云服务器地域、实例、带宽与操作系统选择思路参考
|
27天前
|
缓存 运维 Linux
保姆级python项目离线部署服务器教程只需这一篇就够了(建议收藏)
这篇文章提供了详尽的Python项目在离线Linux(CentOS)服务器上的部署教程。作者首先介绍了环境背景,强调了无网络环境和使用有网络的CentOS虚拟机准备安装包的重要性。教程分为两部分:外网环境搭建和内网离线安装。在外网环境中,包括下载Python 3.9.0安装包、传输至服务器、安装依赖包,并使用pip3下载项目所需依赖。内网安装则涉及依赖包的复制和Python环境的同样步骤。最后,作者分享了运行项目的命令,并总结了离线安装的整个流程,提醒读者注意可能出现的问题。
保姆级python项目离线部署服务器教程只需这一篇就够了(建议收藏)
|
1月前
|
Web App开发 数据采集 Docker
docker 安装python3.8环境镜像并导入局域网
docker 安装python3.8环境镜像并导入局域网
59 7
|
1月前
|
存储 弹性计算 安全
阿里云服务器8核16G配置不同实例规格及地域最新收费标准与活动价格参考
8核16G配置的阿里云服务器有多种实例规格可选,选择不同实例规格和地域,其收费标准和活动价格都是不一样的,2024年阿里云开启了新一轮的云产品降价策略,因此8核16G配置云服务器的收费标准也有所变化。本文为大家展示阿里云服务器8核16G配置可选的实例规格及这些实例规格在不同地域之间的收费标准情况,让大家可以了解不同地域之间的收费标准差异情况。
阿里云服务器8核16G配置不同实例规格及地域最新收费标准与活动价格参考