如何使用localstack部署SAM堆栈?

时间:2020-02-05 14:03:46

标签: amazon-web-services serverless localstack sam

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

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

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

答案 1 :(得分:0)

经过一番研究,最可靠的方法是

  1. sam buildzip 您在 .aws-sam/build 中的代码
$ cd .aws-sam/build
$ zip -qr MyLambda.zip MyLambda
$ tree .aws-sam -L 2
.aws-sam
├── build
│   ├── MyLambda.zip
│   ├── MyLambda
│   └── template.yaml
└── build.toml

2 directories, 3 files
  1. 将压缩代码部署到 localstack lambda,假设我有一个 nodejs 代码库
aws --endpoint-url=http://localhost:4566 lambda create-function \
    --function-name "my-lambda" --runtime=nodejs12.x --role dummy \
    --zip-file=fileb:.aws-sam/build/MyLambda.zip \
    --handler MyLambda/src/index.handler

答案 2 :(得分:0)

Localstack 的制造者为 sam cli 创建了一个轻量级的 wrapper。只需使用 pip 将 samlocal 作为 Python 库安装在您的机器上:

pip install aws-sam-cli-local

然后您可以使用 samlocal deploy 代替常规的 sam deploy 部署到本地堆栈。类似于以下内容:

samlocal deploy --stack-name sam-app --capabilities CAPABILITY_IAM --guided

有关 sam deploy 可用选项的更多详细信息,请参阅文档 here