专栏首页edsion的小窝【SCF CLI实践】腾讯云serverless + 企业微信群机器人,轻松解决告警通知问题
原创

【SCF CLI实践】腾讯云serverless + 企业微信群机器人,轻松解决告警通知问题

市面上有什么好用的从服务器推报警和日志的工具?之前私下用的是[Server酱]的服务,非常方便。

但是考虑到安全原因,这个服务如果用在生产环境心里还是有点慌(虽然我相信Server酱是很有节操的)。

另外,出于想把工作和生活分开的私心(并不能),所以一直在探索使用企业微信来实现通知的方案(自建应用的话还要考虑通知的到达率,实在有心无力)。

之前已经基于企业微信的自建应用API,开发和部署了一个服务,技术方案是 docker + django + mysql + celery + redis。开发时要达到高可用,涉及 access_token 的刷新,还要考虑任务队列、分布式锁等等,真是折腾。

今天(2019-6-28)在更新企业微信时,发现增加了个群机器人的功能,赶紧查了一下文档发现挺符合需求的。群机器人的优点是,通知基于群组,有问题时直接可以在群内沟通,也不会存在重新拉群还需要介绍背景,人员发生变动时拉新人进群即可。

监控报警的脚本可以放在自己的服务器上,但是一旦遇到光纤被挖断了、停电这种外部因素,就需要一些外部手段来监控了。这里我推荐一下腾讯云无服务器云函数(Serverless Cloud Function,SCF),免费,如果用腾讯云的其它服务还有各种加成,现在还有【活动链接】(写个简单的demo就行)送腾讯云的通用代金券、公仔等。

这里我就写个简单的天气小助手,来演示一下整个流程。

环境搭建

首先要先安装 SCF CLI

mkdir WeworkWeatherReport
cd WeworkWeatherReport
# 这里用的是pipenv安装的,如果觉得麻烦或者不熟悉此命令,也可以按照官方的演示直接用pip安装
# 即:用"pip install"替换文中"pipenv install","scf"替换文中"pipenv run scf"
$pipenv install --python 3.6 -i https://mirrors.cloud.tencent.com/pypi/simple scf
Creating a virtualenv for this project…
Pipfile: /Users/edsion/Documents/WeworkWeatherReport/Pipfile
Using /Users/edsion/.pyenv/versions/3.6.8/bin/python3 (3.6.8) to create virtualenv…
⠧ Creating virtual environment...Using base prefix '/Users/edsion/.pyenv/versions/3.6.8'
New python executable in /Users/edsion/.local/share/virtualenvs/WeworkWeatherReport-et9Xz9ZJ/bin/python3
Also creating executable in /Users/edsion/.local/share/virtualenvs/WeworkWeatherReport-et9Xz9ZJ/bin/python
Installing setuptools, pip, wheel...
done.
Running virtualenv with interpreter /Users/edsion/.pyenv/versions/3.6.8/bin/python3

✔ Successfully created virtual environment!
Virtualenv location: /Users/edsion/.local/share/virtualenvs/WeworkWeatherReport-et9Xz9ZJ
Creating a Pipfile for this project…
Installing scf…
Adding scf to Pipfile's [packages]…
✔ Installation Succeeded

$pipenv run scf --version   # 验证是否安装成功
SCF CLI, version 0.0.3

这里使用的是 python 3.6,尽量使用SCF支持的版本来开发和调试。使用腾讯云的镜像,可以加速下载,避免pypi被墙的问题。

通过SCF CLI可以简化流程,规避一些配置、部署等问题,尽快看到效果,所以强烈建议使用。

配置SCF CLI

这里需要 账号的 APPID,SecretId,SecretKey 以及产品期望所属的地域。

APPID

通过腾讯云的控制台,点击自己头像 - 账号信息查看。

SecretId和SecretKey

基于安全考虑,这里需要使用“子账户”。打开腾讯云控制台 - 访问管理 - 用户 - 新建用户,随便起个名字,例如scf-admin,勾选“编程访问”后点击下一步。从策略列表中选取策略关联,搜索“scf”相关策略,根据需要勾选。用户创建完成后,回到用户列表,点击该用户选择“API密钥”,即可看到SecretId和SecretKey。

006tNc79ly1g4h2imn34hj316o0prwh6.jpg

产品期望所属的地域

目前通过控制台可以看到地域有广州、上海、中国香港、北京、成都。如果有用到腾讯云的其它服务,例如云服务器CVM、对象存储COS,建议可用区保持一致,即使将来收费,按照良心云的套路同可用区内的流量应该是免费的。

