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