我正在尝试使用SAM(无服务器应用程序模型)和以Java编写的Lambda来构建AWS应用程序。
我能够通过在模板中使用如下资源定义来使其在本地运行:
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: HelloWorldFunction
Handler: helloworld.App::handleRequest
Runtime: java8
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
但是要进入sam package
阶段,仅将实际代码(而不是整个项目目录)上传到S3,我必须将其更改为:
...
Properties:
CodeUri: HelloWorldFunction/target/HelloWorld-1.0.jar
...
如AWS SAM示例项目README中所述。
但是,这破坏了在sam build
后跟sam local start-api
后在本地运行应用程序的能力。
我尝试通过将CodeUri
值作为参数(使用--parameter-overrides
)来解决此问题,此方法在本地有效,但是由于known issue与SAM转换器一起使用,因此中断了打包阶段
是否有办法使本地构建和实际的AWS部署均能正常工作,最好是使用相同的模板文件?
答案 0 :(得分:0)
到目前为止,我唯一想出的解决方法是使用不同的模板文件进行本地开发以及实际的打包和部署。
为了避免维护两个几乎相等的模板文件,我编写了一个脚本以在本地运行该服务:
#!/bin/bash
echo "Copying template..."
sed 's/CodeUri: .*/CodeUri: HelloWorldFunction/' template.yaml > template-local.yaml
echo "Building..."
if sam build -t template-local.yaml
then
echo "Serving local API..."
sam local start-api
else
echo "Build failed, not running service."
fi
这感觉不尽如人意,但却可以解决问题。仍然希望听到更好的选择。
想到的另一种想法是针对这些情况扩展具有单独CodeUri
值的共同基础模板,但我认为SAM模板不支持此类功能。