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

问题描述 投票:0回答:2

我有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):}
aws-lambda serverless-framework
2个回答
2
投票

我在这里这里这里找到了答案。基本上,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}

0
投票

我尝试了@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}
© www.soinside.com 2019 - 2024. All rights reserved.