Slack延迟了与Node TypeScript和Lambda的消息集成



我开始实现一个斜杠命令,该命令不断发展,最终可能达到3秒的松弛响应限制。我将serverless-stackNodeTypeScript一起使用。使用sst(和vscode launchfile(,它将调试器挂接并附加到lambda函数中,这对于调试来说非常方便。

当到达api端点时,我尝试了各种方法向slack发回确认,做我的事情并发送延迟的消息,但没有成功。我不太幸运地找到了这方面的信息,但一个很好的来源是这个SO Answer——不幸的是,它没有起作用。我没有使用request-promise,因为它已经被弃用,并试图用普通方法实现它(也许这就是我失败的地方?(。但是,从内部调用第二个lambda函数(就像文章的第一个例子中一样(似乎不在3s的限制范围内。

我想知道我是否做错了什么,或者调试器的附加是否只是花了很长时间等等。然而,在尝试发送延迟消息之前,它是可以的,包括访问和扫描dynamodb记录,处理结果,然后在调试器连接时响应slack而不超时。

尝试使用后

export const answer: APIGatewayProxyHandlerV2 = async (
event: APIGatewayProxyEventV2, context, callback
) => {

const slack = decodeQueryStringAs<SlackRequest>(event.body);

axios.post(slack.response_url, {
text: "completed",
response_type: "ephemeral",
replace_original: "true"
});

return { statusCode: 200, body: '' };
}

promise从未解析,我想一旦函数返回,lambda函数就会被丢弃,那么promise呢?

调用第二Lambda函数

export const v2: APIGatewayProxyHandlerV2 = async (
event: APIGatewayProxyEventV2, context, callback
): Promise<any> => {
//tried with CB here and without
//callback(null, { statusCode: 200, body: 'processing' });
const slack = decodeQueryStringAs<SlackRequest>(event.body);
const originalMessage = slack.text;
const responseInfo = url.parse(slack.response_url)
const data = JSON.stringify({
...slack,
})
const lambda = new AWS.Lambda()
const params = {
FunctionName: 'dev-****-FC******SmE7',
InvocationType: 'Event', // Ensures asynchronous execution
Payload: data
}
return lambda.invoke(params).promise()// Returns 200 immediately after invoking the second lambda, not waiting for the result
.then(() => callback(null, { statusCode: 200, body: 'working on it' }))
};

查看调试器日志,它确实发送了200代码并调用了新的lambda函数,尽管slack仍然会超时。

逻辑上没有什么特别的事情发生。。。当前的无延迟消息实现在逻辑上做得更多(访问DB和操作结果数据(,并且设法不超时。

欢迎任何建议或帮助。

简要说明一下,我在链接的SO问题的答案中使用了request-promise,因为当时AWS Lambda的容器上还没有JS原生Promise对象

根据我的理解,关联问题中的函数编排与您自己的函数编排之间存在根本差异,但我认为您有相同的目标:

>从Slack调用异步操作,一旦得到结果,该操作就会发布回Slack

当前方法的问题是:Slack向您的(第一个(lambda函数发送请求,该函数返回对Slack的响应,然后调用第二个lambda函数。

一旦您的第一个lambda返回200,slack事件将不再接受响应。这就是你的方法和相关SO问题之间的区别。

所需的方法顺序如下:

  1. Slack向Lambda no.1发送请求
  2. Lambda no.1向Slack返回200响应
  3. 1号Lambda调用2号Lambda
  4. Lambda no.2向slack URL发送POST请求(google incoming webhooks for slack(
  5. Slack接收POST请求,并将其显示在您为webhook选择的频道中

代码方面,这看起来如下(没有请求承诺lol(:

Lambda 1

module.exports = async (event, context) => {
// Invoking the second lambda function
const AWS = require('aws-sdk')
const lambda = new AWS.Lambda()
const params = {
FunctionName: 'YOUR_SECOND_FUNCTION_NAME',
InvocationType: 'Event', // Ensures asynchronous execution
Payload: JSON.stringify({
... your payload for lambda 2 ...
})
}
await lambda.invoke(params).promise() // Starts Lambda 2
return {
text: "working...",
response_type: "ephemeral",
replace_original: "true"
}        
}

Lambda 2

module.exports = async (event, context) => {
// Use event (payload sent from Lambda 1) and do what you need to do
return axios.post('YOUR_INCOMING_WEBHOOK_URL', {
text: 'this will be sent to slack'
});
}

最新更新