写点什么

通过 Jets 框架在 AWS Lambda 上实现无服务化 Ruby

2019 年 6 月 05 日

通过Jets框架在AWS Lambda上实现无服务化Ruby

本文将构建一个 SMS 应用。为了让其更加有趣,本文将加入一些幽默元素。当用户在应用中打字时,它将会回复您一个由icanhazdadjoke API 免费提供的笑话。该应用会展示如何上手 Jets,以及创建控制器、动作和线路。我们将构建一个单端点,当某个号码接收到 SMS 信息时,这个端点会对来自 Twilio 的 HTTP 请求做出反应。端点每次都会返回TwiML,以及一个随机的、令人爆笑的笑话。



当 AWS 在 2014 年发布Lambda时,没有支持 Ruby,而 Python、Node.js 和 Java 等平台开始了针对云托管和云运行功能的无服务化革命。在 2018 年底,对 Ruby 的支持终于发布。


开发者可以使用原始功能和无服务应用模型(SAM)模板,通过 Ruby on Lambda 构建任何东西,正如《Ruby on Lambda的开始指南》中描述的那样。但是,Ruby 的主要目的在于让开发者更快乐,而不是更痛苦。因为,当配置文件比程序还长时,整个流程可以说会让人非常痛苦。Jets 框架是一个利用 Ruby 来让无服务化更加快乐的框架。



从 Rails 过渡到 Jets

Jets 将构建Rails 应用体验和部署 AWS Lambda,并和相关服务能力加以结合。相关服务包括:API Gateway, S3 和 DynamoDB。在本帖中,我们将看看如何使用 Jets 并部署一个基于 Lambda、用 Ruby 编写的的 Twilio 应用。


我们构建的是什么

为了简便,我们将要构建一个 SMS 应用。而且,为了让其更加有趣,我们还将加入一些幽默元素。当你在该应用中打字时,它将会回复一个笑话,由icanhazdadjoke API 免费提供。


这个应用会向我们展示如何上手 Jets,以及如何创建控制器、动作和线路。我们将构建一个单端点,当某个号码接收到 SMS 信息时,这个端点会对来自 Twilio 的 HTTP 请求做出反应。每次,这个端点会返回TwiML,以及一个随机的、令人爆笑的笑话。


需要什么

为了完成这个项目,开发者需要准备:



开始

首先,全局安装 jets gem。在命令行中键入:


gem install jets
复制代码


然后,Jets 可执行文件就可以被当做生成器使用,如同 Rails,用来发起一个新项目,并运行该项目中的命令。我们现在会创建一个新项目,但是鉴于本帖子的范围有限,我们会对该项目适当进行限制。首先,我们将在 API 模式下创建项目,因为在这个应用中,我们不需要 HTML 视图。而且,我们也无需通过webpacker来进行资产编译,所以,这会节省我们的构建时间。我们也不需要数据库。运行以下命令,创建一个新的项目:


jets new dad-jokes-sms --mode api --no-database
复制代码


在生成器完成运行后,切换到 dad-jokes-sms 目录下,运行以下命令,以本地运行你的应用:


jets serve
复制代码


打开http://localhost:8888,你会看到以下的页面:



如果看到了这个页面,说明新 Jets 项目运行成功。


第一个 Jets 控制器

现在已经有了 Jets 应用,因此可以使用 gem 来生成应用部件,从模型和控制器到完整架构。对于应用来说,需要只有一个动作的控制器。怎么生成它呢?运行以下命令:


jets generate controller Messages create
复制代码


生成器将创建和编辑一些文件。开发者需要检查新的路径,因此请打开 config/routes.rb。


Jets 生成了一个 GET 线路,但是 Twilio webhook 会默认生成 POST 请求,而我宁可让它保持现在这样。设置应用,使之在/messages 端点上接收 POST 请求 webhook,像这样:


Jets.application.routes.draw do post 'messages', to: 'messages#create' root "jets/public#show"
复制代码


jets/public#show 控制器可以提供来自公共文件夹的静态 utf8 内容。注意,作为部署流程的一部分,Jets 会将公共文件夹下的文件上传到 s3 中,并且从 s3 中直接提供这些文件。S3 非常适合提供静态资产。此处有更多信息: http://rubyonjets.com/docs/assets-serving/


 any "*catchall", to: "jets/public#show"end
复制代码


现在,让我们编写控制器的动作。打开 app/controllers/messages_controller.rb,你会看到“创建”动作的方法。这一动作会接收 Twilio webhook,并用 TwiML 进行回复,且返回一个笑话。


