专栏首页跬步微信公众号迁移Serverless详解
原创

微信公众号迁移Serverless详解

3月腾讯云函数计算开放测试, 看到的第一反应是这种Serverless太适合做微信公众号的后端来实现自动应答了, 尝试把我服务了3年的一个公众号迁移到腾讯云函数计算, 结果因为API gateway的一个功能缺失搁置了, 这周腾讯云API gateway终于补上了集成响应的能力, 能正常服务我的公众号, 这里记录下实现过程.

改造werobot

https://github.com/zhu327/ifwechat

ifwechat这个公众号是基于werobot实现的, 之前以WSGI的方式部署在SAE上, 而不同于WSGI, 函数计算从API gateway触发的事件是一个Python的字典, 需要从这个事件字典里面获取http request的信息来调用werobot的方法. API gateway的触发事件参考: https://cloud.tencent.com/document/product/583/13197

需要实现一个从http request事件到werobot的message的wrapper handler:

# coding: utf-8

from handlers import robot

robot.config.from_pyfile('configs.py')


def werobot_handler(event):
    timestamp = event["queryString"].get("timestamp", "")
    nonce = event["queryString"].get("nonce", "")
    signature = event["queryString"].get("signature", "")

    if not robot.check_signature(timestamp=timestamp,
                                 nonce=nonce,
                                 signature=signature):
        return "error: wrong wechat signature"
    if event["requestContext"]["httpMethod"] == "GET":
        return event["queryString"].get("echostr", "")
    elif event["requestContext"]["httpMethod"] == "POST":
        body = event["body"].decode("unicode-escape")
        message = robot.parse_message(
            body,
            timestamp=timestamp,
            nonce=nonce,
            msg_signature=event["queryString"].get("msg_signature", ""))
        return robot.get_encrypted_reply(message)

在API gateway上创建API时需要勾选集成响应功能, 并且在函数入口返回的格式如下:

# coding: utf-8

from scf_werobot import werobot_handler


def main_handler(event, context):
    if "requestContext" not in event.keys():
        return "error: event is not come from api gateway"

    content = werobot_handler(event)

    return {
        "statusCode": 200,
        "headers": {"Content-Type": "application/xml"},
        "body": content
    }

通过cos实现werobot的session

除了计算外, ifwechat还用到了werobot的session来存微信用户与ifttt用户之间的对应关系, 在SAE上部署session数据是存在SAE的kvdb里的, 但是在腾讯云这里就没有免费的Redis或者MySQL来用了. 在研究zappa这个serverless框架的时候, 发现他们用AWS S3实现了一个NoDB的库可用用来做kvdb, 而腾讯云对标S3存储的就是cos, 把NoDB fork修改S3代码改成cos sdk调用, 就有了这个NoDB for Tencent Cloud COS

继承werobot的SessionStorage实现用NoDB来做session backend:

# coding: utf-8

from werobot.session import SessionStorage
from nodb import NoDB


class NoDBStorage(SessionStorage):
    def __init__(self, secret_id, secret_key, region, bucket):
        self.nodb = NoDB(secret_id, secret_key, region)
        self.nodb.bucket = bucket

    def get(self, id):
        return self.nodb.load(id) or {}

    def set(self, id, value):
        self.nodb.save(value, id)

    def delete(self, id):
        self.nodb.delete(id)

    def __getitem__(self, id):
        return self.get(id)

    def __setitem__(self, id, session):
        self.set(id, session)

    def __delitem__(self, id):
        self.delete(id)

打包所有代码为zip文件, 并发布到scf就完成了这个迁移过程.

关于zappa

从迁移过程的体验来看, 功能的开发还是很简单的, 只是部署的过程不是很友好, 如果能有一个类似于zappa这样的自动化部署框架来对接到腾讯云函数计算, 相信对开发者来说会更友好.

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python 调用父类方法super()

    class A: def spam(self): print('A.spam')

    用户5760343
  • 订单自动过期实现方案

    这个太简单了,就是在查询的时候判断是否失效,如果失效了就给他设置失效状态。但是弊端也很明显,每次查询都要对未失效的订单做判断,如果用户不查询,订单就不失效,那么...

    Mshu
  • 2019学习计划——fighting

    好久都没有更新过博客了,18年7月中旬去杭州实习了,到现在19年1月差不多有个半年了吧,因为期间项目太忙一直没有时间将项目中遇到的问题更新到博客中来,...

    冰枫
  • 印度进口战斗机想退货,因系统无法识别自家口音

    内容概览:当语音识别遇上方言,会是一个很棘手的问题。而如果对垒双方,变成了战斗机的语言控制,和带有印度方言的英语发音,这个问题又会怎么样?近日,现实中就上演了这...

    HyperAI超神经
  • 微信小程序tabbar设置样式在哪里改

    ytkah
  • 日志那些事儿——slf4j集成logback/log4j

    在日志Logger漫谈中提到了slf4j仅仅是作为日志门面,给用户提供统一的API使用,而真正的日志系统的实现是由logback或者log4j这样的日志系统实现...

    LNAmp
  • XLM,基于BERT的跨语言模型

    这个模型在跨语言分类任务(15个语言的句子蕴含任务)上比其他模型取得了更好的效果,并且显著提升了有预训练的机器翻译效果。

    AI科技评论
  • 开源CEGUI编辑器之一(MFC重写的LayoutEditor)

    转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)

    帘卷西风
  • ECAI2020推荐系统论文聚焦

    ECAI,全称为 European Conference on Artificial Intelligence,是欧洲主要的人工智能会议。

    张小磊
  • HTML head 头标签 总结

    HTML head 头部分的标签、元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,这就造成了很多...

    前朝楚水

扫码关注云+社区

领取腾讯云代金券