Serverless 应用开发指南:基于 Serverless 与 Lambda 的微信公共平台

Serverless 在事件驱动方面具有天然的优势,其中之一就是聊天机器人。可要做聊天机器人不是一件容易的事,微信和 QQ 都只能用 Hack 的方式进行。

于是,便想到微信公众号是不是一个更好的选择。当用户输入一个关键词时,做出相应的回复。总体上来说,他们之间是差不多的。这个时候,就可以开始尝试一个在线上运行的 Serverless 服务。

在这件事上,有这么几个步骤:

  • 创建 Serverless 服务
  • 引入 node-wechat
  • 配置 APP_ID 和 TOKEN 等
  • 配置 Route 53 与 API Gateway
  • 添加微信公众平号服务
  • 部署

创建 Serverless 服务

首先,让我们创建我们的服务:

serverless create --template aws-nodejs --path serverless-wechat

这个步骤依旧是这么的简单。

引入 node-wechat

然后我找到了 node-wechat 库,它使用 express 来做路由,示例如下:

const express = require('express');const app = express();var wechat = require('wechat');var config = {  token: 'token',  appid: 'appid',  encodingAESKey: 'encodinAESKey',  checkSignature: true // 可选,默认为true。由于微信公众平台接口调试工具在明文模式下不发送签名,所以如要使用该测试工具,请将其设置为false};app.use(express.query());app.use('/wechat', wechat(config, function (req, res, next) {  // 微信输入信息都在req.weixin上  var message = req.weixin;  if (message.FromUserName === 'diaosi') {    // 回复屌丝(普通回复)    res.reply('hehe');  }}));

上面便是我们的 index.js 文件。

然后就是使用类似于《Serverless 应用开发指南:Serverless + Express 的 React 服务端渲染》中的方法,使用 aws-serverless-express 来做出一层代理:

const awsServerlessExpress = require('aws-serverless-express');const app = require('./index');const server = awsServerlessExpress.createServer(app);exports.runserver = (event, context) => {   console.log("EVENT: " + JSON.stringify(event));   awsServerlessExpress.proxy(server, event, context)}

接下来就是进行相关的配置。

配置 APP_ID 和 TOKEN 等

首先,修改我们的 index.js 文件中的配置相关代码:

let config = {  token: process.env.TOKEN,  appid: process.env.APP_ID,  encodingAESKey: process.env.AESKey,  checkSignature: true};

token、id、encodingAESKey 将从 serverless.yml 文件中读取。我们的 serverless.yml 文件将从另外的文件中读取:

functions:  runserver:    handler: handler.runserver    events:      - http: ANY /      - http: 'ANY {proxy+}'    environment:      TOKEN: ${file(./config.yml):TOKEN}      APP_ID: ${file(./config.yml):APP_ID}      AESKey: ${file(./config.yml):AESKey}

即从 config.yml 中读取:

TOKEN: TOKENAPP_ID: APP_IDAESKey: AESKey

这是为了确保我们可以保护密钥的安全。

一切准备就绪,执行:

serverless deploy

就会生成对应的 API:

stack: serverless-wechat-devapi keys:  Noneendpoints:  ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev  ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev/{proxy+}functions:  runserver: serverless-wechat-dev-runserver

于是,我将这个地址填到了公众号后台,发现公号不支持 API Gateway。只能想办法使用自定义的域名,随后就需要使用 Route 53 来创建了。

配置 Route 53 与 API Gateway

如之前在《Serverless 应用开发指南: API Gateway 与 Route53 自定义域名》中所说,按下面的步骤就可以配置 Route 53 了。

在 Route 53 上注册有域名,如果没有的话,需要转到 Route 53。

然后,才能为你的域名请求一个证书

需要选择的区域是 us-east-1,这个 region 才能与 API Gateway 一起工作。

在这个过程中,需要验证域名的所有权。所以,你需要先找个地方注册域名邮箱,如我使用的是网易的域名邮箱。

$ yarn add --dev serverless-domain-manager

或者

$ npm install serverless-domain-manager --save-dev
plugins:  - serverless-domain-managercustom:  customDomain:    domainName: wechat.wdsm.io    basePath: ''    stage: ${self:provider.stage}    createRoute53Record: true
serverless create_domain

日志:

Serverless: Domain was created, may take up to 40 mins to be initialized.

AWS CLI 查看:

{    "items": [        {            "certificateArn": "arn:aws:acm:us-east-1:706605665335:certificate/278c252a-7aaf-41df-bcf1-adc279347557",            "distributionDomainName": "d1pp7oijqquj95.cloudfront.net",            "certificateUploadDate": 1509592737,            "domainName": "wechat.wdsm.io"        }    ]}

现在,再执行 serverless deploy 就可以完成整个步骤了。

添加微信公众平号服务

然后,我们可以创建几个简单的服务,比如从 Google 搜索内容:

google(keyword, function (err, res) {  let result = R.map(R.compose(updateItemField, R.values, R.pick(['title', 'link'])))(res.links);  response.reply('你想要在 Google 上搜索的内容有: ' + result);});

又或者是,搜索我博客的相关内容:

request.get('https://www.phodal.com/api/app/blog_detail/?search=' + keyword, {  headers: {    'User-Agent': 'google'  }}, function (error, res, body) {  if (res.statusCode === 200) {    let parsed = JSON.parse(body);    const data = parsed;    var result = R.map(R.compose(updatePhodalItemField, R.values, R.pick(['title', 'slug'])))(data);    response.reply({      content: '在『 phodal.com 』上有 x 个结果,前 10 个如下:' + result,      type: 'text'    });  }});

最后代码见:https://github.com/phodal/mp/blob/master/index.js

部署

最后,让我们愉快地执行 serverless deploy,对应的日志如下:

stack: serverless-wechat-devapi keys:  Noneendpoints:  ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev  ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev/{proxy+}functions:  runserver: serverless-wechat-dev-runserverServerless Domain Manager SummaryDomain Name  wechat.wdsm.ioDistribution Domain Name  d1pp7oijqquj95.cloudfront.net

结果你想用这个服务,那么只需要:

serverless install -u https://github.com/phodal/mp -mp

执行:

yarn install

再创建你的 config.yml 文件:

cp config.yml.template config.yml

最后,就可以愉快地部署了。

如果你是为测试,你可以执行 serverless remove 来删除服务。

原文发布于微信公众号 - phodal(phodal-weixin)

原文发表时间:2017-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏*坤的Blog

IntelliJ Idea 免费激活方法

1K2
来自专栏Android 开发者

[译] 如何用 Android vitals 解决应用程序的质量问题

对于一个应用开发者来说,没有比开心的用户更好的衡量成功的标准,而且最好是有很多这样的用户。实现这一目标的最佳方式是拥有一个人人都想用的优秀应用,不过我们所说的“...

1321
来自专栏芋道源码1024

Dubbo源码解析 —— 服务暴露原理

前言 之前讲完了dubbo集群容错系列,现在开始讲比较重要的环节,也就是dubbo面试中比较喜欢问的两个点: 服务发布和 服务引用. 插播面试题 服务发布过程...

3655
来自专栏ThoughtWorks

拯救Java Code Style强迫症|洞见

这篇文章缘起于上一个持续交付的咨询项目,当时正在指导客户团队的Java工程师做Code Review,发现一个很有意思的现象: 有一位工程师对Code Styl...

3007
来自专栏jiajia_deng

查看视音频格式工具 MediaInfo

1474
来自专栏即时通讯技术

现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障

众所周之,通常我们开发一个移动端应用,会直接调用系统提供的网络请求接口去服务端请求数据,再针对返回的数据进行一些处理,或者使用iOS中的开源AFNetworki...

3152
来自专栏CSDN技术头条

使用HAProxy、PHP、Redis和MySQL支撑10亿请求每周架构细节

【编者按】在公司的发展中,保证服务器的可扩展性对于扩大企业的市场需要具有重要作用,因此,这对架构师提出了一定的要求。Octivi联合创始人兼软件架构师Anton...

4516
来自专栏Android自学

Google发布Android Studio 1.0

1193
来自专栏张善友的专栏

MongoDB新版本特性

MongoDB 2.4已经发布,该版本增加了一些新特性,如文本搜索、基于哈希的分片、更好的地理空间功能、支持GeoJSON以及一些性能和工具方面的提升。我们还和...

2175
来自专栏Python研发

linux入门总结

linux的核心概念知识:      linux软件是开源免费的,而linux是由Unix演变而成,Unix是由MINIX演变而成。 2000年以后,linu...

1502

扫码关注云+社区

领取腾讯云代金券