发布于 2026-01-06 2 阅读
0

使用 Jets 框架在 AWS Lambda 上构建无服务器 Ruby

使用 Jets 框架在 AWS Lambda 上构建无服务器 Ruby

2014 年AWS 推出Lambda时, Ruby 语言并未受到重视。Python、Node.js 和 Java 等平台开启了云端函数托管和运行的无服务器革命。直到 2018 年底,AWS 才最终支持 Ruby 语言。

你可以使用 Ruby on Lambda 的原始函数和无服务器应用程序模型 (SAM) 模板进行构建,正如Ruby on Lambda 入门指南中所述。但是,Ruby 的核心在于提升开发者的体验,而当配置文件比程序本身还长时,整个过程就会变得非常痛苦。这时,Jets 框架就派上了用场,它“充分利用 Ruby 的强大功能,让每个人都能轻松愉快地使用无服务器框架”。

喷气机队标志

从铁路到喷气式飞机

Jets 结合了构建Rails 应用的体验和部署到 AWS Lambda 及相关服务(包括API GatewayS3DynamoDB)的能力。在本文中,我们将了解如何开始使用 Jets 并部署一个用 Ruby 编写的、基于 Lambda 的 Twilio 应用。

我们正在构建什么

为了简单起见,我们将开发一款基于短信的应用,为了增加一些趣味性,我们还会加入一些幽默元素。当你向应用发送短信时,它会回复一个冷笑话。抱歉,刚才拼写错了,我指的是爸爸笑话,感谢icanhazdadjoke API。

本应用将向我们展示如何开始使用 Jets,创建控制器、操作和路由。我们将构建一个端点,用于响应来自 Twilio 的 HTTP 请求,以便在某个号码收到短信时进行响应。该端点每次都会返回一个包含随机冷笑话的TwiML 代码,保证让你捧腹大笑。

你需要准备什么

要完成这个项目,你需要:

都明白了吗?那就开始吧。

入门

我们首先需要jets全局安装 gem 包。在命令行中输入:

gem install jets
Enter fullscreen mode Exit fullscreen mode

Jets 可执行文件可以像 Rails 一样用作生成器来初始化一个新项目,然后在项目内运行命令。我们现在就创建一个新项目,但考虑到本文的篇幅,我们会对其进行一些限制。首先,我们将以 API 模式创建项目,因为此应用程序不需要 HTML 视图。这样还可以避免使用webpacker进行资源编译,从而节省构建时间。我们也不需要数据库。运行以下命令创建新项目:

jets new dad-jokes-sms --mode api --no-database
Enter fullscreen mode Exit fullscreen mode

生成器运行完毕后,切换到该dad-jokes-sms目录,然后使用以下命令在本地运行您的应用程序:

jets serve
Enter fullscreen mode Exit fullscreen mode

打开http://localhost:8888,你会看到一个类似这样的页面:

Jets 欢迎页面将在浏览器中打开。

如果您看到此页面,则说明您的新 Jets 项目运行成功。

我们的第一个喷气式飞机控制器

现在我们有了一个 Jets 应用,可以使用 gem 来生成应用的各个部分,从模型和控制器到完整的脚手架。我们的应用需要一个包含一个 action 的控制器。使用以下命令生成它:

jets generate controller Messages create
Enter fullscreen mode Exit fullscreen mode

生成器会为我们创建和编辑一些文件。我们需要检查新的路由,所以打开config/routes.rb……

Jets 生成了一条GET路由,但 Twilio WebhookPOST默认会发起请求,我希望保持这种方式。请将应用程序配置为POST在端点接收请求 Webhook,/messages如下所示:

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

  # The jets/public#show controller can serve static utf8 content out of the public folder.
  # Note, as part of the deploy process Jets uploads files in the public folder to s3
  # and serves them out of s3 directly. S3 is well suited to serve static assets.
  # More info here: http://rubyonjets.com/docs/assets-serving/
  any "*catchall", to: "jets/public#show"
end
Enter fullscreen mode Exit fullscreen mode

现在,我们来编写控制器操作。打开app/controllers/messages_controller.rb后,你会看到一个操作方法create。这个操作会接收我们的 Twilio webhook,并使用 TwiML 发送一个冷笑话作为响应。

找个爸爸笑话

要发送一个“爸爸笑话”,我们需要调用icanhazdadjoke API。让我们编写一个简单的私有方法来实现这个功能。

我们将使用它,open-uri因为它便于发起简单的 Web 请求(包括下载文件和图像)。如果我们要求,API 会以纯文本形式返回结果,这样就省去了我们进行任何解析的工作。请将以下内容添加到MessagesController

require 'open-uri'

class MessagesController < ApplicationController
  def create
  end

  private

  def random_joke
    open('https://icanhazdadjoke.com/', { 'Accept' => 'text/plain' }).read
  end
end
Enter fullscreen mode Exit fullscreen mode

