无服务器环境变量范围

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

我们有一个 yaml 文件,其中包含 1 个带有多个 lambda 函数定义的服务。我试图在一个函数下定义一个环境变量,并希望可以在 iamrole 语句中找到它,但我得到了

Value not found at "env" source
。 但我需要在每个函数级别定义变量。有没有办法我们可以实现这一目标。我们的 yml 看起来像

service: myService

frameworkVersion: "3"

provider:
  name: aws
  ...
  iamRoleStatements:
    - Fn::If:
        - myCondition
        - Effect: "Deny"
          Action:
            - ...
          Resources:
            - ...
resources:
  Conditions:
    myCondition: !Equals ["${env:MY_ENV_VARIABLE, false}", true]


functions:
  my_function:
    ...
    environment:
      MY_ENV_VARIABLE: true  

非常感谢!

aws-cloudformation serverless-framework aws-serverless
1个回答
0
投票

您可以简单地在 yaml 文件的

custom
部分定义该值,然后从那里选取它:

service: myService

frameworkVersion: "3"

custom:
  myEnvVariable: true

provider:
  name: aws
  ...
  iamRoleStatements:
    - Fn::If:
        - myCondition
        - Effect: "Deny"
          Action:
            - ...
          Resources:
            - ...

resources:
  Conditions:
    myCondition: !Equals ["${self:custom.myEnvVariable, false}", true]


functions:
  my_function:
    ...
    environment:
      MY_ENV_VARIABLE: ${self:custom.myEnvVariable}  

但是我看到基于此:

["${env:MY_ENV_VARIABLE, false}", true]
,在某些情况下您的变量可能未设置。如果取决于阶段,您可以简单地使用 params 部分:

service: myService

frameworkVersion: "3"

params:
  default:
    MY_ENV_VARIABLE: true
  staging:
    MY_ENV_VARIABLE: true
  prod:
    MY_ENV_VARIABLE: false

provider:
  name: aws
  ...
  iamRoleStatements:
    - Fn::If:
        - myCondition
        - Effect: "Deny"
          Action:
            - ...
          Resources:
            - ...

resources:
  Conditions:
    myCondition: !Equals ["${param:MY_ENV_VARIABLE}", true]


functions:
  my_function:
    ...
    environment:
      MY_ENV_VARIABLE: ${param:MY_ENV_VARIABLE}  

然后根据您在部署期间传递的

stage
名称,将选择正确的值。在该示例中,对于 prod,
MY_ENV_VARIABLE
的值将有所不同。如果提供非标准的
stage
,那么它将回退到默认值。

© www.soinside.com 2019 - 2024. All rights reserved.