【问题标题】:How to invoke a @app.route function set up in zappa from outside using boto3?如何使用 boto3 从外部调用在 zappa 中设置的@app.route 函数?
【发布时间】:2019-05-20 05:32:40
【问题描述】:

我在 arn:aws:lambda:us-east-1:xxxxx:function:xx-xx-prod 部署了一个 zappa lambda,它提供如下路线:

@app.route('/test', methods=['POST'])
def test():
    response = app.response_class(
      response=get_jsonstr({'test': 'OK'}),
      status=200,
      mimetype='application/json'
    )
    return response

我想像这样从另一个 lambda 函数调用上面的 test() 函数:

client = boto3.client('lambda', region_name='us-east-1')
r = client.invoke(
  FunctionName='arn:aws:lambda:us-east-1:xxxxx:function:xx-xx-prod',
  InvocationType='RequestResponse',
  LogType='None',
  Payload='',
)
print(r)
print(json.loads(r['Payload'].read()))

上面的调用成功如下:

{
  'ResponseMetadata': {
    'RequestId': '37ecc17b-03a9-11e9-9ea0-9dee231dfb79',
    'HTTPStatusCode': 200,
    'HTTPHeaders': {
      'date': 'Wed, 19 Dec 2018 16:14:55 GMT',
      'content-type': 'application/json',
      'content-length': '4',
      'connection': 'keep-alive',
      'x-amzn-requestid': '37ecc17b-03a9-11e9-9ea0-9dee231dfb79',
      'x-amzn-remapped-content-length': '0',
      'x-amz-executed-version': '$LATEST',
      'x-amzn-trace-id': 'root=1-5c1a6e7d-8063e5004eab150d6c967b0;sampled=0'
    },
    'RetryAttempts': 0
  },
  'StatusCode': 200,
  'ExecutedVersion': '$LATEST',
  'Payload': <botocore.response.StreamingBody object at 0x11296ce10>
}
None

如何告诉 zappa 处理程序调用 test() 函数?

更新:

我发现我可以像这样在 zappa_settings.json 中添加一个自定义处理程序:

"lambda_handler": "lambdafilename.test"

然后,我像这样更改了 test():

@app.route('/test', methods=['POST'])
def test(event=None, context=None):
  return json.dumps({'test': 'OK1'})

现在,调用返回预期结果:

{"test": "OK1"}

但是,使用这个自定义处理程序,我失去了 zappa/flask 提供的 WSGI 功能。

【问题讨论】:

    标签: python amazon-web-services aws-lambda zappa


    【解决方案1】:

    我查看了Zappa CLI 的源代码,以了解zappa invoke command 在内部的工作原理,因为这正是我们想要的: 远程以编程方式调用 Zappa lambda 中的特定函数。

    payload = {'command': '<module_path>.lambda_handler_function'}
    client = boto3.client('lambda', region_name='us-east-1')
    client.invoke(
      FunctionName='arn:aws:lambda:<arn>:function:<your_zappa_lambda_name>',
      InvocationType='RequestResponse',
      LogType='Tail',
      Payload=json.dumps(payload),
    )
    

    请记住,您的函数必须接受 lambda eventcontext 才能成为有效的入口点。

    有关zappa invoke 命令如何工作的更多信息:

    if command == 'invoke'

    command = {key: function_name}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2013-01-23
      • 2011-01-23
      • 2018-05-27
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多