Amazon web services 无服务器部署在检查堆栈进度时失败

Amazon web services 无服务器部署在检查堆栈进度时失败,amazon-web-services,aws-lambda,amazon-cloudformation,serverless-framework,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

问题:

我在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.
编辑: 计划完整导入功能仅适用于生产环境,而不适用于临时环境。我的理解是,当我尝试部署时,它只是试图为登台环境找到触发器。在这种情况下,它没有找到它,然后进入生产环境

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

我不想为登台环境触发此函数,因为它不是必需的。非常感谢您的帮助。

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

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

我认为问题在于stageParams并不像您想象的那样。它不会仅在prod阶段将lambda连接到Cloudwatch触发器。Serverless docs()有一个令人困惑的示例,它将
stageParams
列为触发器的输入值。这意味着Cloudwatch将调用lambda,其值为
input
,作为事件数据

没有一种方法可以根据阶段有选择地不部署
serverless.yml
中列出的资源。您可以通过使用一些自定义配置参数,将阶段未激活时的
enabled
设置为false。这会将触发器部署到登台环境中,但不会调用它

CloudFormation错误还表明存在命名冲突。Serverless应该根据阶段生成唯一的lambda名称,因此如果我不得不猜测计划名称
完整数据导入
不是唯一的。我会尝试将其重命名为

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)
自定义:
可进口:
功能:
计划\u完整\u导入:
处理者:我的处理者
超时时间:6
活动:
-附表:
名称:完整数据导入-${self:provider.stage}
已启用:${self:custom.importEnabled}
速率:速率(10分钟)

有关设置importEnabled的值的方法,请参见。问题是,生产函数的数据导入不存在于用于暂存的CloudFormation堆栈中。我的理解是,它是从serverless.yml文件翻译而来的,在该文件中,我有一个函数,其中的staging params仅用于生产环境,应该是这样。因为我不希望数据导入为登台运行。您能否提供将enabled设置为false的配置示例,这可以说明解决方案。