这里文档有个小坑,并没有写明可用区的名称,所以参考了COS文档中关于地域的说明。我是用的上海,所以地域是ap-shanghai

这里有个坑,SCF的文档中没有对于可用区的说明,而是沿用了【腾讯云API文档】中关于地域的定义。

配置CLI

根据以上参数,执行以下命令,完成 SCF CLI 的配置:

$pipenv run scf configure set --region ap-shanghai --appid 125xxxxx --secret-id AKIxxxxxxxxxx --secret-key uxxlxxxxxxxx
$pipenv run scf configure get    # 检查配置
API config:
appid = 125xxxxx
region = ap-shanghai
secret-id = ********************************M1c9
secret-key = ****************************Z4Ne

如果没有错误,不会显示任何提示,此时配置完成进入下一步。

初始化模板项目

通过 scf init 命令进行项目初始化操作。详细的参数可以查看文档

$pipenv run scf init --runtime python3.6 --name WeworkWeatherReport --output-dir .
[+] Initializing project...
Template: /Users/edsion/.local/share/virtualenvs/WeworkWeatherReport-et9Xz9ZJ/lib/python3.6/site-packages/tcfcli/cmds/init/templates/tcf-demo-python
Output-Dir: .
Project-Name: WeworkWeatherReport
Runtime: python3.6
[*] Project initialization is complete

$ tree
.
├── Pipfile
├── Pipfile.lock
└── WeworkWeatherReport
    ├── README.md
    ├── __pycache__
    │ Ð  └── index.cpython-36.pyc
    ├── index.py
    └── template.yaml

2 directories, 6 files

创建企业微信群机器人

经过咨询,目前群机器人还是处于灰度测试阶段,不是所有企业都已自动开通。联系你们公司的管理员,如果找不到 “企业微信后台 - > 应用与小程序 - > 自建 -> 群机器人”,只能耐心等待。

首先,确保你的企业微信已更新到最新(2.8.7)。然后拉一个群(至少3个人),在群里点右上角,添加成员的下方会多出来一个“群机器人”。按照提示填写一些基本信息即可完成创建(比较简单,看图吧):

IMG_0526.png
IMG_0527.png
IMG_0528.png
IMG_0529.png

最后,拿到webhook地址就算完成了。

注意:webhook地址里已经携带了鉴权参数,所以此URL 不应 泄漏给任何人。

另外,目前测试如果群内有外部人员时,是无法使用群机器人的,不知道后面会不会放开。

用CURL测试一下:

$ curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=acd8cabe-xxx-xxx' -H 'Content-Type: application/json' -d '{"msgtype":"text","text":{"content":"hello world"}}'
{"errcode":0,"errmsg":"ok"}
006tNc79ly1g4h45msshjj30n01ds75e.jpg

编写和调试代码,实现通过免费API获取天气和推送消息

免费天气API有很多,这里使用的是彩云天气的,可以根据经纬度获取实时天气,还有精确到分钟级的降雨预报。代码很简单,就不详细解释了。

#!/usr/bin/env python3
# -*- coding:utf-8 _*-
"""
@author: edsion
@file: index.py
@time: 2019/06/28
@contact: edsion@21kunpeng.com

"""
import os
import json
import urllib3

X = os.getenv('X', '121.6544')  # 要获取天气信息的经度
Y = os.getenv('Y', '25.1552')   # 要获取天气信息的纬度

SKYCON = {
    'CLEAR_DAY': "晴(白天)",
    'CLEAR_NIGHT': "晴(夜间)",
    'PARTLY_CLOUDY_DAY': '多云(白天)',
    'PARTLY_CLOUDY_NIGHT': '多云(夜间)',
    'CLOUDY': '阴',
    'WIND': '大风',
    'HAZE': '雾霾',
    'RAIN': '雨',
    'SNOW': '雪',
    'Unknown': '其它'
}
COMFORT = {
    -1: '未知',
    0: '闷热',
    1: '酷热',
    2: '很热',
    3: '热',
    4: '温暖',
    5: '舒适',
    6: '凉爽',
    7: '冷',
    8: '很冷',
    9: '寒冷',
    10: '极冷',
    11: '刺骨的冷',
    12: '湿冷',
    13: '干冷',
}


