函数计算自动化运维实战 2 -- 事件触发 eip 自动转移
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,函数计算阿里云函数计算是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询,性能监
千家信息网最后更新 2025年12月01日函数计算自动化运维实战 2 -- 事件触发 eip 自动转移
函数计算
阿里云函数计算是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询,性能监控,报警等功能。借助于函数计算,您可以快速构建任何类型的应用和服务,无需管理和运维。更棒的是,您只需要为代码实际运行消耗的资源付费,而代码未运行则不产生费用。
云监控
阿里云云监控为云上用户提供开箱即用的企业级开放型一站式监控解决方案。涵盖 IT 设施基础监控,外网网络质量拨测监控,基于事件、自定义指标、日志的业务监控。为您全方位提供更高效、更全面、更省钱的监控服务。
云监控提供了丰富事件,并且事件还在不断丰富中(云产品系统事件监控), 丰富的事件触发自定义处理的函数,可以实现更加完美的的自动化运维。
专题传送门 => 函数计算进行自动化运维专题
示例场景
假设两台 ECS 机器A, B, A 机器出现了宕机,这个时候需要把 A 机器上的 eip 迁移到备用机器 B 上,这个利用云监控的报警和函数计算可以实现EIP的自动迁移, 云监控检测到 A 宕机这个事件,然后触发函数执行,函数实现 eip 的自动迁移
操作步骤
创建函数(函数代码在文末),函数创建可参考函数计算helloworld
注:记得给函数的 service 的 role 设置操作 ecs 和 eip 的权限
cdn.com/969096ef4233ea658e1ccf75686a7c4620269329.png">- 登录云监控控制台, 创建报警规则, 监控的事件为 ecs 重启开始
- mock调试
模拟真实的 ecs 事件
- 请参考演练系统事件处理程序? So Easy~
代码
# -*- coding: utf-8 -*-import loggingimport json, random, string, timefrom aliyunsdkcore import clientfrom aliyunsdkvpc.request.v20160428.AssociateEipAddre***equest import AssociateEipAddre***equestfrom aliyunsdkvpc.request.v20160428.UnassociateEipAddre***equest import UnassociateEipAddre***equestfrom aliyunsdkvpc.request.v20160428.DescribeEipAddressesRequest import DescribeEipAddressesRequestfrom aliyunsdkcore.auth.credentials import StsTokenCredentialLOGGER = logging.getLogger()clt = Nonedef handler(event, context): creds = context.credentials sts_token_credential = StsTokenCredential(creds.access_key_id, creds.access_key_secret, creds.security_token) ''' { "product": "ECS", "content": { "executeFinishTime": "2018-06-08T01:25:37Z", "executeStartTime": "2018-06-08T01:23:37Z", "ecsInstanceName": "timewarp", "eventId": "e-t4nhcpqcu8fqushpn3mm", "eventType": "InstanceFailure.Reboot", "ecsInstanceId": "i-bp18l0uopocfc98xxxx" }, "resourceId": "acs:ecs:cn-hangzhou:123456789:instance/i-bp18l0uopocfc98xxxx", "level": "CRITICAL", "instanceName": "instanceName", "status": "Executing", "name": "Instance:SystemFailure.Reboot:Executing", "regionId": "cn-hangzhou" } ''' evt = json.loads(event) content = evt.get("content"); ecsInstanceId = content.get("ecsInstanceId"); regionId = evt.get("regionId"); global clt clt = client.AcsClient(region_id=regionId, credential=sts_token_credential) name = evt.get("name"); eipId = "eip-bp1nexxxc7zjfnex6i0"; standbyEcsId = "i-bp19yycxx7yroukxpv" name = name.lower() if name in ['Disk:Stalled:Executing'.lower(), 'Instance:SystemFailure.Reboot:Executing'.lower(), "Instance:InstanceFailure.Reboot:Executing".lower()]: print("move eip to standbyEcs"); move_eip(ecsInstanceId, standbyEcsId, eipId) # move eip to standbyEcs else: # other event to do passdef getEipStatus(eip): request = DescribeEipAddressesRequest() request.set_AllocationId(eip) request.add_query_param("RegionId", "cn-hangzhou") response = _send_request(request) if isinstance(response, dict) and "RequestId" in response: EipAddresses = response.get('EipAddresses', {}) EipAddress = EipAddresses['EipAddress'][0] status = EipAddress['Status'] return status else: LOGGER.error("getEipAddressDesc {} fail".format(eip))def unAssociateEip(ecs_id, eip): request = UnassociateEipAddre***equest() request.set_AllocationId(eip) request.set_InstanceType('EcsInstance') request.set_InstanceId(ecs_id) response = _send_request(request) if isinstance(response, dict) and "RequestId" in response: LOGGER.info("UnassociateEipAddress {} from {} succ".format(ecs_id, eip)) else: LOGGER.error("UnassociateEipAddress {} from {} fail".format(ecs_id, eip))def associateEip(ecs_id, eip): associte_request = AssociateEipAddre***equest() associte_request.set_AllocationId(eip) associte_request.set_InstanceType('EcsInstance') associte_request.set_InstanceId(ecs_id) associte_response = _send_request(associte_request) if isinstance(associte_response, dict) and "RequestId" in associte_response: LOGGER.info("AssociateEipAddress {} to {} succ".format(eip, ecs_id)) return True return Falsedef move_eip(from_ecs, to_ecs, eip): unAssociateEip(from_ecs, eip) # wait unAssociateEip ... time.sleep(3) # retry 30s util sucess for i in xrange(10): eip_status = getEipStatus(eip).lower() if eip_status == 'available': if associateEip(to_ecs, eip): LOGGER.info("AssociateEipAddress {} to {} succ".format(eip, to_ecs)) return else: LOGGER.info("eip status = {}".format(eip_status)) time.sleep(3) LOGGER.info("AssociateEipAddress {} to {} fail".format(eip, to_ecs))# send open api requestdef _send_request(request): request.set_accept_format('json') try: response_str = clt.do_action_with_exception(request) LOGGER.info(response_str) response_detail = json.loads(response_str) return response_detail except Exception as e: LOGGER.error(e)"阿里巴巴云原生微信公众号(ID:Alicloudnative)关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术公众号。"
函数
监控
事件
代码
服务
机器
技术
阿里
报警
运行
自动化
专题
公众
基础
日志
系统
设施
资源
参考
处理
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
哈弗f 7听音乐连接不上服务器
地球仪伴奏软件开发
用数据库创建一个简单的表格
攀枝花高密度存储服务器代理
澳大利亚帕斯软件开发工作
ibm服务器3650功率
省市县三级联动 的数据库
南昌县网络安全保卫大队队长
西安交大网络安全有调剂名额吗
java的数据库怎么连接前端
更改plsql数据库编码
方舟怎么服务器刷琥珀
c# 数据库访问超时处理
软件开发公司简介范文
浦东新区软件开发创新服务
服务器登录说没有安全退出怎么办
深度学习服务器是什么
2020网络安全周报道美篇
郑州在线学习软件开发
wifi服务器名称在哪里看
软件开发有30个员工
青岛科技大学工业互联网科创项目
学校服务器挤进去
ibm服务器查询维保
网络安全为主题的申论
珠海支付软件开发费用是多少
下列属于索引数据库的
打开服务器文件夹
服务器上如何查看表结构
服务器硬盘有多少寸的