我有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}