def translate_aqi(n):
    if 0 < n <= 50:
        return f'<font color="info">{n}-优</font>'
    elif 50 < n <= 100:
        return f'<font color="info">{n}-良</font>'
    elif 100 < n <= 150:
        return f'<font color="warning">{n}-轻度污染</font>'
    elif 150 < n <= 200:
        return f'<font color="warning">{n}-中度污染</font>'
    elif 200 < n <= 300:
        return f'<font color="warning">{n}-重度污染</font>'
    elif n > 300:
        return f'<font color="warning">{n}-严重污染</font>'
    else:
        return f'<font color="comment">{n}-未知</font>'


def template_string(**kwargs):
    return """当前《公司》位置天气<font color="warning">{skycon}</font>
> 气温:{temperature:.2f}摄氏度(℃)
> 气压:{pres:.2f}千帕(kPa)
> 相对湿度:{humidity:.0f}%
> 风向:{wind_direction:.0f}(从北顺时针0~360°)
> 风速:{wind_speed}公里/小时(km/h)
> 能见度:{visibility}公里(km)
> pm2.5:{pm25}μg/m³
> AQI(国标):{aqi}
> 最近的降水带:<font color="warning">{precipitation}</font>公里(km)
> 舒适度:{comfort}
""".format(**kwargs)


def main_handler(event, context):
    http = urllib3.PoolManager()
    r = http.request(
        method='GET',
        url=f'https://api.caiyunapp.com/v2/TAkhjf8d1nlSlspN/{X},{Y}/realtime.json?lang=zh_CN&unit=metric&tzshift=28800')
    print(f'API Response:{r.data}')
    res = json.loads(r.data)
    assert res.get('status') == 'ok'
    result = res.get('result')
    assert result
    assert result.get('status') == 'ok'
    content = template_string(
        skycon=SKYCON.get(result.get('skycon', 'Unknown')),
        temperature=result.get('temperature', 'Unknown'),
        pres=result.get('pres', 0) / 1000,
        humidity=result.get('humidity', 0) * 100,
        wind_direction=result.get('wind', {}).get('direction', 'Unknown'),
        wind_speed=result.get('wind', {}).get('speed', 'Unknown'),
        precipitation=result.get('precipitation', {}).get('nearest', {}).get('distance', 'Unknown'),
        visibility=result.get('visibility', 'Unknown'),
        pm25=result.get('pm25', 'Unknown'),
        aqi=translate_aqi(result.get('aqi', -1)),
        comfort=COMFORT.get(result.get('comfort', {}).get('index', -1)),
    )
    encoded_data = json.dumps({"msgtype": "markdown", "markdown": {'content': content}}).encode('utf-8')
    rr = http.request(method='POST', url=os.getenv('WEBHOOK_URL'), body=encoded_data,
                      headers={'Content-Type': 'application/json'})
    print(f'webhook response:{rr.data}')
    assert json.loads(rr.data).get('errcode') == 0
    return r.status


if __name__ == '__main__':
    main_handler(None, None)

要在本地运行此代码,配置环境变量:经纬度、webhook地址,即可——如此设计,不用改代码就可以轻易修改位置、群机器人。

本地运行结果如下:

006tNc79ly1g4h7b54oh2j307f06wmxw.jpg

关于本地调试,因为场景过于简单,我是直接在pycharm中配置环境变量后运行的。如果需要对事件来源(event)等参数进行调试,可以使用 SCF CLI 的 native invokelocal invoke,具体请查阅文档

函数打包和部署

scf cli 通过 package 子命令来完成函数打包。依据指定的函数模板配置文件打包后,生成部署使用的配置文件。

根据前面的步骤,项目文件夹内应该已经生成了模版配置文件template.yaml,根据实际情况修改环境变量(经纬度、webhook地址),并优化一下如描述、超时时间等参数:

Resources:
  default:
    Type: TencentCloud::Serverless::Namespace
    WeworkWeatherReport:
      Type: TencentCloud::Serverless::Function
      Properties:
        CodeUri: ./WeworkWeatherReport/
        Description: 这是一个通过企业微信群机器人进行天气预报的小程序
        Environment:
          Variables:
            X: "121.6544"   # 要获取天气信息的经度
            Y: "25.1552"    # 要获取天气信息的纬度
            WEBHOOK_URL: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=acd8cabe-xxxxx  # 企业微信群机器人的webhook地址
        Handler: index.main_handler
        MemorySize: 128
        Runtime: Python3.6
        Timeout: 10
Globals:
  Function:
    Timeout: 30

注意:我们这里的目录结构与官方文档中不太一致,所以我修改了CodeUri,否则之后部署的时候会出错。

