问题:
我在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
我不想在暂存环境中触发此功能,因为不需要它。任何帮助表示赞赏。
答案 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的值