在使用 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/

10-12 03:28