首页 > 解决方案 > 如何使用 localstack 部署 SAM 堆栈?

问题描述

我编写了一个 SAM 堆栈,我可以在 AWS 上构建、打包和部署它。我也可以使用 start-local 或调用来测试。现在我需要测试其他 AWS 资源。我已将这些资源添加到我的 SAM 模板中。它在 AWS 上运行良好,但我正在寻找一种在 localstack 中部署我的 SAM 堆栈的方法(例如本地 dynamodb)。现在我必须使用 CLI 创建资源,然后我可以部署我的 SAM 堆栈(在这种情况下只有 lambda,API GW)。我怎样才能做到这一点?

标签: amazon-web-servicesserverlesslocalstacksam

解决方案


我刚刚经历了这个。我认为以下是正确的。

AWS SAM 是 Cloudformation 的包装器。所以你的 SAM 模板实际上是一个 Cloudformation 模板。您的 Cloudformation 模板定义了您的 lambda 和 dynamodb 等。当您部署到 AWS 时,您的所有 lambda 和 dynamodb 都会进入 AWS,您可以在云中进行测试。

当您在本地运行 AWS SAM 时,您会在本地(在 docker 容器中)运行 lambda,但它仍会访问 AWS 云中的资源。

LocalStack 确实有一个 CloudFormation 接口,因此应该可以部署您的 CloudFormation 模板文件。但是我遇到了一些问题并放弃了。

无服务器框架类似于 AWS SAM,因为它是一个用于开发无服务 (lambda) 代码并将其部署到 AWS 的框架。Serverless 有自己的 yaml 规范来定义堆栈。从 Cloudformation 转换为无服务器 yaml 需要一些工作。

localstack 有一个无服务器插件。然后可以将您的代码部署到 localstack。如果您的 lambdas 前面有 API Gateway,那么您可以点击一个本地 url,它会触发您的 lambdas。这完全在 localstack 中,不使用 AWS SAM。

此时您可能会发现您的代码仍然适用于真正的 AWS 服务。因此,正如 Andrew A. 所提到的,您需要将端点 url 更改为指向本地。为此,为了让您的代码在测试和生产中保持相同,您可以为每个服务端点使用环境变量。

正如 Andrew A. 提到的,应该可以使用 SAM local 运行代码,该代码访问 localstack 提供的资源。但是,如果这是在测试管道中完成的,那么最好保留一个工具。


推荐阅读