现在我们准备把这个玩笑还给 Twilio,改名为 TwiML。

返回 TwiML

我们将使用 twilio-ruby 辅助库中的辅助函数来构建响应。打开Gemfile并添加twilio-ruby

source "https://rubygems.org"

gem "jets"
gem "twilio-ruby"
Enter fullscreen mode Exit fullscreen mode

在命令行中运行bundle install命令安装 gem。现在,在操作中实例化一个新的 TwiML 响应对象,使用TwiML 元素create回复传入的消息,并渲染 XML 响应,如下所示:<Message>

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
  end
end
Enter fullscreen mode Exit fullscreen mode

您可以在文档中阅读更多关于如何使用twilio-ruby辅助库生成 TwiML 的信息。

我们可以本地运行此程序来测试是否得到了预期的响应。如果您停止了应用程序,请使用以下命令重新启动它jets servePOST使用以下命令向 localhost:8888/messages 发送请求,您将在 TwiML 响应中看到由icanhazdadjokecurl提供的笑话

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>
Enter fullscreen mode Exit fullscreen mode

太好了,我们的 Jets 应用运行正常!现在要把它部署到 AWS Lambda 上。

准备好部署了吗?IAM!

要将 Jets 应用程序部署到 AWS,我们首先需要设置项目凭证,使其能够访问 AWS 服务。最佳实践是创建一个拥有完成所有必要操作所需最低权限的用户。Jets文档中描述了用户所需的最低权限。在 AWS 账户中,我们将创建一个包含这些权限的策略,并创建一个新用户,将该策略分配给该用户。然后,我们可以使用该用户的凭证来部署应用程序。

在AWS 控制台找到IAM服务(或直接前往IAM部分)。

从 AWS 控制面板中选择 IAM。

前往“策略”部分并创建新策略。

进入“策略”页面,创建新策略。

选择 JSON 选项卡,然后从 Jets 文档中输入以下 JSON 代码

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

点击查看政策并为其命名。

在审核页面上给保单命名,然后保存。

保存策略。现在我们需要创建一个新用户并将该策略附加到该用户,并授予其创建 Jets 部署所需资源的权限。打开IAM控制台中的“用户”部分并创建一个新用户。

导航至“用户”并创建一个新用户。

给用户命名,并将访问类型选择为“程序化访问”

为用户命名,并选中“程序化访问”复选框

单击“下一步”选择新用户的权限。选择“直接附加现有策略”,然后筛选出您刚刚创建的策略名称。选择该策略,然后单击“下一步”

筛选出您刚刚创建的保单并选择它。

点击“下一步”,直到出现成功页面。

成功,您已创建新用户。

请保存上一屏幕中的访问密钥 ID秘密访问密钥。部署时需要用到它们。现在我们准备部署了。

部署到 Lambda

在命令行中输入:

AWS_ACCESS_KEY_ID=YOUR_USER_KEY AWS_SECRET_ACCESS_KEY=YOUR_USER_SECRET_KEY jets deploy
Enter fullscreen mode Exit fullscreen mode

Jets 会将凭证用作环境变量,在您的 AWS 账户中配置运行应用程序所需的所有资源。这需要一些时间,完成后您将获得一个应用程序运行的 URL。

输出结果的最后一行将包含您的应用程序 URL。

你会注意到它部署到了“开发”环境中。你可以在文档中阅读更多关于Jets 如何处理环境的信息。

现在我们可以使用此 URL 进行测试curl。请记住,我们使用路由/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>
Enter fullscreen mode Exit fullscreen mode

为了随时都能讲讲爸爸的笑话,我们把它连接到一个 Twilio 号码上吧。

通过短信发送爸爸笑话

登录Twilio 控制台,查看您的有效电话号码。如果您已有想要使用的号码,请编辑它;否则,请购买一个可以接收短信的新号码。在“消息到达”字段中输入您的应用程序 URL。

请在相应字段中输入邮件接收地址。

保存你的号码并发送短信。你应该会收到一个冷笑话回复。现在,为了庆祝一下,去跟附近的人讲讲这个笑话,然后告诉我他们是笑了还是翻白眼。

无服务器喜剧

本文介绍了如何使用 Jets 编写可部署到 AWS Lambda 的 Ruby 应用程序。您可以在 GitHub 上查看完整的项目

Jets 的功能远不止这些,它还能帮助你完成更多任务,包括响应事件将数据存储到数据库,甚至运行你现有的 Rails 应用程序。请查看Jets 文档中的这些文章,了解更多关于 Jets 的功能

你是否对在无服务器环境下运行 Ruby 感到兴奋?你对 Jets 有什么看法?请在评论区留言或在 Twitter 上私信我@philnash。也欢迎分享你最喜欢的冷笑话!

文章来源:https://dev.to/twilio/serverless-ruby-on-aws-lambda-with-the-jets-framework-2g24