【问题标题】:How to invoke another lambda async and pass context to it?如何调用另一个 lambda 异步并将上下文传递给它?
【发布时间】:2017-04-24 13:10:04
【问题描述】:

我正在尝试使用 Python2.7 运行时来处理两个基本 lambda,以进行 SQS 消息处理。一个 lambda 从 SQS 调用读取数据并通过上下文将数据传递给另一个 lambda。我可以调用另一个 lambda,但其中的用户上下文为空。这是我的 SQS 阅读器 lambda 代码:

import boto3
import base64
import json
import logging

messageDict = {'queue_url': 'queue_url',
       'receipt_handle': 'receipt_handle',
       'body': 'messageBody'}
ctx = {
   'custom': messageDict,
   'client': 'SQS_READER_LAMBDA',
   'env': {'test': 'test'},
}

payload = json.dumps(ctx)
payloadBase64 = base64.b64encode(payload)

client = boto3.client('lambda')
client.invoke(
    FunctionName='LambdaWorker',
    InvocationType='Event',
    LogType='None',
    ClientContext=payloadBase64,
    Payload=payload
)

这就是我尝试检查和打印调用的 lambda 中上下文变量的内容的方式,因此我可以在 CloudWatch 中检查日志:

memberList = inspect.getmembers(context)
    for a in memberList:

       logging.error(a)

问题是没有任何效果,CloudWatch 显示用户上下文为空:

('client_context', None)

我试过example1example2example3example4

有什么想法吗?

【问题讨论】:

    标签: python python-2.7 amazon-web-services lambda boto3


    【解决方案1】:

    我放弃了通过上下文传递数据的尝试。但是,我能够通过 Payload 参数传递数据:

    client.invoke(
        FunctionName='LambdaWorker',
        InvocationType='Event',
        LogType='None',
        Payload=json.dumps(payload)
    )
    

    然后从调用的 lambda 中的事件参数中读取它:

    ctx = json.dumps(event)
    

    【讨论】:

      【解决方案2】:

      问题中的代码非常接近。唯一的问题是 InvocationType 类型:

      这将适用于您问题中的代码:

      client.invoke(
          FunctionName='LambdaWorker',
          InvocationType='RequestResponse',
          LogType='None',
          ClientContext=payloadBase64
      )
      

      但是,这会将调用更改为同步,这可能是不可取的。这种行为的原因尚不清楚。

      【讨论】:

        猜你喜欢
        • 2017-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-31
        • 2020-03-04
        • 2014-04-20
        • 1970-01-01
        • 2021-10-02
        相关资源
        最近更新 更多