使用死信队列处理 AWS Lambda 错误

obi*_*bie 5 amazon-sqs amazon-web-services aws-lambda

我尝试遵循有关在 AWS 上为我的 Lambda 设置 SQS 死信队列的文档,但我似乎无法将错误传递给它。

我有一个 Lambdaeu-west-2

exports.handler = async (event) => {
    if (event.desire === 'error') {
        throw new Error('dutifully throw an error');
    }
    
    const response = {
        statusCode: 200,
        body: JSON.stringify('Complete the lambda!'),
    };
    return response;
};
Run Code Online (Sandbox Code Playgroud)

将异步调用设置为我的 sqs 队列test-dlq

异步调用设置

我在角色中添加了以下内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": "sqs:*",
            "Resource": "arn:aws:sqs:eu-west-2:123456789:test-dlq"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

(我之前已经这样设置过,"Action": "sqs:SendMessage"但为了简洁起见,我让它更加宽松)

我已经设置了 SQS 队列来接收消息:

在此输入图像描述

我的测试用例有效负载是:

{
    "desire": "error"
}
Run Code Online (Sandbox Code Playgroud)

这会导致 lambda 出错并将错误添加到 CloudWatch 日志,但不会传递到 DLQ。

我是否需要采取任何措施将错误路由到队列,或者我是否配置错误?

Mar*_*cin 7

DLQ 不起作用的原因是使用Test按钮或调用函数:

aws lambda invoke --function-name testFunction --payload '{"desire":"error"}' /tmp/out.json
Run Code Online (Sandbox Code Playgroud)

导致同步调用,而不是异步调用。

要异步调用函数,您必须在 CLI 中使用Event type :

aws lambda invoke --function-name testFunction --invocation-type Event --payload '{"desire":"error"}' /tmp/out.json
Run Code Online (Sandbox Code Playgroud)

  • 对于 AWS CLI v2,您必须添加以下参数:`--cli-binary-format raw-in-base64-out` (4认同)
  • 出色 - 完全有效。请问有什么方法可以同步调用吗? (2认同)