执行命令,进行打包:

$ pipenv run scf package --template-file WeworkWeatherReport/template.yaml
Generate deploy file 'deploy.yaml' success

根据显示的信息可以注意到,新增了一个deploy.yaml的文件:

Resources:
  default:
    Type: TencentCloud::Serverless::Namespace
    WeworkWeatherReport:
      Properties:
        CodeUri: ./
        Description: "\u8FD9\u662F\u4E00\u4E2A\u901A\u8FC7\u4F01\u4E1A\u5FAE\u4FE1\
          \u7FA4\u673A\u5668\u4EBA\u8FDB\u884C\u5929\u6C14\u9884\u62A5\u7684\u5C0F\
          \u7A0B\u5E8F"
        Environment:
          Variables:
            WEBHOOK_URL: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=acd8cabe-xxxxx
            X: "121.6544"
            Y: "25.1552"
        Handler: index.main_handler
        LocalZipFile: /Users/edsion/Documents/WeworkWeatherReport/./.tcf_build/52a5e968-99ae-11e9-b0db-003ee1c86353.zip
        MemorySize: 128
        Runtime: Python3.6
        Timeout: 10
      Type: TencentCloud::Serverless::Function

再执行deploy子命令即可执行部署:

$ pipenv run scf deploy --template-file deploy.yaml
deploy default begin
Deploy function 'WeworkWeatherReport' success
deploy default end

如无异常,此时在腾讯云的控制台中已经可以看到刚创建的WeworkWeatherReport“函数”:

006tNc79ly1g4h8d82i7uj31d10aljss.jpg

如果代码需要更新,要重新执行打包-部署的流程,但是部署时需要添加--forced参数:

$ pipenv run scf package --template-file WeworkWeatherReport/template.yaml
Generate deploy file 'deploy.yaml' success
$ pipenv run scf deploy --forced --template-file deploy.yaml
deploy default begin
default WeworkWeatherReport already exists, update it now
Deploy function 'WeworkWeatherReport' success
deploy default end

添加触发方式

最后,在腾讯云的控制台中添加触发方式,测试通过后本次目标宣布正式达成。

006tNc79ly1g4h8l0ivz3j30kp0lb3ze.jpg

几个小技巧

1. 只给自己发通知

先建群(除去自己额外再拉 2 个人进群,并且必须不是外部联系人)再把其他人踢掉就可以了。只要踢人之前不说话,对其他人来讲是无感知的。

2. 机器人共享

在群里把鼠标指向机器人,可以看到群聊机器人是可以发布到公司的(可能将来会有一个内部的 AppStore ?),还可以添加到其它群聊,这样可玩性还可以继续发掘一下。

测试过程中发现有的时候Windows和macOS的客户端可能不是很稳定?

总结

我这里只演示了最简单的、无第三方依赖的情况,实际使用还可以结合腾讯云的其它产品(例如API网关)来实现更复杂的需求。

