无服务器部署无法检查堆栈进度AWS

时间:2018-07-03 12:11:14

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

问题:

我在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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

无法根据阶段选择性地不部署serverless.yml中列出的资源。当不使用某些自定义配置参数进行阶段生产时,可以将enabled设置为false。这会将触发器部署到您的登台环境中,但不会被调用。

CloudFormation错误还表明存在命名冲突。 Serverless应该根据阶段生成唯一的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的值