如何使用 localstack 部署 SAM 堆栈?

mea*_*bia 4 sam amazon-web-services serverless localstack

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

小智 5

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

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

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

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

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

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

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

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