通过这么一个简单的功能,可以说解决了一个困扰我多时的难题,关键它还免费!真心要为腾讯云和企业微信点个赞!!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 云函数场景下的DevOps实践--蓝盾

    本文将展示使用云函数+ 蓝盾,开发部署一个"给用户发送提醒短信"的微服务。以这个非常简单的应用,探索一下ServerLess结合DevOps所能产生的合力,畅想...

    腾讯云serverless团队
  • 【腾讯云日志服务CLS】serverless应用中的CLS服务详解

    日志服务(Cloud Log Service)提供一站式的日志数据解决方案。您无需关注扩缩容等资源问题,五分钟快速便捷接入,即可享受从日志采集、日志存储到日志内...

    用户8390435
  • 小试牛刀:基于Golang的腾讯云Serverless使用体验

    | 导语:Serverless符合云计算发展的方向,把用户关注点放在业务功能上,屏蔽底层网络框架、计算资源和机器运维等细节。这里基于Golang试了一把腾讯云S...

    王昂
  • 「EB + iPaaS + X 计划」系列一:告警信息实时推送

    腾讯云事件总线(EventBridge)与腾讯千帆鹊桥 iPaaS 携手,将安全、稳定、高效的无服务器事件管理平台与腾讯千帆鹊桥 iPaaS 的多种连接器集成...

    腾讯云serverless团队
  • Serverless国内发展的纵向观察

    云计算正在各领域持续深化其影响力,同样,各领域下日益变化的需求,也在倒逼云计算不断进行自我优化。 2008 年可以说是大家比较公认的云计算元年,因为在这一年中...

    腾讯云serverless团队
  • 【玩转腾讯云】征文活动获奖名单公布

    由云+社区联合腾讯云免费体验馆及各产品团队举办【玩转腾讯云】征文活动,吸引入驻作者积极参加,非常感谢各位作者的参与。经过评委老师从产品创新性、实用性、可借鉴性、...

    云加社区
  • 云函数 SCF 支持自定义监控 监控指标任你 DIY

    ◆ ◆  ◆ SCF 基础监控指标 在使用云函数时,相信大家都会留意到在控制台展示的函数运行时的监控数据。通过这些监控数据可以了解到云函数相关信息,如: 函数调...

    腾讯云serverless团队
  • 一讲了解Serverless,以腾讯地图、微信小程序为例(文末新年彩蛋)

    10月24日,第二届云原生技术实践峰会(CNBPS 2019)在北京圆满落幕。CNBPS是云原生领域重要峰会,每年一届,以汇聚前瞻洞察和技术干货为目标,展现全年...

    灵雀云
  • 6月份,腾讯云云函数更新了这些功能

    为了更好的改善用户开发,调试和使用云函数的体验,解决客户从开发,部署到运维流程中的痛点问题,6月份,腾讯云云函数产品发布了如下新特性:

    腾讯云serverless团队
  • Serverless 实战:企业微信机器人还能这么玩?

    通过定时触发器,可以非常简单快速地建立一个企业微信机器人。我们可以用它来实现喝水、吃饭提醒等小功能,还能实现定时推送新闻、天气,甚至是监控告警的小功能。 使用企...

    腾讯云serverless团队
  • 腾讯云副总裁刘煜宏:腾讯云原生产品每日调用次数已超百亿

    前言 7月31日,腾讯云副总裁刘煜宏在2020云原生技术大会上表示:“腾讯云原生产品API每日调用量已经超过100亿次,拥有超过100万的开发者,同时服务超过5...

    腾讯大数据
  • 未来已来:从信通院 Serverless 标准,看无服务器发展趋势

    “ 无服务器架构(Serverless)是一种将应用与基础设施彻底分离的架构理念,开发人员无需关心基础设施的运维工作,只需专注于应用逻辑的开发,真正实现了弹性...

    腾讯云中间件团队
  • 未来已来:从信通院 Serverless 标准,看无服务器发展趋势

    “ 无服务器架构(Serverless)是一种将应用与基础设施彻底分离的架构理念,开发人员无需关心基础设施的运维工作,只需专注于应用逻辑的开发,真正实现了弹性...

    腾讯云serverless团队
  • 国内第一!腾讯云Serverless进入全球前三

    很荣幸,在Forrester最新发布的《The Forrester New WaveTM: Function-As-A- Service Platforms,...

    腾讯云serverless团队
  • 首推全云端开发体验,腾讯云构建Serverless应用新标准

    在第三代通用计算平台的探索和布局上,腾讯云已经走在了全球的前列。3月6日,腾讯云正式向外界展示了其在 Serverless 领域的最新进展,包括率先在业界推出...

    腾讯云serverless团队
  • Serverless ETL —— 蘑菇街实战落地

    背景 蘑菇街旨在做一家高科技轻时尚的互联网公司,公司的核心宗旨就是购物与社区的相互结合,为更多消费者提供更有效的购物决策建议。 蘑菇街上每天有几百万网友在这里...

    腾讯云serverless团队
  • IPC 视频物联公开课周四开讲,看云函数如何完成 IPC 视频数据处理挑战

    为了让大家更好的了解腾讯云在物联网领域的技术产品创新以及业务进展,腾讯云在智东西公开课开设「腾讯云智能终端专场」,共计三讲,深度讲解腾讯云智能终端核心技术产品。...

    腾讯云serverless团队
  • 腾讯云入选云原生产业联盟首批理事单位 助力生态发展与产业落地

    2019年4月24日,由中国信息通信研究院主办的首届云原生产业大会(CNIC2019)在北京成功落幕,腾讯云成功入选云原生产业联盟首批理事单位。同时,为推动企业...

    腾讯技术工程官方号
  • Serverless 开发实战之Nodejs

    抗击疫情,腾讯云在行动。Serverless(无服务架构)被誉为下一代云计算技术,自概念推出以来,因为能带来研发交付速度提升与成本的降低在业内异常火爆。将随着 ...

    可可爱爱没有脑袋

扫码关注云+社区

领取腾讯云代金券