【问题标题】:Using a Dead Letter Queue for AWS Lambda Errors对 AWS Lambda 错误使用死信队列
【发布时间】:2021-02-18 15:43:08
【问题描述】:

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

我在eu-west-2 上有一个 Lambda

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;
};

将异步调用设置为我的 sqs 队列 @9​​87654327@

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

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

(我之前已将此设置为"Action": "sqs:SendMessage",但为了简洁起见,它变得更加宽松)

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

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

{
    "desire": "error"
}

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

我需要做些什么来将错误路由到队列还是我配置错误?

【问题讨论】:

  • 你是如何调用你的函数的?
  • 只需使用控制台中lambda函数页面右上角的测试按钮即可。我还尝试在命令行上使用以下内容:aws lambda invoke --function-name testFunction --payload '{"desire":"error"}' /tmp/out.json

标签: amazon-web-services aws-lambda amazon-sqs


【解决方案1】:

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

aws lambda invoke --function-name testFunction --payload '{"desire":"error"}' /tmp/out.json

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

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

aws lambda invoke --function-name testFunction --invocation-type Event --payload '{"desire":"error"}' /tmp/out.json

【讨论】:

  • 非常出色 - 完全有效。请问有没有同步调用的方法?
  • (公平地说,我不知道为什么除了使用“测试”按钮之外这可能有用)
  • @obie 没问题。不使用 --invocation-type Event 时,您已经在同步调用它。
  • 使用 AWS CLI v2,您必须添加以下参数:--cli-binary-format raw-in-base64-out
猜你喜欢
  • 2021-12-19
  • 2020-02-06
  • 2016-08-24
  • 2022-09-29
  • 2019-06-21
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多