为什么我的将 SQS 配置为事件源的 Lambda 函数没有被调用?

2 分钟阅读
0

我将我的 AWS Lambda 函数配置为处理 Amazon Simple Queue Service(Amazon SQS)队列中的消息。但是我的 Lambda 函数未被调用,也未处理队列中的消息。

解决方法

先决条件

  • 确认将 Lambda 函数配置为使用 Amazon SQS 作为事件源。
  • 确认 Lambda 函数的 AWS Identity and Access Management(IAM)角色是否具有从 SQS 队列中提取消息所需的权限。
  • 检查函数的 Amazon CloudWatch 指标,查看调用情况和 SQS 队列,以确认队列中是否有可用的消息。如果消息不可见或未发送到 SQS 队列,请确保创建者拥有必要的权限。用户或角色必须具有以下 Amazon SQS 和 AWS Key Management Service(AWS KMS)权限:
    sqs:SendMessage
    kms:GenerateDataKey
    kms:Decrypt

**注意:**如果队列未加密,则不需要 AWS KMS 权限。

检查 Lambda 函数和 SQS 队列 URL 是否正确

确认 Lambda 函数的事件源映射中的 Lambda 函数 Amazon 资源名称(ARN)和 SQS 队列 URL 是否都准确无误。此外,开启事件源映射。

  1. 打开 Lambda 控制台
  2. 在导航窗格中,选择函数
  3. 选择要检查的函数。
  4. 选择 SQS 触发器并将其展开,检查 SQS 队列 URL 是否正确。另外,请确认触发器的状态是“已开启”。有关更多信息,请参阅为什么我的 Lambda Amazon SQS 触发器被禁用了?

要执行这些检查,您还可以运行 list-event-source-mapping 命令。

示例:

aws lambda list-event-source-mappings --function-name <my-function> --region <region-name>

**注意:**将 <my-function> 替换为您的 Lambda 函数的名称,然后将 <region name> 替换为您的 AWS 区域。

检查 Lambda 函数的权限

如果 Lambda IAM 角色有权轮询来自 SQS 队列的消息,请检查 SQS 队列的访问策略。寻找可能限制 Lambda 函数的拒绝规则。

  1. 打开 Amazon SQS 控制台
  2. 在导航窗格中,选择队列
  3. 选择相关 SQS 队列,然后选择访问策略选项卡。
  4. 查看策略中是否存在任何可能阻止 Lambda 流量的拒绝策略。如果存在阻止流量的策略,则在相关拒绝语句中添加一个条件以忽略来自 Lambda 的请求。

您的 Lambda 函数 IAM 必须具有以下权限:

  • DeleteMessage
  • GetQueueAttributes
  • ReceiveMessage

检查队列的加密设置

如果此队列已加密,则 Lambda 函数的 IAM 角色需要相关权限才能执行 AWS KMS 操作。如果缺少必要的权限,Lambda 函数将无法使用来自 SQS 队列的消息。如果 Amazon SQS 队列配置了 AWS KMS 加密,请完成以下任务:

  • 确保 AWS KMS 密钥存在。
  • 确保 Lambda 函数角色具有 kms:Decrypt permissions
  • 确保将 AWS KMS 密钥政策权限配置为允许 Lambda 角色执行操作。

**注意:**使用默认密钥(适用于 Amazon SQS 的 AWS KMS 密钥)的 Amazon SQS 队列无法调用另一个 AWS 账户中的 Lambda 函数。

检查特定的 Lambda 函数是否受到限制

Lambda 有区域并发限制。如果该 AWS 区域中的其他函数积极使用此容量并达到了最大值,那么这个函数可能会受到限制。即使这个函数自身未将容量用到最大值,也可能发生这种情况。

如果您在这个函数上将保留并发设置为 0,则不会对这个函数进行任何调用。来自 Amazon SQS 的所有消息都会受到限制。在 Amazon CloudWatch 中查看区域的 ConcurrentExecutions(最大值)指标和此函数的 Throttle(总和)指标。确定是否已达到区域容量限制以及此函数是否受到限制。确保有足够的容量来调用函数和处理 SQS 消息。

确认同一 SQS 队列上没有其他活跃的使用者

如果 SQS 队列中有多个活跃客户,则这些客户可能会取走您的消息。SQS 消息设计为同一时间只有一个客户提取消息。因此,如果有其他客户使用了 SQS 队列,那么您的 Lambda 函数在轮询 SQS 队列时可能收不到任何消息。使用 Amazon SQS 控制台验证没有任何其他 Lambda 调用或没有 Amazon SQS 调用处于活动状态。

**注意:**其他客户可能会以编程方式从 SQS 队列中提取消息。这些取走的消息不会出现在控制台中。

检查 SQS 事件源是否配置了筛选器

检查 SQS 事件源是否配置了任何筛选器。如果您的 SQS 事件源配置了筛选器,请确保不要过滤掉任何 Amazon SQS 消息。

  1. 打开 Lambda 控制台
  2. 在导航窗格中,选择函数
  3. 选择要检查的函数。
  4. 选择 SQS 触发器,然后验证筛选条件。如果触发器配置未显示其密钥名称,则未配置任何筛选器。如果配置了筛选条件,请检查筛选器以确认它允许 Lambda 处理有效消息。要暂时删除筛选条件,请选择编辑
  5. 如果在删除筛选器后调用此函数,请修改筛选条件以匹配您的使用案例。

有关更多信息,请参阅使用 Amazon SQS 筛选Best practices for implementing Lambda event filtering

相关信息

将 Lambda 与 Amazon SQS 结合使用

为什么我使用 Amazon SQS 事件源的 Lambda 函数没有实现最优扩展?

为什么我的 Lambda 函数重试有效的 Amazon SQS 消息并将它们放入我的死信队列?

AWS 官方
AWS 官方已更新 6 个月前