首页 > 解决方案 > 调用另一个 lambda 传递信息并读取 lambda 上的信息

问题描述

我正在尝试将信息从一个 lambda(函数 1)传递到另一个 lambda(函数 2)。
我知道 boto3 我会用它来调用函数 1

load = {
    'id': 25,
    'Info': 'Information',
}
json_load = json.dumps(load)
response = client.invoke(
    FunctionName='string',
    Payload=json_load,
)

不过,我将如何阅读函数 2 中的 json_load 呢?

标签: pythonamazon-web-servicesaws-lambdaboto3

解决方案


显然你应该使用InvocationType='RequestResponse'和传递数据ClientContext

Lambda.invoke() 不发送客户端上下文 · 问题 #1388 · aws/aws-sdk-js

看起来您需要将要发送的数据放在获得 JSON.stringify 和 base64 编码的对象中的 key custom 下。例如,使用以下客户端代码:

var AWS = require('aws-sdk');
var la = new AWS.Lambda({ region: 'us-west-2' });
var ctx = {
    custom: { foo: 'bar' },
    client: { snap: ['crackle', 'pop']},
    env: { fizz: 'buzz' },
};
la.invoke({
    FunctionName: 'contextPrinter',
    ClientContext: AWS.util.base64.encode(JSON.stringify(ctx)),
    InvocationType: 'RequestResponse',
    Payload: JSON.stringify({ baz: 'quux' })
}, function (err, data) { return console.log(err, data); });

和以下 lambda:

def lambda_handler(event, context):
    print("context", context.client_context)
    print("client", ', '.join(i for i in dir(context.client_context.client) if not i.startswith('__')))
    print("custom", context.client_context.custom)
    print("env", context.client_context.env)

我得到以下日志输出:

('context', <__main__.ClientContext object at 0x7f5705898170>)
('client', 'app_package_name, app_title, app_version_code, app_version_name, installation_id')
('custom', {u'foo': u'bar'})
('env', {u'fizz': u'buzz'})

客户端上下文包含有关客户端的数据,但customorenv键下的数据可用于 lambda 函数。


推荐阅读