1

我需要创建一个集成项目,它在执行时应该启动所有 aws mock 服务,例如S3、API 网关、SQS、Dynamo dbSSM。我们使用serverless.com 框架在内部使用上述 AWS 服务的 Node.js 中开发 lambda。此外,这些 lambda 使用 API Gateway 调用另一个 lambda,其中 X 调用类型是异步调用的事件。

关于我应该选择哪种方法在本地运行这些 lambda 的任何建议:

  1. 我应该创建一个无服务器项目,其中无服务器离线插件如
    • serverless- s3 -local
    • 无服务器-发电机-本地
    • 无服务器离线-ssm
    • 无服务器离线 - dynamodb

所以当这个项目被执行时,它将在本地机器的特定端口上运行这些服务。

  1. 使用SAM 本地

    • 为此,我需要编写一个 sam 模板,因为目前我使用的是 serverless.com 框架,其中有 serverless.yml 而不是 sam 模板。
    • 还有 serverless-sam 插件可以将 serverless.yml 导出到 sam 模板,但是,对于 serverless.yml 中的少数部分,它会引发错误,因为对于少数基础构建,我们使用 serverless.yml 中的 terraform 执行输出。
    • 此 terraform 不适用于本地。所以基本上我没有选择使用 serverless-sam 插件的导出功能。我需要创建一个单独的项目,该项目将具有包含所有相关 AWS 服务规范的 sam 模板。
  2. 使用 Python Moto 库:https ://github.com/spulec/moto#stand-alone-server-mode

提前致谢

4

1 回答 1

1

这听起来像是Localstack的一个很好的用例

Localstack 将启动一个本地 Docker 实例,该实例可以充当本地 AWS 端点,并支持许多开箱即用的服务和功能。

正面:

  • 使用单一框架,而不是找出多个插件
  • 独立于语言 - 如果您决定在某个时候离开无服务器插件
  • 它支持您提到的所有服务:S3、API 网关、SQS、Dynamo db 和 SSM
  • 它还将能够执行 AWS Lambda。

负面:

  • AWS Lambda 将在它们自己的临时 Docker 容器中执行。这意味着它将无法直接访问总体 Localstack Docker。
    也就是说,通过 Localstack 执行 Lambda 函数将无法立即调用 Localstack API Gateway。为此,您必须将 AWS 开发工具包中的端点参数显式设置为 http:/localhost:xxxx (而不是https://apigateway.amazonaws.com

(请参阅此代码作为示例,其中 Lambda 在其自己的 Docker 容器中运行,但在测试期间需要访问离线 EC2 实例:https ://github.com/spulec/moto/blob/master/tests/test_awslambda/test_lambda .py#L55 )

完全披露:我是 Moto 合作者,Localstack 在后台使用它。

于 2020-04-07T06:19:58.123 回答