3

我正在尝试使用 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 示例项目自述文件中所述。

但是,这会破坏在本地运行应用程序的能力,sam build然后是sam local start-api.

我试图通过将CodeUri值作为参数(with )来解决这个问题,这在本地工作,但由于SAM 翻译器的一个已知问题--parameter-overrides而中断了打包阶段。

有没有办法让本地构建和真正的 AWS 部署都工作,最好使用相同的模板文件?

4

1 回答 1

3

到目前为止,我自己想出的唯一解决方法是使用不同的模板文件进行本地开发以及实际的打包和部署。

为了避免维护两个几乎相等的模板文件,我编写了一个在本地运行服务的脚本:

#!/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 模板不支持类似的东西。

于 2019-03-21T09:00:34.763 回答