首页 > 解决方案 > SQS Lambda 无服务器:Sqs 消息未被消费

问题描述

我使用无服务器框架部署了一个 Python Post API lambda。

代码详情如下:

应用程序.py

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/process', methods=['POST'])
def process():
    content = request.json
    print content
    return jsonify(content)

if __name__ == "__main__":
    app.run()

无服务器.yml

service: my-service
plugins:
  - serverless-python-requirements
  - serverless-wsgi
custom:
  wsgi:
    app: app.app
    packRequirements: false
  pythonRequirements:
    dockerizePip: false
package:
  exclude:
    - node_modules/**
    - venv/**
provider:
  name: aws
  runtime: python2.7
  stage: dev
  region: eu-west-1

functions:
  app:
    handler: wsgi.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'

我将 SQS 配置为触发 lambda。我发送了一条 SQS 消息,触发了 lambda(我从 CloudWatch 中检查了它),但 SQS 消息被卡住了。似乎 SQS 不能被 lambda 消耗。

任何建议表示赞赏

****更新*****

仔细查看CloudWatch后发现有一些异常

u'headers': KeyError
Traceback (most recent call last):
File "/var/task/wsgi.py", line 100, in handler
return serverless_wsgi.handle_request(wsgi_app, event, context)
File "/var/task/serverless_wsgi.py", line 73, in handle_request
headers = Headers(event[u"headers"])
KeyError: u'headers'

标签: pythonamazon-web-servicesaws-lambdaamazon-sqsserverless-framework

解决方案


查看您的日志,Flask 的 WSGI 似乎期待headers您接收的有效负载中的一个节点,如果您的事件是 HTTP 事件,该节点就会存在。当您直接连接两个 AWS 服务时,情况并非如此。每个服务的event对象都不同。由于您不处理 HTTP 请求,我建议您从这个 lambda 中删除 Flask。

您的代码将如下所示:


import json

def process(event,context):
    content = request.json
    print(event)
    return json.dumps(content,ensure_ascii=False)

service: my-service
plugins:
  - serverless-python-requirements
package:
  exclude:
    - node_modules/**
    - venv/**
provider:
  name: aws
  runtime: python2.7
  stage: dev
  region: eu-west-1

functions:
  app:
    handler: app.process
    events:
      - sqs:
          arn: arn:partition:service:region:account-id:resource-id
          batchSize: 1

您的 SQS 队列 ARN 显示在 AWS 控制台上的队列详细信息中。

这是免费阅读:

SLS 和 SQS 队列


推荐阅读