【问题标题】:AWS SQS + Lambda, get error while executing "DeleteMessage" after doing job on LambdaAWS SQS + Lambda,在 Lambda 上执行工作后执行“DeleteMessage”时出错
【发布时间】:2021-07-15 13:24:40
【问题描述】:

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

php artisan queue:work

但使用相同的凭证,在 Lambda 环境中,作业完成后无法删除。简而言之,pull job -> process job --X--> delete job。 以下是错误:

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

“errorMessage”:“在“https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxx/SQS-TestJob”上执行“DeleteMessage”时出错;AWS HTTP 错误:客户端错误:POST https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxx/SQS-TestJob 导致403 Forbidden 响应:\nSenderI (truncated...)\n InvalidClientTokenId (client): The security token included in the request is invalid. - <ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">SenderInvalidClientTokenId请求中包含的安全令牌无效。b28151cc-0c42 -5eec-be57-08a6207db931"

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

应用启动时我应该更新令牌吗?

谢谢,

【问题讨论】:

  • 我不确定 PHP SDK 中的令牌,但通常您不需要从队列中显式删除消息:“Lambda 轮询队列并与包含的事件同步调用您的 Lambda 函数队列消息。Lambda 分批读取消息并为每个批次调用一次您的函数。当您的函数成功处理一个批次时,Lambda 会从队列中删除其消息。"
  • @OleksiiDonoha 我没有在日志中看到它被删除。它一直存在,并且在可见时间之后可用
  • 只有在函数处理完消息成功时才应该删除。尝试删除删除消息的部分功能,看看它是否有效
  • @OleksiiDonoha 它完成了function handle(),没有任何错误
  • SQS 是触发 lambda 还是您从代码中的 SQS 拉取?

标签: php laravel amazon-web-services amazon-sqs jobs


【解决方案1】:

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

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

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

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


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

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

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

【讨论】:

  • 谢谢@John,我明白了。尝试 catch job->fire() ,lambda 按预期运行。
【解决方案2】:

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

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

【讨论】:

  • 我只使用一个 IAM 帐户
  • 您可能只有一个 IAM 用户,但您需要为 lambda 分配一个 IAM 角色才能使其运行。该 IAM 角色将被分配自动轮换您从未见过的访问密钥。确保分配给您的用户的 IAM 策略与 lambda 角色相同。
猜你喜欢
  • 1970-01-01
  • 2022-11-28
  • 2016-06-03
  • 2020-08-07
  • 2016-10-16
  • 2021-01-17
  • 2017-08-16
  • 2020-04-14
  • 2019-07-01
相关资源
最近更新 更多