我正在尝试在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函数。
答案 0 :(得分:1)
显然,几年后,设置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); }