【问题标题】:Exclude Lambda function from deploy to a particular stage从部署到特定阶段排除 Lambda 函数
【发布时间】:2018-05-22 21:57:08
【问题描述】:

我试图排除 Lambda 函数通过无服务器部署到我在 AWS 中的 prod 阶段。

我的无服务器 yaml 中的 sn-p 看起来像 -

functions:
  some-prod-function:
    handler: prodFunction.handler
    events:
      - http:
          path: /prod-function
          method: post
  some-dev-function:
    handler: devFunction.handler
    events:
      - http:
          path: /dev-function
          method: post

有没有办法排除 some-dev-function 被部署到产品?

【问题讨论】:

  • 我认为你应该使用不同的阶段而不是不同的api路径

标签: aws-lambda serverless-framework


【解决方案1】:

您可以将这些定义放在不同的属性上并使用变量来选择要使用的定义。

environment-functions:
  prod:
    some-prod-function:
      handler: prodFunction.handler
      events:
        - http:
            path: /prod-function
            method: post
  dev:
    some-dev-function:
      handler: devFunction.handler
      events:
        - http:
            path: /dev-function
            method: post


functions: ${self:environment-functions.${opt:stage}}      

您可能需要根据您在部署阶段指定的方式(${opt:stage}${env:stage})更改此设置。

【讨论】:

  • 这对我不起作用。但是,如果我将environment-functions 放在custom 下,我可以通过引用${self:custom.environment-functions.${opt:stage}} 使其工作。不过,我不知道为什么这个效果更好。
  • @AndreasForslöw 也许serverless 已经改变了这个,因为我写了这个答案。
【解决方案2】:

我使用的是 SLS 1.32.0

我无法让functions: ${self:environment-functions.${opt:stage}} 工作。 (不知道为什么)

它返回以下内容:

A valid service attribute to satisfy the declaration 'self:environment-functions.dev' could not be found.

但是,在 dashmug 的 回答中使用相同的逻辑,file 为我工作:

serverless.yml

functions: ${file(serverless-${opt:stage}.yml)}

serverless-dev.yml

some-dev-function:
  handler: devFunction.handler
  events:
    - http:
        path: /dev-function
        method: post

serverless-prod.yml

some-prod-function:
  handler: prodFunction.handler
  events:
    - http:
        path: /prod-function
        method: post

【讨论】:

    【解决方案3】:

    如果您使用的是无服务器框架,您可以使用无服务器插件

    无服务器插件ifelse

    然后

    plugins:
      - serverless-plugin-ifelse 
    

    如果你想排除 func1

    functions:
      func1:
        name: Function 1
        handler: lambda.func1
        events:
          - http:
              path: "path1"
              method: "post"
              authorizer:
                arn: arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_0acCDefgh
    
      func2:
        name: Function 2
        handler: lambda.func2
        events:
          - http:
               path: "path2"
               method: "post"
    
    
    
    func3:
        name: Function 3
        handler: lambda.func2
        events:
          - http:
               path: "path3"
               method: "post"
    

    为 us-east-1 。然后使用下面的代码sn-p

    - If: '"${self:provider.region}" == "us-east-1"'
            Exclude:
              - functions.func1
    

    【讨论】:

      【解决方案4】:

      例如创建一个文件

      env-functions.yml

      并添加如下内容

      prod:
          some-prod-function:
            handler: prodFunction.handler
            events:
              - http:
                  path: /prod-function
                  method: post
      dev:
          some-dev-function:
            handler: devFunction.handler
            events:
              - http:
                  path: /dev-function
                  method: post
      

      在 serverless.yml 集之后

      functions: ${file(env-functions.yml):${opt:stage, self:provider.stage}}
      

      【讨论】:

        猜你喜欢
        • 2023-01-24
        • 2021-08-14
        • 2019-08-04
        • 1970-01-01
        • 2018-06-19
        • 2020-05-30
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多