无服务器框架-来自文件和手动的环境变量



我有AWS Lambda的无服务器框架功能。我在AWS秘密管理器(SSM)参数存储和本地.yml文件中的其他环境变量中有秘密,用于单独部署(dev, stg, prod)。

如何使用文件和SSM中的环境变量?

只有秘密工作:

functions:
kinesisEvents:
handler: kinesis_events_processing.lambda_handler
name: kinesis-events-${self:provider.stage}
package: {}
maximumRetryAttempts: 2
events:
- stream:
type: kinesis
... # omitted a few things
environment:
DB_PASSWORD: ${ssm:/${self:provider.stage}/db/db_password}
API_KEY: ${ssm:/${self:provider.stage}/api/internal_api_key}

和只有文件也可以:

functions:
kinesisEvents:
... # as above
environment:
${file(${self:provider.stage}.yml):}

但是我如何将它们组合起来,以便在最终部署中将所有这些变量设置为环境变量?我尝试了这个,但它不工作,并在部署期间抛出错误:

functions:
kinesisEvents:
... # as above
environment:
DB_PASSWORD: ${ssm:/${self:provider.stage}/db/db_password}
API_KEY: ${ssm:/${self:provider.stage}/api/internal_api_key}
${file(${self:provider.stage}.yml):}

我在这里、这里和这里找到了答案。基本上,无服务器框架对这个特性没有特别的支持。但是,它支持扩展的YAML语法,该语法具有锚和字典合并功能。

因此,首先我从YAML配置文件中解压缩env变量,在文件的顶部,并使用&env_vars(类似于用于引用的变量,但在YAML中)锚定它:

env_vars: &env_vars
${file(${self:provider.stage}.yml):}
functions:
...

然后我使用它,解包这个字典:

environment:
<<: *env_vars
DB_PASSWORD: ${ssm:/${self:provider.stage}/db/db_password}
API_KEY: ${ssm:/${self:provider.stage}/api/internal_api_key}

最新更新