获取笑话

为了返回笑话,我们需要对icanhazdadjoke API进行调用。让我们快速写一个能够实现这一目标的私有方法。


我们将使用 open-uri,因为它在发送简单的 web 请求方面(包括下载文具和图片)十分有用。Jets 生成了一个 GET 路径,但是 Twilio webhook 会默认生成 POST 请求,而我宁可让它保持这样。在 MessagesController 中加入以下内容:


require 'open-uri'class MessagesController < ApplicationController def create end private def random_joke open('https://icanhazdadjoke.com/', { 'Accept' => 'text/plain' }).read endend
复制代码


现在,可以将笑话以 TwiML 的形式返回给 Twilio。


返回 TwiML

我们将构建一个回复,方法是使用来自 twilio-ruby 助手库中的助手程序。打开 Gemfile,添加 twilio-ruby:


source "https://rubygems.org"gem "jets"gem "twilio-ruby"
复制代码


在命令行中运行 bundle install,以安装 gem。在 create 动作中,实例化一个新的 TwiML 回复对象,使用TwiML element来回复进来的消息,并提供 XML 回复,方法如下:


require 'open-uri'class MessagesController < ApplicationController def create twiml = Twilio::TwiML::MessagingResponse.new twiml.message body: random_joke render xml: twiml.to_xml end private def random_joke open('https://icanhazdadjoke.com/', { 'Accept' => 'text/plain' }).read endend
复制代码


要知道更多关于如何使用twilio-ruby助手库来生成TwiML的信息,请阅读文档。


我们可以在本地运行以测试是否可得到预期回复。如果应用停止,请运行 jets serve 重启。使用 curl 向 localhost:8888/messages 发送 POST 请求,你便会在 TwiML 回复中看到由icanhazdadjoke提供的笑话。


curl --data "" http://localhost:8888/messages<?xml version="1.0" encoding="UTF-8"?><Response><Message>What’s the advantage of living in Switzerland? Well, the flag is a big plus.</Message></Response>
复制代码


非常好,Jets 开始工作了!现在我们要把它部署到 AWS Lambda 中。


要将 Jets 应用部署到 AWS,首先需要设置好项目和证书,以便让它可以访问 AWS 服务。一个比较好的做法是创建拥有其工作所需最少权限的用户,Jets文档描述了用户需要的最少权限。在 AWS 账户中创建一个策略,该策略包含所有这些权限。此外,还要创建一个新用户,该策略将被分配给这个用户。然后,就可以使用该用户的证书来部署应用。


AWS 控制面板中,找到 IAM 服务,或者直接跳到 IAM部分



跳转到 Policies 部分,并创建一个新的策略。



选择 JSON 选项卡,输入来自Jets文档的以下 JSON:


{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "apigateway:*", "cloudformation:*", "dynamodb:*", "events:*", "iam:*", "lambda:*", "logs:*", "route53:*", "s3:*" ], "Resource": [ "*" ] } ]}
复制代码


继续点击,检查该策略,并命名。



保存策略。现在,需要创建一个新用户,并且将策略添加给该用户,并给予该用户创建 Jets 需要部署的资源的权限。打开 IAM 控制面板中的 Users 部分,创建一个新用户。



给该用户命个名,再在 Access Type 中选择 Programmatic Access。



点击 Next,并选择给予该新用户的权限。选择 Attach existing policies directly,并筛选刚刚创建的策略。选择该策略,并点击 Next。



点击 Next,直到成功页面出现为止。



保存最终页面上显示的 Access key ID 和 Secret access key。在部署的时候,我们要用到它们。现在,我们已经做好部署准备。


在 Lambda 上进行部署

在命令行中输入:


AWS_ACCESS_KEY_ID=YOUR_USER_KEY AWS_SECRET_ACCESS_KEY=YOUR_USER_SECRET_KEY jets deploy
复制代码


Jets 将把证书作为环境变量来设置 AWS 账户中的所有资源,以方便应用运行。这会花费一些时间,但是完成后,你会得到一个 URL,而且应用会在上面运行。



你会注意到应用被部署到一个“开发”环境中。要知道更多关于Jets如何处理环境的信息,请阅读文档。


现在可以用 curl 来测试这个 URL。记住,我们使用了/messages 这条线路,所以务必在 API 网关端点末端加上它,并且发出一个 POST 请求。


$ curl --data "" https://YOUR_API_GATEWAY_ENDPOINT/messages<?xml version="1.0" encoding="UTF-8"?><Response><Message>I knew a guy who collected candy canes, they were all in mint condition</Message></Response>
复制代码


