我将我的 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 是否都准确无误。此外,开启事件源映射。
- 打开 Lambda 控制台。
- 在导航窗格中,选择函数。
- 选择要检查的函数。
- 选择 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 函数的拒绝规则。
- 打开 Amazon SQS 控制台。
- 在导航窗格中,选择队列。
- 选择相关 SQS 队列,然后选择访问策略选项卡。
- 查看策略中是否存在任何可能阻止 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 消息。
- 打开 Lambda 控制台。
- 在导航窗格中,选择函数。
- 选择要检查的函数。
- 选择 SQS 触发器,然后验证筛选条件。如果触发器配置未显示其密钥名称,则未配置任何筛选器。如果配置了筛选条件,请检查筛选器以确认它允许 Lambda 处理有效消息。要暂时删除筛选条件,请选择编辑。
- 如果在删除筛选器后调用此函数,请修改筛选条件以匹配您的使用案例。
有关更多信息,请参阅使用 Amazon SQS 筛选和Best practices for implementing Lambda event filtering。
相关信息
将 Lambda 与 Amazon SQS 结合使用
为什么我使用 Amazon SQS 事件源的 Lambda 函数没有实现最优扩展?
为什么我的 Lambda 函数重试有效的 Amazon SQS 消息并将它们放入我的死信队列?