函数计算自动化运维实战2 -- 事件触发eip自动转移

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 函数计算是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码, 而云监控可以监测到具体的ecs事件,并且可以把这事件的处理交给函数,完美实现事件驱动的自动化运维

函数计算

阿里云函数计算是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询,性能监控,报警等功能。借助于函数计算,您可以快速构建任何类型的应用和服务,无需管理和运维。更棒的是,您只需要为代码实际运行消耗的资源付费,而代码未运行则不产生费用。

云监控

阿里云云监控为云上用户提供开箱即用的企业级开放型一站式监控解决方案。涵盖IT设施基础监控,外网网络质量拨测监控,基于事件、自定义指标、日志的业务监控。为您全方位提供更高效、更全面、更省钱的监控服务。

云监控提供了丰富事件,并且事件还在不断丰富中(云产品系统事件监控), 丰富的事件触发自定义处理的函数,可以实现更加完美的的自动化运维。

专题传送门 => 函数计算进行自动化运维专题

示例场景

假设两台ECS机器A, B, A 机器出现了宕机,这个时候需要把A机器上的eip迁移到备用机器B上,这个利用云监控的报警和函数计算可以实现EIP的自动迁移, 云监控检测到A宕机这个事件,然后触发函数执行,函数实现eip的自动迁移

操作步骤

注:记得给函数的service的role设置操作ecs和eip的权限
image

image
image

  • mock调试
    image

image

image

代码

# -*- coding: utf-8 -*-
import logging
import json, random, string, time
from aliyunsdkcore import client
from aliyunsdkvpc.request.v20160428.AssociateEipAddressRequest import AssociateEipAddressRequest
from aliyunsdkvpc.request.v20160428.UnassociateEipAddressRequest import UnassociateEipAddressRequest
from aliyunsdkvpc.request.v20160428.DescribeEipAddressesRequest import DescribeEipAddressesRequest
from aliyunsdkcore.auth.credentials import StsTokenCredential

LOGGER = logging.getLogger()
clt = None

def 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 
    pass
  
def 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 = UnassociateEipAddressRequest()
  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 = AssociateEipAddressRequest()
  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 False

def 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 request
def _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) 
相关实践学习
基于云监控实现的监控系统
通过阿里云云监控功能给非阿里云主机安装监控插件,从而实现对非阿里云主机的各项指标进行监控和管理,在配置报警规则和报警人的情况下,能对特定的场景做出报警反应通知到报警人的手机上。
目录
相关文章
|
弹性计算 人工智能 机器人
|
数据可视化 Linux 数据中心
服务器版Rstudio-server初体验丨随时随地云端处理数据,不再担心电脑崩盘重启了!
服务器版Rstudio-server初体验丨随时随地云端处理数据,不再担心电脑崩盘重启了!
|
9月前
|
存储 运维 监控
降本 60%!小熊油耗使用阿里云 SAE 更加稳定可靠
小熊油耗在进行架构升级时,进行了广泛的市场调研,深入分析了国内多家云服务商。经过对比多种 IaaS 层云主机方案及 Serverless 产品的部署策略,他们最终选择了阿里云Serverless 应用引擎 SAE。小熊油耗认为,阿里云能给他们提供更强的安全感,安全感来自于阿里云是一个更大的平台:历史最悠久,用户最多、产品最丰富、配套工具众多、技术支持体系成熟,阿里云 SAE,不仅在稳定性上表现卓越,在细粒度的成本控制和极致的弹性能力上表现也非常出色,而且免运维,完美契合了小熊油耗作为一家细分领域小而美的公司的需求。
783 10
|
25天前
|
存储 人工智能 测试技术
AI 场景深度优化!K8s 集群 OSSFS 2.0 存储卷全面升级,高效访问 OSS 数据
OSSFS 2.0通过轻量化协议设计、协程化技术及FUSE3低级API重构,实现大文件顺序读写与小文件高并发加载的显著提升,在实际测试中表现出高达数十倍的吞吐量增长。适用于机器学习训练、推理等对高带宽低延迟要求严苛的场景,同时支持静态和动态挂载方式,方便用户在ACK集群中部署使用。
235 34
|
7月前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
5月前
|
人工智能 安全 Dubbo
Spring AI 智能体通过 MCP 集成本地文件数据
MCP 作为一款开放协议,直接规范了应用程序如何向 LLM 提供上下文。MCP 就像是面向 AI 应用程序的 USB-C 端口,正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一个将 AI 模型连接到不同数据源和工具的标准化方法。
2690 49
|
9月前
|
存储 人工智能 运维
正式收官!阿里云函数计算携手优酷,用 AI 重塑影视 IP 创新边界
近日,阿里云联合优酷发起的 Create@影视 IP x AI 应用创新大赛,将网剧《少年白马醉春风》这一热门影视 IP 与阿里云 AI 技术相结合,由阿里云函数计算提供 AIGC 技术支持参赛者基于网剧《少年白马醉春风》IP 或“少年江湖”精神内核,用 AI 生成角色场景设计、手办设计、破次元合照、数字人等多样化的作品。
252 11
|
7月前
|
运维 Java Serverless
Serverless 微服务治理神器: 阿里云 SAE 全链路灰度揭秘
SAE 会继续致力于为用户提供极简易用、成本低廉、功能强大的 Serverless 应用全托管平台:“我们希望让用户做的更少而收获更多,通过 Serverless 化,深度用云就像用水电煤一样简单”。
1485 54
|
8月前
|
人工智能 JSON Serverless
1024!一张照片定制程序员科技感写真
10 月 21 日—11 月 29 日,三步轻松完成体验,即可获得精美电脑包,(活动期间每个工作日限量 30 个,先到先得)参与活动官网邀请挑战,更有罗马仕充电宝、帆布袋等好礼相送。
|
8月前
|
数据采集 人工智能 自然语言处理
AI Agent 金融助理0-1 Tutorial 利用Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股) AI Finance Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent

相关产品

  • 函数计算