如何同时在本地运行AWS SAM模板并将其成功部署到AWS(使用Java Lambdas)?

时间:2019-03-21 08:55:24

标签: aws-sam-cli aws-sam

我正在尝试使用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部署均能正常工作,最好是使用相同的模板文件?

1 个答案:

答案 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模板不支持此类功能。