【问题标题】:serverless deployment fails on checking stack progress AWS无服务器部署在检查堆栈进度 AWS 时失败
【发布时间】:2018-12-11 18:04:20
【问题描述】:

问题:

我在 AWS 上有两个 lambda 函数,代表两个不同的环境(暂存和生产)。生产环境具有数据导入功能,每 10 分钟运行一次。我面临的问题是,当我尝试部署暂存环境时,堆栈更新进度出现错误,如图所示:

Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.........................
Serverless: Operation failed!

  Serverless Error ---------------------------------------

  An error occurred: MyimportfunctionEventsRuleSchedule1 - schedule-full-import already exists in stack Cloudformation_StackId_of_production_lambda_function.

编辑: schedule-full-import 功能仅适用于生产环境,不适用于暂存环境。我的理解是,当我尝试部署时,它只是试图找到暂存环境的触发器。在这种情况下,它没有找到它,然后进入生产环境。

serverless.yml

schedule_full_import:
    handler: my_handler
    timeout: 6
    events:
      - schedule:
          enabled: true
          name: full-data-import
          rate: rate(10 minutes)
          stageParams:
            stage: prod

我不想为暂存环境触发此功能,因为它不是必需的。任何帮助表示赞赏。

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cloudformation serverless-framework


    【解决方案1】:

    如果$ sls remove 不起作用,您可以手动删除现有的 CloudFormation 堆栈。

    然后从头开始重新部署您的堆栈。 当然,请确保在新部署之前删除了 .serverless 目录。

    【讨论】:

    • 问题是我的 CloudFormation 堆栈中不存在用于生产功能的数据导入以进行暂存。我的理解是,它是从 serverless.yml 文件翻译过来的,在该文件中,我拥有带有暂存参数的功能,仅适用于应该是这种情况的生产环境。因为我不希望为暂存运行数据导入。
    【解决方案2】:

    我认为问题在于 stageParams 并没有像您认为的那样做。它不会仅在 prod 阶段将 lambda 附加到 Cloudwatch 触发器。无服务器文档 (https://serverless.com/framework/docs/providers/aws/events/schedule/) 有一个令人困惑的示例,其中列出了 stageParams 作为触发器的输入值。这意味着 Cloudwatch 将调用具有 input 值的 lambda 作为事件数据。

    没有办法根据阶段选择性地不部署serverless.yml 中列出的资源。你可以做的是在没有使用一些自定义配置参数来触发阶段时将enabled 设置为 false。这会将触发器部署到您的登台环境,但不会被调用。

    CloudFormation 错误还表明存在命名冲突。无服务器应该根据阶段生成唯一的 lambda 名称,所以如果我不得不猜测计划名称 full-data-import 不是唯一的。我会尝试将其重命名为

    name: full-data-import-${self:provider.stage}
    

    取决于您如何引用阶段参数。

    你可以试试这样的:

    custom:
        importEnabled: <set this by config file, command line argument, environment variable, etc>
    
    functions:
        schedule_full_import:
            handler: my_handler
            timeout: 6
            events:
                - schedule:
                      name: full-data-import-${self:provider.stage}
                      enabled: ${self:custom.importEnabled}
                      rate: rate(10 minutes)
    

    请参阅https://serverless.com/framework/docs/providers/aws/guide/variables/ 了解设置 importEnabled 值的方法

    【讨论】:

    • 您能否提供配置示例,启用设置为 false 可以说明解决方案。
    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2018-12-21
    • 2022-01-22
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多