如何将模块化 Sinatra 应用程序迁移到 AWS Lambda

问题描述

我有一个模块化的 Sinatra 应用程序,它在机架下运行良好,它的 config.ru 具有三个“使用”语句和一个运行语句。我想弄清楚如何将应用程序移植到 AWS lambda,其中 API_gateway 将提供 Web 服务器服务并调用我的应用程序。

我使用 https://github.com/aws-samples/serverless-sinatra-sample/blob/master/lambda.rb 中推荐的 lambda.rb 脚本作为我的入口点。我不明白的是,在 AWS Lambda 微环境中,我如何在没有机架和 config.ru 的情况下组装应用程序的模块/层?

尽管我已经阅读了每篇博客文章、我所知道的一些 Sinatra 和 Rack 文档以及伟大的“Sinatra 启动和运行”一书,但我认为我的菜鸟大脑只是缺少一些非常基本的东西。我错过了什么?

解决方法

再次重读《Sinatra: Up and Running》这本书时,似乎有一个相当优雅的解决方案。如果我将 lambda.handler 入口点设置为指向一个简单的 Sinatra 路由器,那么路由器将把各个控制器组成一个“系统”,该“系统”将处理我的所有端点。书中的例子:

Example 4-32. Using Sinatra as router
require 'sinatra/base'

class Foo < Sinatra::Base
  get('/foo') { 'foo' }
end

class Bar < Sinatra::Base
  get('/bar') { 'bar' }
end

class Routes < Sinatra::Base
  get('/foo') { Foo.call(env) }
  get('/bar') { Bar.call(env) }
end

run Routes

当然,就我而言,我不需要 'run Routes' 行。我只会让我的 lambda.handler 调用 Routes,就像在 Routes.call 中一样。这似乎非常可行!