AWS SQS + Lambda,在 Lambda 上完成作业后执行 "DeleteMessage" 时出错

AWS SQS + Lambda, get error while executing "DeleteMessage" after doing job on Lambda

我正在使用 "aws/aws-sdk-php": "^3.185" 实施 AWS SQS 作业队列。使用队列命令在我的 VPS 上正确处理作业(拉取作业 -> 处理作业 -> 删除作业):

php artisan queue:work

但在 Lambda 环境中,使用相同的 凭据,作业完成后无法 删除。在shorthand、拉作业-> 处理作业--X--> 删除作业。 以下是错误:

"errorType": "Aws\Sqs\Exception\SqsException",

"errorMessage": "Error executing "DeleteMessage" on "https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxx/SQS-TestJob"; AWS HTTP error: Client error: POST https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxx/SQS-TestJob resulted in a 403 Forbidden response:\n<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">SenderI (truncated...)\n InvalidClientTokenId (client): The security token included in the request is invalid. - <ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">SenderInvalidClientTokenIdThe security token included in the request is invalid.b28151cc-0c42-5eec-be57-08a6207db931"

在可见时间(本例中为 30 秒)后,取消删除消息将再次出现。

应用 bootstrap 时我应该更新令牌吗?

谢谢,

虽然您还没有发布代码,但我怀疑虽然您认为正在使用相同的凭据,但实际上并没有。为了使 lambda 达到 运行,您必须为其分配一个 IAM 角色。当您的代码尝试使用底层 AWS 例程时,它会首先自动搜索以查看是否可以找到凭据。 lambda 服务可以自动为 运行ning lambda 代码提供临时访问密钥和秘密访问密钥,可用于访问分配给 lambda 的 IAM 角色允许访问的 AWS 服务。实际上,出于安全原因,这是 lambda 中的首选方式,因此您不需要硬编码凭据。

简而言之,我将验证分配给 lambda 函数的 IAM 角色是否与您原始凭证的 IAM 用户的权限相匹配。

如果 Amazon SQS 正在触发 AWS Lambda 函数,则函数不应检索或删除 SQS 队列中的消息。

相反,Lambda 函数 将通过 event 变量 提供消息,这取代了从 SQS 队列检索消息的需要。

当 Lambda 函数成功完成且没有错误时,Lambda 服务(运行该函数)将自动从 SQS 队列中删除消息。如果函数 not 成功完成,消息将 not 被删除,这将导致它在隐身期过后重新出现在队列中.

因此,如果 SQS 正在触发 Lambda 函数,那么 Lambda 函数实际上不需要任何权限来访问 Amazon SQS 队列。


相反,如果 AWS Lambda 函数以另一种方式被触发(例如按计划每 5 分钟触发一次),那么 Lambda 函数将负责调用 ReceiveMessage()DeleteMessage().

该函数需要一个有权调用这两个函数的 IAM 角色。

调用 DeleteMessage() 时,函数将传递 ReceiveMessage() 调用期间提供的 ReceiptHandle