现在,我们便可以随时收到笑话了,让我们把它与 Twilio 号码连接起来。


通过 SMS 发送笑话

访问Twilio 控制面板,转到有效电话号码。如果你已经有一个号码,请编辑它,否则,请购买一个可以接收 SMS 信息的新号码。在 A message comes in 字段中,输入你的应用 URL。



保存号码,并向其发送一条信息,应该会在回复中得到一个笑话。


无服务化有趣的事情

在本帖中,我们见证了如何使用 Jets 来编写 Ruby 应用,并将它部署到 AWS Lambda 中。你可以在 GitHub 上看到完整的项目


Jets 能帮助完成的东西远不止这些,譬如:对事件作出反应将数据储存到数据库中,甚至是运行你现有的Rails应用等等。阅读 Jets 文档中的这些文章,了解更多 Jets 的功能。


查看英文原文:Serverless Ruby on AWS Lambda with the Jets framework


2019 年 6 月 05 日 09:1719992
用户头像

发布了 34 篇内容, 共 16.3 次阅读, 收获喜欢 45 次。

关注

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

腾讯T2手把手教你!字节跳动历年校招Android面试真题解析,含BATJM大厂

欢喜学安卓

android 程序员 面试 移动开发

Serverless 在 SaaS 领域的最佳实践

阿里巴巴中间件

阿里巴巴 中间件

时空大数据与智能技术的时代共舞,百度地图给2020的答案

脑极体

互联网大厂有哪些分库分表的思路和技巧?

冰河

分布式数据库 分库分表 分布式存储 数据一致性 数据同步

散布消极言论被开除的总监 | 法庭上的CTO(25)

赵新龙

CTO 法庭上的CTO

十大经典排序算法最强总结(含Java、Python码实现)

云流

Java 面试 算法

网络模拟器:Cisco Packet Tracer 设备登陆实验

阿里P8大牛亲自讲解!Android高级工程师面试实战,Android岗

欢喜学安卓

android 程序员 面试 移动开发

开设赌场的CTO | 法庭上的CTO(23)

赵新龙

CTO 法庭上的CTO

五步带你探究爬虫爬取视频弹幕背后的真相,附爬虫实现源码

小Q

学习 编程 架构 面试 python 爬虫

云原生架构-静态代码扫描SonarQube超时

云原生实验室

DevOps jenkins 云原生架构 SonarQube Pipeli

盘点2020 | 2021,Begin Again !

大导演

前端进阶训练营 盘点2020

犯”集资诈骗罪“、二审判6年的CTO | 法庭上的CTO(21)

赵新龙

CTO 法庭上的CTO

58同城风控平台演进

DataFunTalk

架构 中台

“让专业的人做专业的事”,畅捷通与阿里云的云原生故事

阿里巴巴中间件

云计算 云原生

史上最全面‘java监听器’解读,读完就能用进项目

Java架构师迁哥

侵犯著作权、判刑两年半的 CTO |法庭上的CTO(22)

赵新龙

CTO 法庭上的CTO

被砍伤的技术VP | 法庭上的CTO(24)

赵新龙

CTO 法庭上的CTO

甲方日常 77

句子

工作 随笔杂谈 日常

全面 Severless 化只需要 7天!看南瓜电影的云上升级

阿里巴巴中间件

阿里巴巴 中间件

小说内容理解

DataFunTalk

AI 推荐系统

Head First设计模式

田维常

天下武功,唯”拆“不破之架构篇二 | 技术人应知的创新思维模型 (9)

Alan

架构 技术 技术人应知的创新思维模型 七日更 28天写作

我对2021的期待,从合上这份2020日历开始

脑极体

百分点智能对话技术探索实践

DataFunTalk

AI

阿里P8大牛亲自讲解!6年菜鸟开发面试字节跳动安卓研发岗,成功收获美团,小米安卓offer

欢喜学安卓

android 程序员 面试 移动开发

美团面试:为什么就能直接调用userMapper接口的方法?

田维常

美团

工具词典:中立观点

lidaobing

维基百科 28天写作

生产环境全链路压测建设历程 23:FAQ 3、4 适配改造,目标压力

数列科技杨德华

全链路压测 七日更

2020盘点之手机失窃事件复盘分析

石君

信息安全 资金安全 手机失窃

C语言编程:入门指南(一周内学懂)

计算机与AI

c

通过Jets框架在AWS Lambda上实现无服务化Ruby-InfoQ