0

我正在离线运行无服务器并已根据阶段配置环境变量。

provider:
    name: aws
    stage: ${opt:stage,'dev'}
    environment:
      MY_ENV_VAR: ${self:custom.myEnvVar.${self:provider.stage}}
custom:
stages:
    - dev
    - prod
myEnvVar:
    dev: ${env:MY_ENV_VAR}
    prod: ${ssm:MY_ENV_VAR}

当我跑步时serverless offline start,它会发出警告

找不到满足声明“ssm:MY_ENV_VAR”的有效 SSM 参数。

默认情况下,这个阶段dev为什么要尝试访问 SSM 参数存储?

任何帮助将不胜感激

谢谢

4

2 回答 2

1

我在使用最新版本的无服务器(2.70.0)时遇到了同样的问题。

我还将 SSM 参数引用为每个阶段的自定义变量。

无服务器尝试获取它不需要的值(基于阶段)。所以失败了。因为它没有获取它们的权限。

例如对于旧变量,它会抛出一个警告(仍然是错误的,但至少它会运行):

sls invoke local -f app -s local -p test/events/test.json

#variablesResolutionMode: 20210326

 Serverless Warning --------------------------------------
 
  A valid SSM parameter to satisfy the declaration 'ssm:production-variable-here' could not be found.

并使用新的可变分辨率...

variablesResolutionMode: 20210326

...你得到一个错误:

Cannot resolve variable at "custom.production-variable-here": User: arn:aws:iam::etc is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:etc because no identity-based policy allows the ssm:GetParameter action

错误是正确的:不允许用户获取值。但它没有必要获得价值。由于阶段不需要 SSM 变量。

于 2021-12-29T16:52:56.160 回答
0

根据您的 YAML 文件,第一个问题是自定义下 myEnvVar 变量的间距/填充。

当我尝试sls 打印时,我遇到了同样的错误,问题是 sls 尝试从 SSM 验证/读取变量。因此,如果它不存在,则无论在哪个阶段执行,构建的 sls 都会失败。

以下脚本适用于我:

provider:
    name: aws
    runtime: python3.8
    environment:
        MY_ENV_VAR: ${self:custom.myEnvVar.${self:provider.stage}}
    region: eu-west-1

custom:
    myEnvVar:
        dev: 'some value'
        prod: ${ssm:some-custom-config}

但考虑到:

  1. 该变量必须存在于 SSM 中。
  2. 必须在 ssm:parameter 所在的位置设置正确的区域。
于 2020-09-15T13:58:12.597 回答