当运行AWS SAM本地化时,我如何指定模板参数?

31

使用 AWS SAM Local 我可以在本地测试无服务器应用程序,非常棒。

我还可以部署到 AWS,这显然需要使用与aws cloudformation deploy相同的标志,因此我可以传递一个参数文件,例如应用程序机密(API 密钥等)。

但是,在本地测试时,在aws local start-api --help或 Github 文档中都找不到如何使用参数文件的说明。

当运行 sam local start-api 时,如何指向参数文件以与我的模板一起使用?


2
我不确定在某些版本的SAM CLI上是否可能实现这一点。我尝试了上面的答案,但它似乎在我的SAM CLI版本中无法工作。我得到了“错误:没有这样的选项:--parameter-values”。sam --version显示为4.0。在sam local start-api --help的选项中也没有列出(sam local start-api --help | grep -i parameter-values没有任何输出)。 - curiouscat
我无法相信目前还没有一个选项可以将云形成参数文件的名称传递给sam deploy的云形成阶段。这将非常有用。 - developer
sam deploy的功能请求已经开放了几年 - https://github.com/aws/aws-sam-cli/issues/2054 - 如果它最终完成,将会在这里。此外,还包含一些其他人正在使用的解决方法。 - mijiturka
4个回答

42

你可以使用--parameter-overrides开关。语法相当冗长,如下所示:

sam local start-api --parameter-overrides ParameterKey=Key1,ParameterValue=value1 ParameterKey=Key2,ParameterValue=value2

也就是说,您需要使用逗号分隔符指定每对的

然后,每个之间用空格分隔。


来自sam local start-api --help

  --parameter-overrides       Optional. A string that contains
                              CloudFormation parameter overrides encoded
                              as key=value pairs. Use the same format as
                              the AWS CLI, e.g. 'ParameterKey=KeyPairName,
                              ParameterValue=MyKey ParameterKey=InstanceTy
                              pe,ParameterValue=t1.micro'

1
是的,我也在帮助文档中注意到了这一点。然而,问题特别是关于如何将文件路径传递给具有参数值的文件,就像您可以使用aws cloudformation deploy一样,但我找不到如何或是否可以使用sam local start-api实现。 - Tomas Aschan
2
看起来不支持那个。您可以尝试使用shell并使用--parameter-values $(cat myparams.cfg)。该文件需要与通常的格式不同,但应该可以工作。 - kichik
2
sam local start-api --help now also correctly states --parameter-overrides - sgdesmet
能否从文件中使用 --parameter-override 参数?我想将环境参数与脚本分开。 - Matteo
@Madeo,听起来你可能需要使用脚本来完成这个任务。用户可以通过命令行输入选择的选项,然后在用户输入选项后运行构建/打包/部署序列。 - andrewec
如何在此选项中引用某些深度嵌套的参数?例如:Function -> Event -> Properties -> Path - Enbugger

6
你可以像在 AWS CloudFormation 部署一样,在 sam deploy 中使用 --parameter-overrides,只需要做出小小的更改:
之前:
sam deploy --template-file packaged.yaml --stack-name example-lambda --capabilities CAPABILITY_IAM --parameter-overrides ParameterKey=SourceS3Bucket ParameterValue=test-data-111

之后:

sam deploy --template-file packaged.yaml --stack-name example-lambda --capabilities CAPABILITY_IAM --parameter-overrides SourceS3Bucket=test-data-111

显著变化: 在sam deploy中不需要显式指定ParameterKey、ParameterValue,这有助于我的本地测试。

希望对您有所帮助。:)


3
使用 --parameters-overrides 作为 .json 文件是否可行? - Matteo

4

似乎你也可以使用-n--env-vars参数,将以JSON文件形式传递环境变量到函数中。请参见文档:使用SAM CLI(公共测试版)本地测试无服务器应用程序

简而言之,你的JSON文件将如下所示(示例摘自文档):

{
  "MyFunction1": {
    "TABLE_NAME": "localtable",
    "BUCKET_NAME": "testBucket"
  },
  "MyFunction2": {
    "TABLE_NAME": "localtable",
    "STAGE": "dev"
  },
}

然后你可以执行:

 $ sam local start-api --env-vars env.json

这是关于Lambda函数环境变量的,但可能并不完全符合您的需求?

3
不行,虽然有用,但这并不能解决问题。例如,我无法使用这种方法来对动态数据库表名进行参数化设置等操作。 - Tomas Aschan

1

我的奇怪经历是,这取决于参数的顺序。我有两个参数-SecretKey和指向Mongo实例的DatabaseUri。当我首先使用DatabaseUri时,SecretKey没有加载,因此在缺少参数SecretKey时构建失败。当我真的绝望时,我交换了参数,将SecretKey放在第一位,然后它开始工作了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接