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

栏目: Ruby · 发布时间: 5年前

内容简介:本文将构建一个 SMS 应用。为了让其更加有趣,本文将加入一些幽默元素。当用户在应用中打字时,它将会回复您一个由当 AWS 在 2014 年发布

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

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

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

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

通过 Jets 框架在 AWS Lambda 上实现无服务化 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。在命令行中键入:

复制代码

geminstalljets

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

复制代码

jetsnewdad-jokes-sms --modeapi --no-database

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

复制代码

jets serve

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

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

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

第一个 Jets 控制器

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

复制代码

jetsgeneratecontroller Messages create

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

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

复制代码

Jets.application.routes.drawdo
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'
classMessagesController< ApplicationController
defcreate
end
private
defrandom_joke
open('https://icanhazdadjoke.com/', {'Accept'=>'text/plain'}).read
end
end

现在,可以将笑话以 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'
classMessagesController< ApplicationController
defcreate
twiml = Twilio::TwiML::MessagingResponse.new
twiml.messagebody:random_joke
renderxml:twiml.to_xml
end
private
defrandom_joke
open('https://icanhazdadjoke.com/', {'Accept'=>'text/plain'}).read
end
end

要知道 更多关于如何使用 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 部分

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

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

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

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

复制代码

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

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

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

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

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

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

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

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

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

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

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

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

在 Lambda 上进行部署

在命令行中输入:

复制代码

AWS_ACCESS_KEY_ID=YOUR_USER_KEYAWS_SECRET_ACCESS_KEY=YOUR_USER_SECRET_KEY jets deploy

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

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

你会注意到应用被部署到一个“开发”环境中。要知道更多 关于 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 框架在 AWS Lambda 上实现无服务化 Ruby

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

无服务化有趣的事情

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

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

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

轻快的Java

轻快的Java

(美)塔特、杰兰德/国别:中国大陆 / 张晓坤 / 中国电力出版社 / 2006-7 / 29.00元

Java的开发者正深陷于复杂性的泥沼中而无法自拔。我们的经验和能力正接近极限,程序员为了编写支持所选框架的程序所花的时间比解决真正问题的时间要多得多。我们不禁要问,有必要把Java搞得这么复杂吗?   答案是否定的。本书给你指引了一条出路。无论是维护应用程序,还是从头开始设计,你都能够超越成规,并大幅精简基本框架、开发过程和最终代码。你能重新掌握一度失控的J2EE应用程序。   在本书......一起来看看 《轻快的Java》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具