如何调用另一个lambda异步并向其传递上下文?

时间:2017-04-24 13:10:05

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

我正在尝试使用Python2.7运行时为SQS消息处理工作两个基本lambda。一个来自SQS的lambda读取调用并通过上下文将数据传递给另一个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中检查和打印context变量的内容,所以我可以检查CloudWatch中的日志:

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

       logging.error(a)

问题无效,CloudWatch显示用户上下文为空:

('client_context', None)

我已尝试example1example2example3example4

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

ctx = json.dumps(event)

答案 1 :(得分:1)

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

这将与你问题中的代码一起使用:

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

然而,这会将调用更改为同步,这可能是不合需要的。这种行为的原因尚不清楚。