在使用 lambda 时,文档说您必须为 ClientContext 发送一个 base64 编码的 JSON 对象。它还说客户端上下文必须是“str”而不是字节。
http://boto3.readthedocs.io/en/latest/reference/services/lambda.html#Lambda.Client.invoke
由于 python3 的 base64 库现在使用字节而不是字符串进行编码 - 这似乎难倒了我。
import boto3
import base64
CLIENT = boto3.client('lambda')
client_context = b'{ "client_name": "Andy"}'
encoded_context = base64.b64encode(client_context)
CLIENT.invoke(
FunctionName='testFunction',
InvocationType='RequestResponse',
LogType='Tail',
ClientContext=encoded_context
)
我得到的错误是:
Invalid type for parameter ClientContext, value: b'eyAiY2xpZW50X25hbWUiOiJGUkVFSFVCIiB9', type: <class 'bytes'>, valid types: <class 'str'>
或者当我设置
str(encoded_context)
时:botocore.errorfactory.InvalidRequestContentException: An error occurred (InvalidRequestContentException) when calling the Invoke operation: Client context must be a valid Base64-encoded JSON object.
提前致谢。
最佳答案
下面的代码是通过 boto3 传递客户端上下文的示例。
import boto3
import base64
import json
client = boto3.client("lambda")
def lambda_context(custom=None,
env=None,
client=None):
client_context = dict(
custom=custom,
env=env,
client=client)
json_context = json.dumps(client_context).encode('utf-8')
return base64.b64encode(json_context).decode('utf-8')
context = {
"custom": {"foo": "bar"},
"env": {"test": "test"},
"client": {}
}
client.invoke(FunctionName="<YOUR_LAMBDA_FUNCTIONS>",
ClientContext=lambda_context(**context),
Payload=YOUR_PAYLOAD)
请注意,客户端上下文 dict 对象中的 env 和 custom 可以是任何东西。对于客户端,只能接受以下 key :
app_version_name
app_title
app_version_code
app_package_name
installation_id
顺便说一句,如果您的 lambda 函数是用 Python 实现的。客户端上下文对象可以称为
context.client_context
。 env( context.cilent_context.env
) 和 custom( context.client_context.custom
) 是两个 dict 对象。如果 env、custom 或 client 中的任何一个未从 boto3 的 invoke 方法传递,则 context.client_context
中相应的将是 None
。关于python-3.x - 使用 boto3 和 python3,我无法为 ClientContext 对 JSON 进行 base64 编码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46095064/