问题:
我在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
我不想为暂存环境触发这个函数,因为它不是必需的。任何帮助都是非常感谢的。
发布于 2018-07-03 14:16:42
如果CloudFormation不工作,可以手动删除现有的$ sls remove
堆栈。
然后从零开始重新部署堆栈。当然,确保在新部署之前删除了.serverless目录。
发布于 2018-07-05 23:17:09
我认为问题在于,stageParams并没有做你认为它做的事情。它不将lambda附加到Cloudwatch触发器上,只在prod阶段。Serverless docs (https://serverless.com/framework/docs/providers/aws/events/schedule/)有一个令人困惑的示例,其中将stageParams
作为触发器的输入值列出。这意味着Cloudwatch将调用input
值为事件数据的lambda。
根据阶段的不同,没有一种方法可以选择性地不部署serverless.yml
中列出的资源。当使用一些自定义配置参数不刺激stage时,可以将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)
有关设置importEnabled值的方法,请参阅importEnabled
https://stackoverflow.com/questions/51154324
复制相似问题