AWS Lambda:使用CloudwatchEvent.disableRule在Lambda中不起作用,但在本地中起作用

问题描述

我正在尝试在Lambda本身中禁用触发Lambda的Cloudwatch事件规则,以使其在不需要时不会继续运行。

我有一个单独的Lambda,它正在调用enableRule来启用规则,这似乎很好用。该规则与正在执行enableRule的函数无关。编辑:事实证明EnableRule在Lambda中也不起作用。

但是,应该禁用它的Lambda无法正常工作。

这两个功能已经在其角色中拥有Cloudwatch和CloudwatchEvent完全访问权限。

var cloudwatchEvents = new AWS.CloudWatchEvents();

var params = {
   Name: cloudwatchEventRuleName
}
console.log("this message will show up");
cloudwatchEvents.disableRule(params,function (err,data) {
   console.log("but this message never appears when it runs via Lambda for some reason!")
   if (err)
      console.log(err,err.stack);
   else
      console.log(data);
});
console.log("and this message will also show up");

如果我通过Lambda运行它,那应该叫中间console.log的那行根本不起作用。但是,它在我的本地计算机上运行良好。

我什至打印了cloudwatchEventRuleName来检查我是否有错别字,但是函数名称似乎正确。就像该函数由于某种原因完全跳过了disableRule函数。

解决方法

显然,几年后,设置VPC仍然困扰着我。

是的,这是VPC的配置。

我可以保证Lambda函数使用的子网具有一个路由表,该路由表指向使用NAT网关实例正确设置的网络接口。

出于好奇,我尝试将路由表条目0.0.0.0/0指向实例(i-#####),而不是指向网络接口(eni-######)。 / p>

在“路由表”中按“保存”后,它会自动转换为eni-######,类似于我已经设置的内容...

除了这次,该功能现在实际上开始工作了。

我不知道AWS做了什么样的魔术,因此将实例= / =关联到网络接口,即使前者无论如何都转换为相同的ID,但无论如何。

因此,对于遇到相同问题的任何人:请始终记住仔细检查您的函数是否实际上可以访问互联网以使用AWS API。

编辑:还有另一件事:我必须确保都等待enableRule和disableRule,因为某种原因,如果处理程序在请求完成之前已经返回了某些内容,则实际上无法正确发送AWS请求。所以我们变成了一个承诺,以便我们可以等待它:

try { await cloudwatchEvents.disableRule(params).promise().then((result) => console.log(result)) }
catch (error) { console.log("Error when disabling rule!",error); }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...