我开始实现一个斜杠命令,这个命令不断演变,最终可能会达到3秒的松弛响应限制。我将serverless-stack与Node和TypeScript一起使用。使用sst (和vscode启动文件),它将调试器挂钩并附加到lambda函数中,这对于调试来说非常简洁。
当命中api端点时,我尝试了各种方法,以发送回确认到slack,做我的事情,并发送回延迟的消息,但没有成功。我没有太多的机会找到关于这方面的信息,但一个很好的来源是这个SO Answer -不幸的是它不能工作。我没有使用request-promise,因为它已经被弃用,并试图用普通的方法实现它(也许这就是我失败的地方?)。但从内部调用第二个lambda函数(就像post的第一个示例一样)似乎不在3秒的限制之内。
我想知道我是不是做错了什么,或者如果attachinf调试器只是长时间等等。然而,在尝试发送延迟的消息之前,它是好的,包括访问和扫描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从来没有解决过,我猜一旦在函数上点击return,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和操作结果数据),并且管理不超时。
欢迎任何建议或帮助。
发布于 2021-06-24 22:31:04
快速附注,我在链接的SO问题的答案中使用了request-promise,因为JS原生Promise对象当时在AWS Lambda的容器上还不可用。
根据我的理解,链接问题中函数的编排与你自己的有一个根本的区别,但我认为你有相同的目标:
>从Slack调用异步操作,一旦结果为,该操作将回发到slack
这是您当前方法的问题: slack向您的(第一个) lambda函数发送一个请求,该函数返回一个对Slack的响应,然后调用第二个lambda函数。
松弛事件是,一旦第一个返回200,就不再接受响应。这就是你的方法和链接的SO问题之间的区别。
所需的方法顺序如下所示:
<代码>H114松弛接收POST请求并将其显示在您为您的webhook选择的频道中。<代码>H215<代码>G216
代码方面,这将如下所示(没有request-promise 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'
});
}https://stackoverflow.com/questions/68101551
复制相似问题