我有AWS Lambda的无服务器框架功能。我在 AWS Secrets Manager (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):}
我在这里、这里和这里找到了答案。基本上,Serverless Framework 对此功能没有特别支持。但是,它支持扩展的 YAML 语法,具有锚点和字典合并功能。
首先,我从文件顶部的 YAML 配置文件中解压环境变量,并用
&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}
我尝试了@qalis的答案,但得到(在BitBucket构建管道中):“无法解析“serverless.yml”:无法合并映射;提供的源对象在“/opt/atlassian/pipelines/agent/build/serverless.yml”中是不可接受的“(12:5)”
service: {project}-14-dkr
env_vars: &env_vars
${file(./config/serverless/config.${self:provider.stage}.json):}
provider:
name: aws
stage: ${opt:stage, 'local'}
region: eu-west-1
environment:
<<: *env_vars
RUNTIME_AWS_ACCESS_KEY_ID: ${param:runtimeAwsAccessKeyId}
RUNTIME_AWS_SECRET_ACCESS_KEY: ${param:runtimeAwsSecretAccessKey}