Amazon web services 无服务器部署在检查堆栈进度时失败
问题: 我在AWS上有两个lambda函数,代表两种不同的环境(暂存和生产)。生产环境具有每10分钟运行一次的数据导入功能。我面临的问题是,当我尝试部署临时环境时,堆栈更新进度出现错误,如图所示: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
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的配置示例,这可以说明解决方案。