【问题标题】:Testing AWS Lambdas locally behind API Gateway endpoints在 API Gateway 终端节点后本地测试 AWS Lambda
【发布时间】:2017-10-26 08:35:06
【问题描述】:

AWS 菜鸟在这里。这有点像“最佳实践开发问题”——但我会尽量具体一点:

我知道我可以使用 json 文件作为输入在本地测试节点中的 Lambda,但我不确定“集成测试”我的 Web 应用程序的最佳方法,该应用程序将在 S3 中运行并调用 Lambda 以响应 API网关端点调用。

如果能使用我的实际 API Gateway 配置文件让我能够在本地调用相同的方法并在本地执行我的 Lambda,那就太好了。本文认为这是不可能的,因为没有本地 API 网关测试环境:http://nickmchardy.com/blog/2015/09/my-thoughts-about-aws-api-gateway-working-with-aws-lambda

也许这不太清楚,举个例子:如果我在 API Gateway 中有一个 users/ 方法,带有 GET 和 POST,它们分别连接到 AWS 中的 listUsers.js 和 createUser.js Lambda;在开发中我想调用:http://localhost:0000/usersGET/POST 并让它运行 Lambda 并给出正确的响应,这样我就可以在本地运行我的整个架构。

显然,在 url 上调用一个东西并不是特别复杂,所以我的问题更多:考虑到我将有我的 (Cloudfront!? JAWS!?) 配置来了解这些东西如何链接在一起,这样做的最佳做法是什么AWS,我可以将它用于本地测试吗?

如果这不是很清楚或很明显,请道歉!

【问题讨论】:

    标签: aws-lambda aws-api-gateway


    【解决方案1】:

    哦。答案显然是“无服务器”(以前称为 JAWS):https://github.com/serverless/serverless。需要继续谷歌搜索,道歉!不确定是否要删除这个问题,现在?!我想这可能对其他人有帮助吗?尤其是 Serverless 是新事物?

    【讨论】:

    • 请不要删除这个!否则我可能找不到 Serverless! :)
    • Serverless 还远远没有完成 BTW。我们已经放弃了 AWS API Gateway。开发工具不好用! (然而)
    【解决方案2】:

    目前,AWS API Gateway 和 AWS Lambda 没有本地测试版本,但我们将作为功能请求考虑。

    【讨论】:

    • 请改用无服务器! - 这似乎是一个绝妙的主意,但离完成还很遥远。
    【解决方案3】:

    我们的套件 (Bespoken Tools) 将允许您做到这一点。本教程解释了如何: http://docs.bespoken.tools/en/latest/tutorials/tutorial_lambda_local/

    简短的总结是:
    1) 安装定制工具
    npm install bespoken-tools -g
    2) 使用您的 Lambda 启动代理
    bst proxy lamdba index.js
    3) 获取它打印出来的 URL 并在 API 网关中使用它
    将 API Gateway 配置为 HTTP 集成,并使用在步骤 2 中启动代理时打印出的 URL。

    希望对您有所帮助!设置好之后,对 API 网关的调用将直接转到笔记本电脑上本地运行的 Lambda。

    【讨论】:

      【解决方案4】:

      最近,我一直在使用 ClaudiaJS 来帮助我进行 AWS Lambda 开发。创建者还构建了这个名为 claudia-api-builder 的库,它将帮助您构建触发 lambda 事件的 AWS API 网关。在这个框架中,您可以在测试类中测试端点,或者通过创建类似的东西来测试

      var apiRequest = {
        context: {
          path: '/task',
          method: 'GET'
        },
        queryString: {
          name: 'mike'
        }
      };
      // This method will simulate your api gateway endpoint
      api.router(apiRequest, {done: function(err, data){
        console.log(data);
      }});
      

      尽管这种方式不太容易理解,但至少它有助于我通过 api gateway 对我的 lambda api 进行单元测试。

      【讨论】:

        【解决方案5】:

        您也可以使用aws-sam-local 首先你必须安装docker。接下来,请按照以下步骤操作:

        $ npm install -g aws-sam-local
        $ cd path/to/your/code
        $ sam local start-api
        

        CLI 会将您的 API 函数映射到 localhost URL。现在您可以使用 cURL、Postman 或您的浏览器来访问 API 端点。

        【讨论】:

          【解决方案6】:

          很遗憾,无法在本地运行 API 网关。

          我不确定是否有最佳做法,但我们所做的是在 API 网关中拥有相同 API 的多个副本:开发 API、暂存 API 和实时 API。我们没有选择使用阶段,因为端点将连接到相同的 lambda 函数并且版本控制真的很困难(现在稍微好一些)。创建单独的 API 和单独的 Lambda 函数很容易准备好三个设置。使用我们构建的一些 shell 脚本,我们可以部署到任何阶段。

          缺点是你只能在线开发,但对我们来说这并不是真正的缺点。

          【讨论】:

          • 是的,这就是我们所拥有的。所有在线测试,每个开发人员都有自己的阶段 - 然后阶段名称传递给 lambda,因此每个开发人员也可以拥有自己的 Dynamo DB 表 - 但显然答案是“无服务器”(它是新的)!看我的回答:)
          【解决方案7】:

          我建议您执行以下操作: 1.当您编写一个 lambda 时,请确保它不知道调用它的名称(例如 http),而是知道它需要从事件 json 中知道的所有内容。

          2.如果你已经完成了“1”然后使用“grunt”:https://www.npmjs.com/package/grunt-aws-lambda 用于使用自定义“事件”文件测试您的 Lambda。 这将允许您将 Lambda 与 aws api 网关分开。

          3.使用 npm test 构建带有 http 请求的 E2E 测试,以检查您的身体操作是否正确完成。

          【讨论】:

          • 抱歉,Lambda 不是问题,它是 API 网关部分,所以我可以在没有 AWS 的情况下运行应用程序。我不会投反对票,但这不是我所追求的。无服务器非常接近,但还没有完成。
          猜你喜欢
          • 2018-11-13
          • 1970-01-01
          • 1970-01-01
          • 2019-07-09
          • 2022-06-22
          • 1970-01-01
          • 1970-01-01
          • 2020-02-22
          • 1970-01-01
          相关资源
          最近更新 更多